打印:DC画图,打印设置等
来源:互联网 发布:嵌入式linux培训 编辑:程序博客网 时间:2024/05/16 00:46
但就是 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_COPIEST:有没有办法按打印按钮时不弹出那个打印对话框,而直接打印?(前提我已知道打印机的名字)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字体并不是文字充满字模空间的,所以如果按照字模的高度去显示文字的话,可能文字就要小很多,想改大了并非不可以,但是因为前面已经发布了一些版本,好多文字就是按照小字写的,所以为了文字的标准,就添加了单线体
- 打印:DC画图,打印设置等
- JS 打印功能代码(包括打印预览、打印设置等)
- 在网页上打印时用javascript设置打印区域和不打印区域,分页等
- 网站开发进阶(十二)JS实现打印功能(包括打印预览、打印设置等)
- 网站开发进阶(十二)JS实现打印功能(包括打印预览、打印设置等)
- 打印设置
- javascript 实现打印,打印预览,打印设置
- JavaScript 实现打印,打印预览,打印设置
- javascript 实现打印,打印预览,打印设置
- 页面设置、打印预览、打印
- 打印过程中修改打印机设置orientation等
- WebBrowser.ExecWB的完整实例,打印页面、页面设置、打印预览、另存为、属性等
- WebBrowser.ExecWB的完整实例,打印页面、页面设置、打印预览、另存为、属性等
- vc 画图与打印 学习笔记
- web中的打印 table打印等功能 区域打印
- 打印
- 打印
- 打印
- Tomcat配置技巧Top 10
- 字符串转换:wchar_t MultiByteToWideChar Unicode等
- 十年后,你在哪里
- 数据库:连接字符串,操作等
- 哈佛家训- -
- 打印:DC画图,打印设置等
- 晋升并非惟一的通道
- 人生可以很简单- -
- 学会和同事相处的30个原则- -
- 人格的核心是自信- -
- 链接1:文章,总结,代码等
- 让人感动的几句英语- -
- 链接2:文章,总结,代码等
- 看很多人要求目录树,我的代码可以满足大多数要求 作 者: flyxxxxx (灭神)