• <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

            自認為注釋已經很詳細了,沒有什么可說的,以后再用的時候如果還有哪不明白的就當長教訓了

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

             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;//創建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;    //將打印紙設置為自定義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,要不然還是打印機默認的紙型*/); // 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中有相關的打印信息
             
             ::ZeroMemory (&di, sizeof (DOCINFO));
             di.cbSize = sizeof (DOCINFO);
             di.lpszDocName = strFileName;//設置標題

             for (int i=0;i<iCopies;i++)
             {
              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  
              Info.m_rectDraw.SetRect(0,0,dc.GetDeviceCaps(HORZRES),dc.GetDeviceCaps(VERTRES));//設置范圍

              Info.SetMaxPage (1);
              OnPrint(&dc, &Info,strFileName); // 往DC上畫圖片,具體實現在下面給出
              //OnEndPrinting(&dc, &Info); // 結束打印
              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;
            }


            相關函數:
            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;//創建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));//這個函數沒有給出,可以自己寫一下,注釋掉也行,功能就是調整尺寸的
             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復制來的,獲取打印機設備
            {
                // 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 似水之心 閱讀(8204) 評論(0)  編輯 收藏 引用

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

            常用鏈接

            留言簿(2)

            隨筆檔案

            文章檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            九九久久99综合一区二区| 偷窥少妇久久久久久久久| 久久婷婷五月综合国产尤物app | 久久黄视频| 色综合久久夜色精品国产 | 亚洲欧美日韩中文久久 | 久久久久亚洲精品男人的天堂| 久久强奷乱码老熟女网站| 新狼窝色AV性久久久久久| 伊人久久精品线影院| 久久伊人五月丁香狠狠色| 国产三级久久久精品麻豆三级| 国产巨作麻豆欧美亚洲综合久久| 久久精品青青草原伊人| 91久久精品国产免费直播| 天天躁日日躁狠狠久久| 无码精品久久一区二区三区 | 亚洲国产精品一区二区三区久久| 久久综合久久自在自线精品自 | 久久精品国产亚洲Aⅴ香蕉| 午夜精品久久久久久99热| 免费一级做a爰片久久毛片潮| 久久精品这里热有精品| 日韩久久久久久中文人妻| 久久精品国产日本波多野结衣| 精品久久久久久99人妻| 青青青青久久精品国产| 精品国产乱码久久久久久1区2区| 99久久综合国产精品免费| 亚洲国产日韩欧美久久| 日产久久强奸免费的看| 久久97久久97精品免视看| 一本久久a久久精品综合夜夜| 久久99精品国产| 青青草国产精品久久| 91亚洲国产成人久久精品网址| 7777久久亚洲中文字幕| …久久精品99久久香蕉国产| 狠色狠色狠狠色综合久久| 久久香蕉综合色一综合色88| 欧美综合天天夜夜久久|