向打印DC 里 BitBlt or StretchBlt

解决方案 »

  1.   

    我的回答是假定你已经可以显示位图了!显示和打印的区别在于,分辨率的差别----打印机与屏幕的分辨率是不一样的!
    其中cyDIB和cxDIB是位图的高度和宽度.
    int cxPage = pDC->GetDeviceCaps(HORZRES);
    int cyPage = pDC->GetDeviceCaps(VERTRES);
    // get printer pixels per inch
    int cxInch = pDC->GetDeviceCaps(LOGPIXELSX);
    int cyInch = pDC->GetDeviceCaps(LOGPIXELSY);
    rcDest.top = rcDest.left = 0;
    rcDest.bottom = (int)(((double)cyDIB * cxPage * cyInch)/ ((double)cxDIB * cxInch));
    rcDest.right = cxPage;如果还有问题,请与我联系,非常愿意与你讨论!
      

  2.   

    有两点建议:
    1:不要使用绝对坐标,例如CRect(0, 0, 500, 500),这样,现实的时候可能一切正常,但是你可以试一试预览或者打印出来。因为显示器的分辨率和打印机的分辨率不同。
    2:不要使用BitBlt、StreatchBlt,他们同设备相关。尤其是后者,打出来的图形有相当大的锯齿。应该使用SetDIBitsToDevice等设备无关函数。