C++ MFC打印位图仅以黑色打印

C++ MFC打印位图仅以黑色打印,c++,printing,bitmap,mfc,C++,Printing,Bitmap,Mfc,我有下面的方法来打印位图,它确实工作得很好,但现在它将位图区域全部打印为黑色。我已经在另一台电脑上测试了在我的电脑上编译的测试应用程序,它完美地打印了位图。我已经调试过了,它正在打开位图文件,因为它读取的尺寸正确。我不知道发生了什么,任何建议都将不胜感激。提前谢谢 void CTestAppPrintDlg::OnBnClickedButton1() { CString path; path = "Test1.bmp"; PrintBitmap(p

我有下面的方法来打印位图,它确实工作得很好,但现在它将位图区域全部打印为黑色。我已经在另一台电脑上测试了在我的电脑上编译的测试应用程序,它完美地打印了位图。我已经调试过了,它正在打开位图文件,因为它读取的尺寸正确。我不知道发生了什么,任何建议都将不胜感激。提前谢谢

void CTestAppPrintDlg::OnBnClickedButton1()
{

    CString path;

    path = "Test1.bmp";
    PrintBitmap(path);
} 

void CTestAppPrintDlg::PrintBitmap(LPCTSTR filename) {
CPrintDialog printDlg(FALSE);
printDlg.GetDefaults();
  return; 
CDC dc;
if (!dc.Attach(printDlg.GetPrinterDC())) {
    AfxMessageBox(_T("No printer found!")); return;
}

dc.m_bPrinting = TRUE;
DOCINFO di;
// Initialise print document details
::ZeroMemory(&di, sizeof(DOCINFO));
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = filename;
BOOL bPrintingOK = dc.StartDoc(&di); // Begin a new print job 
// Get the printing extents
// and store in the m_rectDraw field of a 
// CPrintInfo object
CPrintInfo Info;
Info.SetMaxPage(1); // just one page 
int maxw = dc.GetDeviceCaps(HORZRES);
int maxh = dc.GetDeviceCaps(VERTRES);
Info.m_rectDraw.SetRect(0, 0, maxw, maxh);
for (UINT page = Info.GetMinPage(); page <=
    Info.GetMaxPage() && bPrintingOK; page++) {
    dc.StartPage();    // begin new page
    Info.m_nCurPage = page;
    CBitmap bitmap;
    // LoadImage does the trick here, it creates a DIB section
    // You can also use a resource here
    // by using MAKEINTRESOURCE() ... etc. 
    if (!bitmap.Attach(::LoadImage(
        ::GetModuleHandle(NULL), filename, IMAGE_BITMAP, 0, 0,
        LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE))) {
        AfxMessageBox(_T("Error loading bitmap!")); return;
    }
    BITMAP bm;
    bitmap.GetBitmap(&bm);
    int w = bm.bmWidth;
    int h = bm.bmHeight;
    // create memory device context
    CDC memDC;
    memDC.CreateCompatibleDC(&dc);
    CBitmap *pBmp = memDC.SelectObject(&bitmap);
    memDC.SetMapMode(dc.GetMapMode());
    dc.SetStretchBltMode(HALFTONE);
    // now stretchblt to maximum width on page
    dc.StretchBlt(0, 0, w, h, &memDC, 0, 0, w, h, SRCCOPY);
    // clean up
    memDC.SelectObject(pBmp);
    bPrintingOK = (dc.EndPage() > 0);   // end page
}
if (bPrintingOK)
    dc.EndDoc(); // end a print job
else dc.AbortDoc();           // abort job. 
void CTestAppPrintDlg::OnBnClickedButton1()
{
CString路径;
path=“Test1.bmp”;
打印位图(路径);
} 
void CTestAppPrintDlg::PrintBitmap(LPCTSTR文件名){
CPrintDialog printDlg(假);
printDlg.GetDefaults();
返回;
疾病控制中心;
如果(!dc.Attach(printDlg.GetPrinterDC())){
AfxMessageBox(_T(“未找到打印机”);返回;
}
dc.m_b打印=真;
DOCINFO di;
//初始化打印文档详细信息
::零内存(&di,sizeof(DOCINFO));
di.cbSize=sizeof(DOCINFO);
di.lpszDocName=文件名;
BOOL bPrintingOK=dc.StartDoc(&di);//开始新的打印作业
//获取打印范围
//并存储在
//cpritinfo对象
CPrintInfo信息;
Info.SetMaxPage(1);//仅一页
int maxw=dc.GetDeviceCaps(HORZRES);
int maxh=dc.GetDeviceCaps(VERTRES);
Info.m_rectDraw.SetRect(0,0,maxw,maxh);
对于(UINT page=Info.GetMinPage();第0页);//结束页
}
if(bPrintingOK)
dc.EndDoc();//结束打印作业
else dc.AbortDoc();//中止工作。

}感谢给我负面评价的人。这很有帮助


我发现这与我的代码无关,原因是Windows更新。我卸载了此更新,它现在可以工作了。

很抱歉,你能让它工作吗。但更新的目的是改进系统,使其更加安全。因此,您可能需要进一步调查。它让我想起了一些在电脑上运行的保护隐私的应用程序,当你试图抓取屏幕时,它们会“遮住”视图。也许反病毒的某些设置也会这样做。我知道你说的反对票是什么意思。我不认为它们在IMHO中有用。通过评论进行建设性的批评要好得多。但我想反对票确实有作用。有些问题有时真的很糟糕。:)感谢您的回复,windows update KB5000802在打印和打印机驱动程序方面存在已知问题,Microsoft已发布更新以更正此问题