如何在打印机上使用SetPixelV(SetPixel)函数?
程序如下:
CPrintDialog dlg(FALSE);
if (dlg.GetDefaults())
{
HDC hdc = dlg.CreatePrinterDC();
CDC dc;
dc.Attach(hdc);
if (dc.StartDoc("ST_Curve Print") > 0)
{
if (dc.StartPage() >= 0)
{
dc.SetPixelV(100, 100, (COLORREF) 0);
dc.SetPixelV(110, 110, (COLORREF) 0);
dc.SetPixelV(120, 120, (COLORREF) 0);
dc.SetPixelV(130, 130, (COLORREF) 0);
dc.SetPixelV(140, 140, (COLORREF) 0);
dc.SetPixelV(150, 150, (COLORREF) 0);
dc.EndPage();
}
dc.EndDoc();
}
GlobalFree(dlg.m_pd.hDevMode);
GlobalFree(dlg.m_pd.hDevNames);
}
我的打印机应该是支持这两个函数的,可是就是打不出点来,我判断了一下SetPixelV
函数的执行情况,也是成功的,GetDeviceCaps(RASTERCAPS)返回28313,RC_BITBLT定义
为1,按照MSDN中说的,应该支持这两函数。
问题点数:30、回复次数:4Top
1 楼sunrise(日出江花红胜火)回复于 2005-06-27 20:11:37 得分 30
我估计是打印的点太小了,看不见,现在的打印机的分辨率很高,一个像素点太小了。你用循环语句画一条一英寸的线试验一下(可以画10-20个像素宽度的)。Top
2 楼yang79tao()回复于 2005-06-27 21:11:50 得分 0
我用的是MM_ANISOTROPIC映射模式,窗口与打印机窗口完全按比例,所以屏幕上如何输出,理论上(有误差)是所见即所得的。
画线当然是可以的,我试过了。另外想说明一点,画线(那怕1象素长)也是和SetPixelV不一样的,后者使用的是光栅操作,速度快,实现原理也应该不一样。Top
3 楼yang79tao()回复于 2005-06-27 21:13:07 得分 0
int ViewWidth = pdc->GetDeviceCaps(PHYSICALWIDTH) -
2 * pdc->GetDeviceCaps(PHYSICALOFFSETX) - LeftMargin - RightMargin;
int ViewHeight = pdc->GetDeviceCaps(PHYSICALHEIGHT) -
2 * pdc->GetDeviceCaps(PHYSICALOFFSETY) - TopMargin - BottomMargin;
int WinWidth = 96 * ViewWidth / pdc->GetDeviceCaps(LOGPIXELSX);
int WinHeight = 96 * ViewHeight / pdc->GetDeviceCaps(LOGPIXELSY);
pdc->SetMapMode(MM_ANISOTROPIC);
pdc->SetWindowExt(WinWidth, WinHeight);
pdc->SetViewportExt(ViewWidth, ViewHeight);
pdc->SetViewportOrg(LeftMargin, TopMargin);
上面是映射模式。Top
4 楼yang79tao()回复于 2005-06-28 19:21:14 得分 0
dingTop




