• <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為類的成員變量

             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上畫圖片,具體實(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)有給出,可以自己寫一下,注釋掉也行,功能就是調(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   管理



            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿(2)

            隨筆檔案

            文章檔案

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            九九久久精品国产| 亚洲精品国精品久久99热一| 久久久久久亚洲AV无码专区| 久久精品国产亚洲av日韩| 日本道色综合久久影院| 久久免费国产精品| 亚洲av成人无码久久精品| 青青草国产成人久久91网| 亚洲伊人久久综合影院| 国内精品久久久久影院优| 久久93精品国产91久久综合| 99久久做夜夜爱天天做精品| 久久国产精品一区二区| 久久久噜噜噜久久中文字幕色伊伊| 精品久久久久久国产潘金莲 | 久久精品国产亚洲5555| 久久综合亚洲色一区二区三区 | 亚洲午夜久久久精品影院| 一本久久免费视频| 国产成人香蕉久久久久| 久久久亚洲欧洲日产国码二区| 99精品伊人久久久大香线蕉| 性欧美大战久久久久久久久 | 久久亚洲高清综合| 国产精品久久久久影院嫩草| 亚洲午夜久久久久久噜噜噜| 国产69精品久久久久99尤物 | 久久免费99精品国产自在现线| 99久久精品国产免看国产一区| 久久久久亚洲AV无码专区首JN| 精品久久久久久国产牛牛app| 国产精品久久久久久搜索| 色婷婷综合久久久久中文| 狠狠色丁香久久婷婷综合蜜芽五月 | 久久综合成人网| 久久精品国产亚洲7777| 久久精品国产一区二区三区日韩| 69久久精品无码一区二区| 久久婷婷五月综合色高清| 久久人妻少妇嫩草AV无码专区 | 99久久做夜夜爱天天做精品|