关于打印的问题??

Jack128 2004-01-09 01:58:52
在基于对话框的程序里,怎么打印一个固定的位图文件??
...全文
90 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
flinming 2004-01-12
  • 打赏
  • 举报
回复
int nWidth=pDC->GetDeviceCaps(HORZRES);
int nHeight=pDC->GetDeviceCaps(VERTRES);
Jack128 2004-01-12
  • 打赏
  • 举报
回复
怎么得到打印机宽度??
bluebohe 2004-01-12
  • 打赏
  • 举报
回复
double dScaleX,double dScaleY
打印机dc和屏幕dc分辨率比,在你不指定位图打印的高度和宽度的时候,这个比例可以让你打印和屏幕显示大小相等的位图
iWidth=0,int iLength=0
位图显示高度和宽度
int iX,int iY,
位图显示左上角坐标
Jack128 2004-01-12
  • 打赏
  • 举报
回复
请问第二个函数 参数的含义是什么??
bluebohe 2004-01-09
  • 打赏
  • 举报
回复
呵呵,你的要求就是打印文件哦,那上面第一个函数是可以的
iLogPixelX
iLogPixelY可以设置成96,屏幕的分辨率
bluebohe 2004-01-09
  • 打赏
  • 举报
回复
呵呵,错了,拿错函数了,上面是打印BMP文件的
void Draw(HDC hDC,HBITMAP hBmp,double dScaleX,double dScaleY,int iX,int iY,int iWidth=0,int iLength=0)
{
HPALETTE hPal;
BITMAP bm;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
DWORD dwLen;
HANDLE hDIB;
HANDLE handle;
HDC hDC1;
if(GetDeviceCaps(hDC,RASTERCAPS) & RC_PALETTE )
{
UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * 256);
LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];
pLP->palVersion = 0x300;
pLP->palNumEntries =GetSystemPaletteEntries( hDC, 0, 255, pLP->palPalEntry );
hPal=CreatePalette(pLP );
delete[] pLP;
}
if (hPal==NULL) hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE);
::GetObject(hBmp,sizeof(bm),(LPSTR)&bm);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bm.bmWidth;
bi.biHeight = bm.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = bm.bmPlanes * bm.bmBitsPixel;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
int nColors = (1 << bi.biBitCount);
if( nColors > 256 )
nColors = 0;
dwLen = bi.biSize + nColors * sizeof(RGBQUAD);
hDC1 = ::GetDC(NULL);
hPal = SelectPalette(hDC1,hPal,FALSE);
RealizePalette(hDC1);
hDIB = GlobalAlloc(GMEM_FIXED,dwLen);
if (!hDIB)
{
SelectPalette(hDC1,hPal,FALSE);
::ReleaseDC(NULL,hDC1);
DeleteObject(hPal);
return ;
}
lpbi = (LPBITMAPINFOHEADER)hDIB;
*lpbi = bi;
::GetDIBits(hDC1, hBmp, 0L, (DWORD)bi.biHeight,
(LPBYTE)NULL, (LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS);
bi = *lpbi;
if (bi.biSizeImage == 0)
bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8)* bi.biHeight;
dwLen += bi.biSizeImage;
if (handle = GlobalReAlloc(hDIB, dwLen, GMEM_MOVEABLE))
hDIB = handle;
else
{
GlobalFree(hDIB);
SelectPalette(hDC1,hPal,FALSE);
::ReleaseDC(NULL,hDC1);
DeleteObject(hPal);
return ;
}
lpbi = (LPBITMAPINFOHEADER)hDIB;
BOOL bGotBits = GetDIBits( hDC1, hBmp,0L,(DWORD)bi.biHeight,(LPBYTE)lpbi+ (bi.biSize + nColors * sizeof(RGBQUAD)),
(LPBITMAPINFO)lpbi,(DWORD)DIB_RGB_COLORS);
if( !bGotBits )
{
GlobalFree(hDIB);
SelectPalette(hDC1,hPal,FALSE);
::ReleaseDC(NULL,hDC1);
DeleteObject(hPal);
return;
}
if(iWidth==0||iLength==0)
{
iWidth=lpbi->biWidth;
iLength=lpbi->biHeight;
iWidth=(int)(dScaleX*iWidth);
iLength=(int)(iLength*dScaleY);
}
StretchDIBits(hDC,iX,iY,iWidth,iLength,0,0,lpbi->biWidth,lpbi->biHeight,(LPBYTE)lpbi // address for bitmap bits
+ (bi.biSize + nColors * sizeof(RGBQUAD)),(LPBITMAPINFO)lpbi,DIB_RGB_COLORS,SRCCOPY);
SelectPalette(hDC1,hPal,FALSE);
::ReleaseDC(NULL,hDC1);
DeleteObject(hDIB);
DeleteObject(hPal);
}
bluebohe 2004-01-09
  • 打赏
  • 举报
