T: | 打印图标的问题 |
Q: | DrawIconEx 可以显示到屏幕上,打印其他图形也行, 但就是 DrawIconEx 往打印机上打不出来,为何? |
A: | 这个有点难,你要先把图标华在一个dc上,然后从这个dc得到一个位图,然后把位图转化成DIB位图,然后用StretchDIBits打印 |
T: | 打印??在线等待。 |
Q: | HANDLE hPRN = CreateFile("prn"...); if(hPRN) { WriteFile(hPRN, "asdf中文asdf"...) CloseHandle(hPRN); } 为什么打印时"中文"两个子没有打印出来!? |
A: | 向楼上说的那样,你要得到这个打印机的DC,然后在DC上面写写画画,,然或结束打印就OK拉,建议你跟踪进去OnPrint等函数,就能知道Windows是怎样打印的了 |
T: | 如何让CPrintDialog 一打开就选种 |
Q: | LandScape的纸行 |
A: | CPrintDialog的m_pPD成员的一个什么mode参数可以改变,具体代码我回家后看看,现在没有VC m_pd->hDevMode中的dmOrientation设为DMORIENT_LANDSCAPE试试 |
T: | 怎样读取或更改“打印设置”里的内容,比如纸张大小,横向,纵向? |
Q: | 我想用程序更改纸张方向和选择纸张大小怎么实现?谢谢! |
A: | /* 设置系统打印模式 #define DMORIENT_PORTRAIT 1 //纵向 #define DMORIENT_LANDSCAPE 2 //横向 */ /************************************************************************/ void SetLandscapeMode(int PrintMode) { PRINTDLG pd; pd.lStructSize=(DWORD)sizeof(PRINTDLG); BOOL bRet=AfxGetApp()->GetPrinterDeviceDefaults(&pd); if(bRet) { // protect memory handle with ::GlobalLock and ::GlobalUnlock DEVMODE FAR *pDevMode=(DEVMODE FAR *)::GlobalLock(pd.hDevMode); // set orientation to landscape if(PrintMode==1)//纵向打印 pDevMode->dmOrientation=DMORIENT_PORTRAIT; else if(PrintMode==2)//横向打印 pDevMode->dmOrientation=DMORIENT_LANDSCAPE; ::GlobalUnlock(pd.hDevMode); } } pDevMode的其它成员变量可以控制纸张大小 |
T: | 通过位图的句柄打印位图(高分等待,不够再给) |
Q: | 小弟有难,请大侠们帮忙,得到了一个位图的句柄,如何打印 |
A: | 一个打印位图的例子 View类添加成员 CDC m_MemDC; // 内存设备环境指针,在视的整个存在过程都将存在 CBitmap m_Bitmap; CSize m_szSource, m_szDest; // 记录源位图尺寸和最终显示尺寸 ———————————————————————————————————————— int CPrintBmpView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CScrollView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here BITMAP bm; if(m_MemDC.GetSafeHdc() == NULL) { CClientDC dc(this); m_Bitmap.LoadBitmap(IDB_BITMAP1); m_MemDC.CreateCompatibleDC(&dc); m_MemDC.SelectObject(&m_Bitmap); m_Bitmap.GetObject(sizeof(bm),&bm); m_szSource.cx = bm.bmWidth; m_szSource.cy = bm.bmHeight; m_szDest = m_szSource; dc.DPtoLP(&m_szDest); } return 0; } ——————————————————————————————————————————— void CPrintBmpView::OnInitialUpdate() { CScrollView::OnInitialUpdate(); CSize sizeTotal; sizeTotal.cx = 800; sizeTotal.cy = 1050; CSize sizeLine = CSize(sizeTotal.cx / 100, sizeTotal.cy / 100); SetScrollSizes(MM_LOENGLISH, sizeTotal, sizeTotal, sizeLine); } ———————————————————————————————————————————— void CPrintBmpView::OnDraw(CDC* pDC) { CPrintBmpDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here pDC->StretchBlt(100, -100, m_szDest.cx, -m_szDest.cy, &m_MemDC, 0, 0, m_szSource.cx, m_szSource.cy, SRCCOPY); } ———————————————————————————————————————————— void CPrintBmpView::OnDestroy() { CScrollView::OnDestroy(); // TODO: Add your message handler code here m_Bitmap.DeleteObject(); m_MemDC.DeleteDC(); } |
T: | 非常简单的打印问题! |
Q: | 我现在要打印图形可视部分的打印,应该怎么做啊? 图形是在0.1mm模式下绘制的,在OnPrint()函数中把映射模式改为MM_TWIPS, 如果我没有添加什么代码的话,程序就是出图形最做上角的那部分,但是我只要打印可以看见的那部分,我用InvalidateRect()函数,可是没有什么变化?这个到底应该怎么弄呢? |
A: | 我觉得最好打印和绘图的绘图模式一致,并且都不是MM_TEXT,这样的话就用不着坐标转换了,否则的话,你可以记下可视部分的打印区域,打印时使用CDC::SelectClipRgn设置打印区域,基本就是这样子吧 |
T: | 请问各位高手,怎么把视图变为一个BMP文件? |
Q: | 我想把我的视图变为一个BMP文件,我该如何办呢?请各位大侠教教我,最好有源码相送 |
A: | 前几天你的那几个打印的问题解决了吧? 下面两个函数中一个是得到dc的位图,一个是把位图保存为文件,记得给分哦:) hDC传入视图的pDC->GetSafeHdc()即可 HBITMAP GetSrcBit(HDC hDC,DWORD BitWidth, DWORD BitHeight) { HDC hBufDC; HBITMAP hBitmap, hBitTemp; //创建设备上下文(HDC) hBufDC = CreateCompatibleDC(hDC); //创建HBITMAP hBitmap = CreateCompatibleBitmap(hDC, BitWidth, BitHeight); hBitTemp = (HBITMAP) SelectObject(hBufDC, hBitmap); //得到位图缓冲区 StretchBlt(hBufDC, 0, 0, BitWidth, BitHeight, hDC, 0, 0, BitWidth, BitHeight, SRCCOPY); //得到最终的位图信息 hBitmap = (HBITMAP) SelectObject(hBufDC, hBitTemp); //释放内存 DeleteObject(hBitTemp); ::DeleteDC(hBufDC); return hBitmap; } BOOL SaveBmp(HBITMAP hBitmap, CString FileName) { //设备描述表 HDC hDC; //当前分辨率下每象素所占字节数 int iBits; //位图中每象素所占字节数 WORD wBitCount; //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数 DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0; //位图属性结构 BITMAP Bitmap; //位图文件头结构 BITMAPFILEHEADER bmfHdr; //位图信息头结构 BITMAPINFOHEADER bi; //指向位图信息头结构 LPBITMAPINFOHEADER lpbi; //定义文件,分配内存句柄,调色板句柄 HANDLE fh, hDib, hPal,hOldPal=NULL; //计算位图文件每个像素所占字节数 hDC = CreateDC("DISPLAY", NULL, NULL, NULL); iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); DeleteDC(hDC); if (iBits <= 1) wBitCount = 1; else if (iBits <= 4) wBitCount = 4; else if (iBits <= 8) wBitCount = 8; else wBitCount = 24; GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap); bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = Bitmap.bmWidth; bi.biHeight = Bitmap.bmHeight; bi.biPlanes = 1; bi.biBitCount = wBitCount; bi.biCompression = BI_RGB; bi.biSizeImage = 0; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrImportant = 0; bi.biClrUsed = 0; dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight; //为位图内容分配内存 hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER)); lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib); *lpbi = bi; // 处理调色板 hPal = GetStockObject(DEFAULT_PALETTE); if (hPal) { hDC = ::GetDC(NULL); hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE); RealizePalette(hDC); } // 获取该调色板下新的像素值 GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) +dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS); //恢复调色板 if (hOldPal) { ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); RealizePalette(hDC); ::ReleaseDC(NULL, hDC); } //创建位图文件 fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (fh == INVALID_HANDLE_VALUE) return FALSE; // 设置位图文件头 bmfHdr.bfType = 0x4D42; // "BM" dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize; bmfHdr.bfSize = dwDIBSize; bmfHdr.bfReserved1 = 0; bmfHdr.bfReserved2 = 0; bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize; // 写入位图文件头 WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); // 写入位图文件其余内容 // WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL); //清除 GlobalUnlock(hDib); GlobalFree(hDib); CloseHandle(fh); return TRUE; } |
T: | 如何控制打印机的进纸长度 |
Q: | 小弟在做VC关于打印的时候,发现通过pDC指针可以控制走纸的页数 可是怎么控制走纸的长度啊,譬如纸张的长度是8*13/2的,小弟很着急,希望那位高手可以帮小地解决. |
A: | 首先你可以通过自定义纸张大小(改变DEVMODE的下列成员) DWORD dmFields; short dmOrientation; short dmPaperSize; short dmPaperLength; short dmPaperWidth; 这也要打印机驱动的支持,如果打印机支持卷筒纸或自定义纸张大小的话就没问题,否则………… //设备描述表 |
T: | 打印设置问题!急急急急急急急急!!!! |
Q: | 打印时不弹出打印对话框,打印页面的大小等参数由程序中设定 页面大小不是标准的纸张,打印机是网络中的打印机。 不知那为兄弟能够解决,最好有源码,分不够可以在加 |
A: | 下面的程序可以通过改变pDevMode成员改变纸张大小 void SetLandscapeMode(int PrintMode) { PRINTDLG pd; pd.lStructSize=(DWORD)sizeof(PRINTDLG); BOOL bRet=AfxGetApp()->GetPrinterDeviceDefaults(&pd); if(bRet) { // protect memory handle with ::GlobalLock and ::GlobalUnlock DEVMODE FAR *pDevMode=(DEVMODE FAR *)::GlobalLock(pd.hDevMode); // set orientation to landscape if(PrintMode==1)//纵向打印 pDevMode->dmOrientation=DMORIENT_PORTRAIT; else if(PrintMode==2)//横向打印 pDevMode->dmOrientation=DMORIENT_LANDSCAPE; ::GlobalUnlock(pd.hDevMode); } } 呵呵,发现我的代码终于也被别人传来传去了,好现象 |
T: | 200分在线等待:如何取得打印机打印的时候设置的“每sheet打几页”(一张纸打几页) |
Q: | 用getjob得到的结构devmode中好象都不是啊。大侠帮忙 |
A: | dmCopies; 并且dmFields=dmFields|DM_COPIES |
T: | 有没有办法按打印按钮时不弹出那个打印对话框,而直接打印?(前提我已知道打印机的名字) |
Q: | 谢谢 我是不想让他设置打印机,而用我所确定的打印机帮他打印, 所以想屏蔽掉那个打印对话框,有什么办法吗??? |
A: | 以下代码摘自bluebohe(薄荷)发给我的。 回复人: bluebohe(薄荷) ( ) 信誉:127 2003-12-22 12:53:00 得分:0 void PrintTest() { CPrintDialog pd(FALSE, PD_ALLPAGES | PD_COLLATE | PD_NOPAGENUMS | PD_HIDEPRINTTOFILE); if(pd.GetDefaults()) { DOCINFO di; memset( &di, 0, sizeof(DOCINFO) ); di.cbSize = sizeof(DOCINFO); di.lpszDocName = "Printing Test"; di.lpszOutput = (LPTSTR) NULL; di.fwType = 0; HDC hDC=pd.CreatePrinterDC(); CDC dc; dc.Attach(hDC); dc.StartDoc(&di); dc.StartPage(); dc.MoveTo(0,0); dc.LineTo(1000,1000); dc.EndPage(); dc.EndDoc(); dc.DeleteDC(); } } |
T: | 一千分求教,在线等待。如何使TrueType中文字体无论大小均按单线条笔画显示和打印? |
Q: | 一个TrueType中文字体,如何使其不管字高如何,字体的笔画总是单线条,像AutoCAD的效果一样?英文字体的情况已能解决,但中文TrueType中似乎含有位图,不能解决,请指教。在线等待,一千分候教,分页给分。 |
A: | 如果做出来的话,我也给你一千分 我这里有读AutoCAD字体的程序 另外,英文你是怎么解决的? 我做了三年也没做出来……最后只能用单线体 你能把AutoCAD字体文件的说明给我发过来吗?[email protected]或者AutoCAD的帮助中的关于字体文件格式的一个帮助文件,我这里没有AutoCAD。 好吧,谢谢 大多数TrueType字体并不是文字充满字模空间的,所以如果按照字模的高度去显示文字的话,可能文字就要小很多,想改大了并非不可以,但是因为前面已经发布了一些版本,好多文字就是按照小字写的,所以为了文字的标准,就添加了单线体 |