• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 13,  comments - 16,  trackbacks - 0

            自認(rèn)為注釋已經(jīng)很詳細(xì)了,沒(méi)有什么可說(shuō)的,以后再用的時(shí)候如果還有哪不明白的就當(dāng)長(zhǎng)教訓(xùn)了

            BOOL CMYDlg::PrintPic(CString strFileName/*打印的圖片文件名,帶路徑*/,int iCopies/*打印次數(shù)*/,CString strPrintName/*指定打印機(jī)名,如果只有一臺(tái)打印機(jī)可忽略,相應(yīng)的注釋下面的一些代碼*/)

             CDC dc;
             CPrintDialog printDlg(FALSE);
             HGLOBAL hDevMode;
             HGLOBAL hDevNames;

            //以下為判斷紙型,m_strPrintSize為類(lèi)的成員變量

             short paperWidth = 0;
             short paperHeight = 0;
             if(0==m_strPrintSize.CompareNoCase("a3"))
             {
              paperWidth = 2970;
              paperHeight = 4200;
             }
             if(0==m_strPrintSize.CompareNoCase("a4"))
             {
              paperWidth = 2100;
              paperHeight = 2970;
             }
             if(0==m_strPrintSize.CompareNoCase("a5"))
             {
              paperWidth=1480;
              paperHeight=2100;
             }
             if(0==m_strPrintSize.CompareNoCase("a6"))
             {
              paperWidth = 1050;
              paperHeight = 1480;
             }

             BSTR   bstr=strFileName.AllocSysString();
             Bitmap* pPicture = new Bitmap(bstr);
             HBITMAP hBitmap;//創(chuàng)建bmp的句柄
             pPicture->GetHBITMAP(NULL,&hBitmap);//獲取句柄
             BITMAP bitmap;
             ::GetObject(hBitmap,sizeof(BITMAP),&bitmap);


             printDlg.GetDefaults();
             DEVMODE FAR *pDevMode=(DEVMODE FAR *)::GlobalLock(printDlg.m_pd.hDevMode);
             pDevMode->dmFields = pDevMode->dmFields | DM_PAPERSIZE;
             pDevMode->dmPaperSize = DMPAPER_USER;    //將打印紙?jiān)O(shè)置為自定義DMDO_90

            /* if (bitmap.bmHeight<bitmap.bmWidth)
             {
              pDevMode->dmPaperWidth = paperHeight;
              pDevMode->dmPaperLength = paperWidth;
             }
             else
             {*/
              pDevMode->dmPaperWidth = paperWidth;
              pDevMode->dmPaperLength = paperHeight;
            // }

             ::GlobalUnlock(printDlg.m_pd.hDevMode);

             ::DeleteObject(hBitmap);

             CPrintInfo Info;//
             if(GetPrinterDevice(strPrintName.GetBuffer(0), &hDevNames, &hDevMode))
             {
              printDlg.m_pd.hDevMode=hDevMode;
              printDlg.m_pd.hDevNames = hDevNames;
             }

             dc.Attach(printDlg.CreatePrinterDC()/*這里很重要,一定要CreatePrinterDC,要不然還是打印機(jī)默認(rèn)的紙型*/); // Attach a printer DC 讓HANDLE連接到dc上
             dc.m_bPrinting = TRUE;
             CString strTitle; // Get the application title ?
             strTitle.LoadString(AFX_IDS_APP_TITLE);
             DOCINFO di; // Initialise print document details DOCINFO中有相關(guān)的打印信息
             
             ::ZeroMemory (&di, sizeof (DOCINFO));
             di.cbSize = sizeof (DOCINFO);
             di.lpszDocName = strFileName;//設(shè)置標(biāo)題

             for (int i=0;i<iCopies;i++)
             {
              BOOL bPrintingOK = dc.StartDoc(&di); // Begin a new print job 開(kāi)始打印
              
              // Get the printing extents and store in the m_rectDraw field of a
              // CPrintInfo object  
              Info.m_rectDraw.SetRect(0,0,dc.GetDeviceCaps(HORZRES),dc.GetDeviceCaps(VERTRES));//設(shè)置范圍

              Info.SetMaxPage (1);
              OnPrint(&dc, &Info,strFileName); // 往DC上畫(huà)圖片,具體實(shí)現(xiàn)在下面給出
              //OnEndPrinting(&dc, &Info); // 結(jié)束打印
              if (bPrintingOK)
               dc.EndDoc(); // end a print job
              else
               dc.AbortDoc(); // abort job. 
             }
             dc.Detach(); // detach the printer DC
             delete pPicture;
             pPicture=NULL;
             return TRUE;
            }


            相關(guān)函數(shù):
            void OnPrint(CDC* pdc,CPrintInfo * lParam,CString strFileName1)
            {
             CDC* pDC   = pdc;
             CPrintInfo* pInfo = (CPrintInfo *)lParam;
             
             CFont DataFont;
             DataFont.CreatePointFont(120,"宋體",pDC);
             
             CString strFileName=strFileName1;
             
             BSTR   bstr=strFileName.AllocSysString();
             Bitmap* pPicture = new Bitmap(bstr);
             pPicture->RotateFlip(Gdiplus::Rotate90FlipNone);
             HBITMAP hBitmap;//創(chuàng)建bmp的句柄
             pPicture->GetHBITMAP(NULL,&hBitmap);//獲取句柄
             BITMAP bitmap;
             ::GetObject(hBitmap,sizeof(BITMAP),&bitmap);
             double dScale=(double)pInfo->m_rectDraw.Width()/bitmap.bmWidth;
             //int nScaledWidth=m_cxWidth;
             int nScaledHeight=(int)(bitmap.bmHeight*dScale);
             
             HDC dcMem;
             dcMem=::CreateCompatibleDC(pDC->m_hDC);
             HBITMAP hOldBmp=(HBITMAP)::SelectObject(dcMem,hBitmap);
             
             CRect r = pInfo->m_rectDraw;
             SizeToPlace(STP_FIX, r, CRect(0,0,bitmap.bmWidth, bitmap.bmHeight));//這個(gè)函數(shù)沒(méi)有給出,可以自己寫(xiě)一下,注釋掉也行,功能就是調(diào)整尺寸的
             int nVertCenterPos = pDC->GetDeviceCaps (VERTRES) / 2;
             ::StretchBlt(pDC->m_hDC, r.left, r.top, r.Width(), r.Height(),
              dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
             
             
             ::SelectObject(dcMem,hOldBmp);
             ::DeleteDC(dcMem);
             ::DeleteObject(hBitmap);
             delete pPicture;
             pPicture=NULL;

            }
            BOOL GetPrinterDevice(LPTSTR pszPrinterName, HGLOBAL* phDevNames, HGLOBAL* phDevMode)//從MSDN復(fù)制來(lái)的,獲取打印機(jī)設(shè)備
            {
                // if NULL is passed, then assume we are setting app object's
                // devmode and devnames
                if (phDevMode == NULL || phDevNames == NULL)
                    return FALSE;
             
                // Open printer
                HANDLE hPrinter;
                if (OpenPrinter(pszPrinterName, &hPrinter, NULL) == FALSE)
                    return FALSE;
             
                // obtain PRINTER_INFO_2 structure and close printer
                DWORD dwBytesReturned, dwBytesNeeded;
                GetPrinter(hPrinter, 2, NULL, 0, &dwBytesNeeded);
                PRINTER_INFO_2* p2 = (PRINTER_INFO_2*)GlobalAlloc(GPTR,
                    dwBytesNeeded);
                if (GetPrinter(hPrinter, 2, (LPBYTE)p2, dwBytesNeeded,
              &dwBytesReturned) == 0) {
              GlobalFree(p2);
              ClosePrinter(hPrinter);
              return FALSE;
                }
                ClosePrinter(hPrinter);
             
                // Allocate a global handle for DEVMODE
                HGLOBAL  hDevMode = GlobalAlloc(GHND, sizeof(*p2->pDevMode) +
              p2->pDevMode->dmDriverExtra);
                ASSERT(hDevMode);
                DEVMODE* pDevMode = (DEVMODE*)GlobalLock(hDevMode);
                ASSERT(pDevMode);
             
                // copy DEVMODE data from PRINTER_INFO_2::pDevMode
                memcpy(pDevMode, p2->pDevMode, sizeof(*p2->pDevMode) +
              p2->pDevMode->dmDriverExtra);
                GlobalUnlock(hDevMode);
             
                // Compute size of DEVNAMES structure from PRINTER_INFO_2's data
                DWORD drvNameLen = lstrlen(p2->pDriverName)+1;  // driver name
                DWORD ptrNameLen = lstrlen(p2->pPrinterName)+1; // printer name
                DWORD porNameLen = lstrlen(p2->pPortName)+1;    // port name
             
                // Allocate a global handle big enough to hold DEVNAMES.
                HGLOBAL hDevNames = GlobalAlloc(GHND,
                    sizeof(DEVNAMES) +
                    (drvNameLen + ptrNameLen + porNameLen)*sizeof(TCHAR));
                ASSERT(hDevNames);
                DEVNAMES* pDevNames = (DEVNAMES*)GlobalLock(hDevNames);
                ASSERT(pDevNames);
             
                // Copy the DEVNAMES information from PRINTER_INFO_2
                // tcOffset = TCHAR Offset into structure
                int tcOffset = sizeof(DEVNAMES)/sizeof(TCHAR);
                ASSERT(sizeof(DEVNAMES) == tcOffset*sizeof(TCHAR));
             
                pDevNames->wDriverOffset = tcOffset;
                memcpy((LPTSTR)pDevNames + tcOffset, p2->pDriverName,
                    drvNameLen*sizeof(TCHAR));
                tcOffset += drvNameLen;
             
                pDevNames->wDeviceOffset = tcOffset;
                memcpy((LPTSTR)pDevNames + tcOffset, p2->pPrinterName,
                    ptrNameLen*sizeof(TCHAR));
                tcOffset += ptrNameLen;
             
                pDevNames->wOutputOffset = tcOffset;
                memcpy((LPTSTR)pDevNames + tcOffset, p2->pPortName,
                    porNameLen*sizeof(TCHAR));
                pDevNames->wDefault = 0;
             
                GlobalUnlock(hDevNames);
                GlobalFree(p2);   // free PRINTER_INFO_2
             
                // set the new hDevMode and hDevNames
                *phDevMode = hDevMode;
                *phDevNames = hDevNames;
                return TRUE;
            }

            posted on 2009-06-08 09:58 似水之心 閱讀(8247) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理



            <2009年6月>
            31123456
            78910111213
            14151617181920
            21222324252627
            2829301234
            567891011

            常用鏈接

            留言簿(2)

            隨筆檔案

            文章檔案

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久国产精品成人免费| 午夜人妻久久久久久久久| 99久久婷婷国产综合精品草原| 精品免费tv久久久久久久| 国产精品99久久不卡| 日本国产精品久久| 久久人人妻人人爽人人爽| 国产激情久久久久影院小草| 亚洲AV无一区二区三区久久| 亚洲一区二区三区日本久久九| 四虎国产精品成人免费久久| 国产成人久久精品一区二区三区| 久久99久久成人免费播放| 日韩精品无码久久久久久| 国产成人精品久久亚洲高清不卡| 久久精品国产乱子伦| 久久www免费人成看国产片| 久久精品99久久香蕉国产色戒| 国产日韩久久久精品影院首页| 午夜精品久久久久久99热| 日本国产精品久久| 久久精品国产清自在天天线| 久久精品国产91久久综合麻豆自制| 国产毛片欧美毛片久久久| 久久久久国产亚洲AV麻豆| 97精品伊人久久久大香线蕉 | 日本国产精品久久| 久久精品国产精品亚洲精品| 久久婷婷国产综合精品 | 精品久久久久久国产免费了| 丁香色欲久久久久久综合网| 国产69精品久久久久观看软件| 久久精品无码一区二区三区日韩| 久久综合丁香激情久久| 精品一区二区久久| 69SEX久久精品国产麻豆| 精品国际久久久久999波多野| 精品久久久久久中文字幕人妻最新| 久久人人爽人人爽人人片AV高清 | 久久综合给合久久国产免费| 中文字幕乱码久久午夜|