回复
假设你能得到一个打印机的dc
void DrawBMP(CDC* pDC,int iLogPixelX,int iLogPixelY,const char *strFileName)
{
CDC MemDC; // 内存设备环境指针,在视的整个存在过程都将存在
CBitmap Bitmap,*pOldBmp;
CRect Source, Dest; // 记录源位图尺寸和最终显示尺寸
BITMAP bm;
if(MemDC.GetSafeHdc() == NULL)
{
HBITMAP hbitmap=(HBITMAP)LoadImage(0,strFileName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
Bitmap.Attach(hbitmap);
MemDC.CreateCompatibleDC(pDC);
Bitmap.GetObject(sizeof(bm),&bm);
pOldBmp=MemDC.SelectObject(&Bitmap);
Source.top=0;
Source.left=0;
Source.right= bm.bmWidth;
Source.bottom = bm.bmHeight;
Dest = Source;
}
pDC->DPtoLP(&Dest);
if(pDC->IsPrinting())
{
Dest.left=(int)(Dest.left*((double)pDC->GetDeviceCaps(LOGPIXELSX))/iLogPixelX);
Dest.right=(int)(Dest.right*((double)pDC->GetDeviceCaps(LOGPIXELSX))/iLogPixelX);
Dest.top=(int)(Dest.top*((double)pDC->GetDeviceCaps(LOGPIXELSY))/iLogPixelY);
Dest.bottom=(int)(Dest.bottom*((double)pDC->GetDeviceCaps(LOGPIXELSY))/iLogPixelY);
}
pDC->StretchBlt(Dest.left, Dest.top, Dest.right, Dest.bottom,
&MemDC, Source.left, Source.top, Source.right,Source.bottom, SRCCOPY);
MemDC.SelectObject(pOldBmp);
Bitmap.DeleteObject();
MemDC.DeleteDC();
return;
}
Jack128 2004-01-09
  • 打赏
  • 举报
回复
这样打出来 很小,怎么控制它的大小呢??
Jack128 2004-01-09
  • 打赏
  • 举报
回复
CDC * mDC;
CClientDC dc(this);

HBITMAP HBitmap=(HBITMAP)::LoadImage(NULL,"mybmpPath",
IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION|LR_SHARED);
mDC->CreateCompatibleDC(&dc);
mDC->SelectObject(HBitmap);

HDC hdcprint; // 定义一个设备环境句柄
static DOCINFO di={sizeof(DOCINFO),"printer",NULL}; //定义一个打印作业
GetProfileString("windows","device",",,,",szprinter,80); // 得到设备字符串存入数组szprinter中
// 将设备字符串分解
if(NULL!=(szDevice=strtok(szprinter,","))&&NULL!=(szDriver=strtok(NULL,","))&&NULL!=(szOutput=strtok(NULL,",")))
if((hdcprint=CreateDC(szDriver,szDevice,szOutput,NULL))!=0)// 创建一个打印机设备句柄
{
if(StartDoc(hdcprint,&di)>0) //开始执行一个打印作业
{
StartPage(hdcprint); //打印机走纸,开始打印
SaveDC(hdcprint); //保存打印机设备句柄
SelectObject(hdcprint,HBitmap);
BitBlt(hdcprint,0,0,600,249,mDC->GetSafeHdc(),0,0,SRCCOPY);
RestoreDC(hdcprint,-1); //恢复打印机设备句柄
EndPage(hdcprint); //打印机停纸,停止打印
EndDoc(hdcprint); //结束一个打印作业
MessageBox("打印完毕!","提示",MB_ICONINFORMATION);
}
}
DeleteDC(hdcprint);// 用API函数DeleteDC销毁一个打印机设备句柄
}


这样行吗??
abrams 2004-01-09
  • 打赏
  • 举报
回复
和打印到屏幕一样,只是hdc不同,屏幕是屏幕dc,打印机是打印机dc
bitblt就可以了
zhangcrony 2004-01-09
  • 打赏
  • 举报
回复
要專門建個類或者引個類來處理打印問題﹗
windyloft 2004-01-09
  • 打赏
  • 举报
回复
mark

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