打印:DC画图,打印设置等

来源:互联网 发布:嵌入式linux培训 编辑:程序博客网 时间:2024/05/16 00:46
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字体文件的说明给我发过来吗?bluebohe@163.com或者AutoCAD的帮助中的关于字体文件格式的一个帮助文件,我这里没有AutoCAD。

好吧,谢谢
大多数TrueType字体并不是文字充满字模空间的,所以如果按照字模的高度去显示文字的话,可能文字就要小很多,想改大了并非不可以,但是因为前面已经发布了一些版本,好多文字就是按照小字写的,所以为了文字的标准,就添加了单线体