在基于对话框的程序里,怎么打印一个固定的位图文件??

解决方案 »

  1.   

    和打印到屏幕一样,只是hdc不同,屏幕是屏幕dc,打印机是打印机dc
    bitblt就可以了
      

  2.   

    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销毁一个打印机设备句柄 
    }
    这样行吗??
      

  3.   

    假设你能得到一个打印机的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;
    }
      

  4.   

    呵呵,错了,拿错函数了,上面是打印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);
    }
      

  5.   

    呵呵,你的要求就是打印文件哦,那上面第一个函数是可以的
    iLogPixelX
    iLogPixelY可以设置成96,屏幕的分辨率
      

  6.   

    double dScaleX,double dScaleY
    打印机dc和屏幕dc分辨率比,在你不指定位图打印的高度和宽度的时候,这个比例可以让你打印和屏幕显示大小相等的位图
    iWidth=0,int iLength=0
    位图显示高度和宽度
    int iX,int iY,
    位图显示左上角坐标
      

  7.   

    int nWidth=pDC->GetDeviceCaps(HORZRES);
    int nHeight=pDC->GetDeviceCaps(VERTRES);