none
關於控制Printer的問題,急!!! RRS feed

  • 問題

  • 不知有誰知道這問題:
        我的案子是在wince中寫一支ap, ap 的style已訂為dialog based ap, 由於案子已接近完成, 不希望改變style的情況下想加入print功能
        但由於UI只能用touch panel做輸入且最常使用的是手指操作, printdlg()所帶出的dialog中的物件都太小且按ok後還會show出列印結果的message box,這都是我不想要的....
    我想問的是,
        1.如何在dialog based ap中用我自己的dialog取代系統的print dialog?
        2.如何在不show print dialog的情況下用程式碼進行printer select, paper size,orientation....等控制,最後完成列印輸出?

    Thanks!

    2007年7月8日 下午 02:13

解答

  • HI,

     

    在C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\src\mfc路徑底下, 例如Big Smilelgprnt.cpp原始檔就有寫

     

    tihs

    2007年7月10日 上午 03:15

所有回覆

  • HI,

     

    您只要不使用CPrintDialog, 改顯示自己製作的列印對話方塊就行了, 至於列印功能要如何製作, 可以參考CPrintDialog類別的寫法

     

    tihs

    2007年7月9日 上午 05:21
  • 我在VS2005中只找到CPrintDialog的宣告,但找不到*.cpp,看不到member function的實做,請指教,謝謝!
    2007年7月9日 上午 07:08
  • HI,

     

    在C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\src\mfc路徑底下, 例如Big Smilelgprnt.cpp原始檔就有寫

     

    tihs

    2007年7月10日 上午 03:15
  • 找到了,thanks!

    另外有一個問題,由於printer dc的resolution(600dpi)大多比screen dc(96dpi)高,

    我原先已完成的顯示用原件若是直接輸出到printer dc上那麼尺寸會相差很多倍,

    請問除了在printer dc上另外重畫以外,有無其它轉換的方法?

     

    Thanks!

    2007年7月10日 上午 06:10
  • HI,

     

    以CView類別來講, 就是不想重畫, 所以才呼叫OnDraw這個Virtual function, 和繪製螢幕的內容用同一個函數, 如果不想再畫一次, 可以利用這種機制來完成列印, 否則大概就會重畫了

     

    tihs

    2007年7月11日 上午 01:56
  • Thanks!

    請問為何我用以下的程式碼在WinCE中控制Printer,已在Print Dialog中設定方向,就是無法改為水平方向,而用Wordpad測試卻正常!

    請指教,Thanks!

    Print()
    {
                PAGESETUPDLG pgs;
               memset((void*) &pgs,0,sizeof(PAGESETUPDLG));
               pgs.lStructSize = sizeof(PAGESETUPDLG);

     // pop up page setup dialog box
     int rval=PageSetupDlg(&pgs); //fills pgs structure with current settings
     if (rval==0)
      return;
     // You can now get margin setting values from pgs structure
     LPDEVNAMES lpDev;
     lpDev=(LPDEVNAMES) GlobalLock(pgs.hDevNames);
     BYTE *tbyte=(BYTE *) lpDev;
     TCHAR *pDeviceName, *pPort, *pDriverName;
     pDriverName=(TCHAR*)(tbyte + lpDev->wDriverOffset);
     pDeviceName=(TCHAR*)(tbyte + lpDev->wDeviceOffset);
     pPort=(TCHAR*)(tbyte + lpDev->wOutputOffset);
     // Lets get some values from the page dialog box
     LPDEVMODE lpDevMode;
     lpDevMode=(LPDEVMODE) GlobalLock(pgs.hDevMode);
     if (lpDevMode==NULL) {
     // handle error
     }
     // Get the printer DC!! This may pop up an additional printer dialog box
     HDC hDC;
     DOCINFO di;
     hDC=CreateDC(pDriverName,pDeviceName,pPort,NULL);//CreateDC(_T("pcl.dll"),_T("PCL Laser"),_T("\\\\HP3015\\HP3015 PCL 6"),NULL);
     GlobalUnlock(pgs.hDevNames);
     // You now have your HDC...
     // Get whatever DEVMODE info needed (orientation, paper size, etc)
     //CurOrientation=(lpDevMode->dmOrientation==DMORIENT_PORTRAIT);
     //CurIsColor=(lpDevMode->dmColor==DMCOLOR_COLOR);
     //CurPaperSize = lpDevMode->dmPaperSize;
     //CurHighPrintQuality = (lpDevMode->dmPrintQuality==DMRES_HIGH);
     GlobalUnlock(pgs.hDevMode);
         // Did you get a good DC?
     if( !hDC)
     {
        ::MessageBox(NULL,_T("Error creating DC"), _T("Error"),
                                       MB_APPLMODAL | MB_OK );
               return;
     }
            // You always have to use an AbortProc().
     if( SetAbortProc( hDC, AbortProc ) == SP_ERROR )
     {
      ::MessageBox( NULL, _T("Error setting up AbortProc"),
                                       _T("Error"), MB_APPLMODAL | MB_OK);
      return;
     }
     // Init the DOCINFO and start the document.
     InitDocStruct( &di,"MyDoc");
     StartDoc( hDC, &di );
     //
     CDC PrnDC,*pDC;
     PrnDC.Attach(hDC);
     pDC=&PrnDC;
     //Print one page.
     StartPage( hDC );
     //

    CRect rcBkg;

    //永遠是Vertical,why?

    rcBkg.SetRect(0,0,pDC->GetDeviceCaps(HORZRES),pDC->GetDeviceCaps(VERTRES));
     .....
     //
     EndPage( hDC );
     // Indicate end of document.
     EndDoc( hDC );
     // Clean up
     DeleteDC( hDC );
     pDC->DeleteDC();

    }

    void InitDocStruct( DOCINFO* di, char* docname)
    {
       // Always zero it before using it.
       memset( di, 0, sizeof( DOCINFO ) );
       // Fill in the required members.
       di->cbSize = sizeof( DOCINFO );
       di->lpszDocName=(LPCWSTR)docname;//di->lpszDocName = docname;
    }

    2007年7月15日 下午 11:06
  • HI,

     

    您有將存放使用者選擇的列印設定拿給列印功能使用嗎?

     

    tihs

     

    2007年7月16日 上午 11:22
  • Thanks!

    我以為在PageSetupDlg()所帶出的dialog中完成設定就可以了,不是這樣嗎?可否詳述?

    2007年7月16日 下午 02:44
  • HI,

     

    程式要讓PAGESETUPDLG結構和PRINTDLG結構共用:

     

    hDevMode

    hDevNames

     

    請參考:

     

    http://www.catch22.net/tuts/printing.asp

     

    tihs

    2007年7月17日 上午 01:44
  • Hi,

     

    看完http://www.catch22.net/tuts/printing.asp後,依然參不透,

    能否舉例說明讓PAGESETUPDLG結構和PRINTDLG結構共用

    hDevMode

    hDevNames

     

    Thanks,

     

    Jerry

    2008年3月28日 上午 08:30