PRINT.C
资源名称:MSDN_VC98.zip [点击查看]
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:36k
源码类别:
Windows编程
开发平台:
Visual C++
- /************************************************************************
- File: print.c
- Purpose: To manage CDTEST's print dialog box.
- Functions:
- DoPrintDlg() -- Creates CDTEST's print dialog box.
- PrintProc() -- Callback function for CDTEST's print dialog box.
- DevnamesProc() -- Callback function for CDTESTS Devnames dlg box.
- DevmodeProc() -- Callback function for CDTESTS Devmode dlg box.
- InitPrintStruct() -- Fills a PRINTDLG struct with some default values.
- FillPrintDlg() -- Fills CDTEST's print dialog with contents of a
- PRINTDLG structure.
- GetPrintDlg() -- Retrieves the users edits from CDTEST's print dlg.
- FillDevnamesDlg() -- Fills CDTEST's Devnames dialog with the contents
- of a DEVNAMES structure.
- GetDevnamesDlg() -- Retrieves the user's edits from CDTEST's devnames dlg.
- FillDevmodeDlg() -- Fills CDTEST's devmode dialog with the contents of
- a DEVMODE structure.
- GetDevmodeDlg() -- Retrieves the user's edits from CDTEST's devmode dlg.
- GetPrintDlgHandle() -- Loads and returns a handle to a Print dlg custom template.
- GetSetupDlgHandle() -- Loads and returns a handle to a Setup dlg custom template.
- PrintHookProc() -- Callback function for PRINTDLG->lpfnPrintHook and
- for PRINTDLG->lpfnSetupHook
- PrintMultiProc1() -- Starting address for multithread option thread 1
- PrintMultiProc2() -- Starting address for multithread option thread 2
- MultiThreadPrintDlg() -- Creates two threads which each call PrintDlg()
- EnablePrintControls() -- Enables or disables CDTEST's print dlg controls.
- DoPrintDlgStuff() -- Calls PrintDlg()
- ************************************************************************/
- #include <windows.h>
- #include <commdlg.h>
- #include <stdlib.h>
- #include <winnls.h>
- #include "cdtest.h"
- #include "print.h"
- #include "devnames.h"
- #include "devmode.h"
- #include "dlgs.h"
- /* Externs, prototypes, variable declarations for print.c */
- extern UINT uMode ;
- extern LONG MyAtol(LPTSTR, BOOL, LPBOOL) ;
- UINT APIENTRY PrintHookProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam) ;
- void InitPrintStruct(HWND, LPPRINTDLG) ;
- void FillPrintDlg(HWND, LPPRINTDLG) ;
- void GetPrintDlg(HWND, LPPRINTDLG) ;
- void FillDevnamesDlg(HWND, LPPRINTDLG) ;
- void GetDevnamesDlg(HWND, LPPRINTDLG) ;
- void FillDevmodeDlg(HWND, LPPRINTDLG) ;
- void GetDevmodeDlg(HWND, LPPRINTDLG) ;
- HANDLE GetPrintDlgHandle(void) ;
- HANDLE GetSetupDlgHandle(void) ;
- void DoPrintDlgStuff(HWND, LPPRINTDLG) ;
- HANDLE hResPrint ;
- HANDLE hDialogPrint ;
- PRINTDLG pd ;
- HANDLE hDevNames ;
- HANDLE hDevMode ;
- TCHAR szDriverOffset[100] ;
- TCHAR szDeviceOffset[100] ;
- TCHAR szOutputOffset[100] ;
- TCHAR szPrintTempName[40] ;
- TCHAR szSetupTempName[40] ;
- /* Multithreading function declarations, variables */
- DWORD PrintMultiProc1(LPDWORD) ;
- DWORD PrintMultiProc2(LPDWORD) ;
- void MultiThreadPrintDlg(void) ;
- void EnablePrintControls(HWND, BOOL) ;
- HANDLE hPrintThread1 ;
- HANDLE hPrintThread2 ;
- DWORD dwPrintThreadID1 ;
- DWORD dwPrintThreadID2 ;
- DWORD dwPrintThreadParm1 ;
- DWORD dwPrintThreadParm2 ;
- PRINTDLG pdThread1 ;
- PRINTDLG pdThread2 ;
- HWND hwndMainPrint ;
- int nOpenDialogCount ;
- HBRUSH hBrushDlg ;
- HBRUSH hBrushEdit ; //brush handles for new colors done with hook proc
- HBRUSH hBrushButton ;
- /************************************************************************
- Function: DoPrintDialog(HWND)
- Purpose: Creates CDTEST's print dialog box.
- Returns: Nothing.
- Comments: There is only one dialog for both Print Setup and Print Print.
- The Print Print dialog is the default. To create the Print
- Setup dialog, enter the value for PD_PRINTSETUP into the
- "Flags" edit box and click OK.
- ************************************************************************/
- void DoPrintDialog(HWND hwnd)
- {
- DialogBox(hInst, MAKEINTRESOURCE(ID_PRINTDIALOG),
- hwnd, PrintProc) ;
- }
- /************************************************************************
- Function: PrintProc(HWND, UINT, UINT, LONG)
- Purpose: Callback function for CDTEST's print dialog box.
- Returns: TRUE or FALSE depending on the situation/message.
- Comments:
- ************************************************************************/
- BOOL APIENTRY PrintProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
- {
- switch (msg)
- {
- case WM_INITDIALOG:
- InitPrintStruct(hwnd, &pd) ;
- FillPrintDlg(hwnd, &pd) ;
- *(&pdThread1) = *(&pdThread2) = *(&pd) ;
- hwndMainPrint = hwnd ;
- nOpenDialogCount = 0 ;
- SetFocus(GetDlgItem(hwnd, ID_STRUCTSIZEP)) ;
- break ;
- case UMSG_DECREMENTDLGCOUNT: //user defined message that is send when
- //each thread created when multithreading ends
- nOpenDialogCount-- ;
- if (nOpenDialogCount == 0) //once both multitheading dlgs
- EnablePrintControls(hwnd, TRUE) ; //are done, enable the controls again
- break ;
- case WM_COMMAND:
- {
- switch (LOWORD(wParam))
- {
- case IDOK:
- GetPrintDlg(hwnd, &pd) ;
- DoPrintDlgStuff(hwnd, &pd) ;
- break ;
- case IDCANCEL:
- if (pd.hDC)
- ReleaseDC(hwnd, pd.hDC) ;
- EndDialog(hwnd, FALSE) ;
- break ;
- case ID_RESETPRINT:
- SetFocus(GetDlgItem(hwnd, ID_STRUCTSIZEP)) ;
- InitPrintStruct(hwnd, &pd) ;
- FillPrintDlg(hwnd, &pd) ;
- SendDlgItemMessage(hwnd, ID_PRESETUPP, BM_SETCHECK, (WPARAM)0, (LPARAM)0) ;
- SendDlgItemMessage(hwnd, ID_PREPRINTP, BM_SETCHECK, (WPARAM)0, (LPARAM)0) ;
- SendDlgItemMessage(hwnd, ID_NULLSTRUCTP, BM_SETCHECK, (WPARAM)0, (LPARAM)0) ;
- break ;
- case ID_EDITDEVNAMES:
- DialogBox(hInst, MAKEINTRESOURCE(ID_DEVNAMESDIALOG),
- hwnd, DevnamesProc) ;
- break ;
- case ID_EDITDEVMODE:
- DialogBox(hInst, MAKEINTRESOURCE(ID_DEVMODEDIALOG),
- hwnd, DevmodeProc) ;
- break ;
- case ID_MULTITHREADPRINT:
- nOpenDialogCount = 2 ;
- EnablePrintControls(hwnd, FALSE) ;
- MultiThreadPrintDlg() ;
- break ;
- default: break ;
- }
- }
- default:
- /* If the help button is pressed in the PrintDlg() dialog box,
- it will send a message Registered with RegisterWindowMessage()
- to the parent window. The message nHelpMessage was registered
- at application startup */
- if (msg == nHelpMessage)
- MessageBox(GetForegroundWindow(), TEXT("Hello from the help button"),
- TEXT("Print Help Button"), MB_OK | MB_APPLMODAL) ;
- break ;
- }
- return FALSE ;
- }
- /************************************************************************
- Function: DevnamesProc(HWND, UINT, UINT, LONG)
- Purpose: Callback function for the Devnames dialog box
- Returns: TRUE or FALSE depending on situation / message
- Comments:
- ************************************************************************/
- BOOL APIENTRY DevnamesProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
- {
- switch (msg)
- {
- case WM_INITDIALOG:
- FillDevnamesDlg(hwnd, &pd) ;
- break ;
- case WM_COMMAND:
- {
- switch (LOWORD(wParam))
- {
- case IDOK:
- GetDevnamesDlg(hwnd, &pd) ;
- EndDialog(hwnd, TRUE) ;
- break ;
- case IDCANCEL:
- EndDialog(hwnd, FALSE) ;
- break ;
- default: break ;
- }
- }
- default: break ;
- }
- return FALSE ;
- }
- /************************************************************************
- Function: DevmodeProc(HWND, UINT, UINT, LONG)
- Purpose: Callback function for the Devmode dialog box
- Returns: TRUE or FALSE depending on situation / message
- Comments:
- ************************************************************************/
- BOOL APIENTRY DevmodeProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
- {
- switch (msg)
- {
- case WM_INITDIALOG:
- FillDevmodeDlg(hwnd, &pd) ;
- break ;
- case WM_COMMAND:
- {
- switch (LOWORD(wParam))
- {
- case IDOK:
- GetDevmodeDlg(hwnd, &pd) ;
- EndDialog(hwnd, TRUE) ;
- break ;
- case IDCANCEL:
- EndDialog(hwnd, FALSE) ;
- break ;
- default: break ;
- }
- }
- default: break ;
- }
- return FALSE ;
- }
- /************************************************************************
- Function: InitPrintStruct(HWND, LPPRINTDLG)
- Purpose: Fills a PRINTDLG structure with some default values.
- Returns: Nothing.
- Comments:
- In order to fill in the hDevMode and hDevNames PRINTDLG structure
- elements, a call to PrintDlg() must be made with the
- (PD_RETURNDEFAULT | PD_RETURNDC) flag bits set.
- ************************************************************************/
- void InitPrintStruct(HWND hwnd, LPPRINTDLG ppd)
- {
- DWORD dwTempFlags = 0 ;
- ppd->lStructSize = sizeof(PRINTDLG) ;
- ppd->hwndOwner = hwnd ;
- ppd->hDevMode = (HANDLE) 0 ;
- ppd->hDevNames = (HANDLE) 0 ;
- ppd->hDC = (HDC) 0 ;
- ppd->Flags = PD_RETURNDC | PD_COLLATE | PD_SHOWHELP | PD_PAGENUMS ;
- ppd->nFromPage = 1 ;
- ppd->nToPage = 10 ;
- ppd->nMinPage = 0 ;
- ppd->nMaxPage = 9 ;
- ppd->nCopies = 1000 ;
- ppd->hInstance = (HANDLE) hInst ;
- ppd->lCustData = 0L ;
- ppd->lpfnPrintHook = PrintHookProc ;
- ppd->lpfnSetupHook = PrintHookProc ;
- lstrcpy(szPrintTempName, TEXT("prtemp1")) ;
- ppd->lpPrintTemplateName = szPrintTempName ;
- lstrcpy(szSetupTempName, TEXT("prtemp2")) ;
- ppd->lpSetupTemplateName = szSetupTempName ;
- ppd->hPrintTemplate = (HANDLE) 0 ; //these are unknown right now
- ppd->hSetupTemplate = (HANDLE) 0 ;
- /* Let's fill the hDevMode and hDevNames structures. */
- /* This call should just return handles to structures of this */
- /* type filled with the info for the default printer */
- dwTempFlags = ppd->Flags ;
- ppd->Flags = PD_RETURNDEFAULT | PD_RETURNDC ;
- PrintDlg(ppd) ;
- ppd->Flags = dwTempFlags ;
- }
- /************************************************************************
- Function: FillPrintDlg(HWND, LPPRINTDLG)
- Purpose: Fills CDTEST's print dialog with the contents of a
- PRINTDLG structure.
- Returns: Nothing.
- Comments:
- ************************************************************************/
- void FillPrintDlg(HWND hwnd, LPPRINTDLG ppd)
- {
- wsprintf(szTemp, szLongFilter, ppd->lStructSize) ;
- SetDlgItemText(hwnd, ID_STRUCTSIZEP, szTemp) ;
- wsprintf(szTemp, szLongFilter, (DWORD) ppd->hwndOwner) ;
- SetDlgItemText(hwnd, ID_HWNDOWNERP, szTemp) ;
- wsprintf(szTemp, szLongFilter, (DWORD) ppd->hDevMode) ;
- SetDlgItemText(hwnd, ID_HDEVMODEP, szTemp) ;
- wsprintf(szTemp, szLongFilter, (DWORD) ppd->hDevNames) ;
- SetDlgItemText(hwnd, ID_HDEVNAMESP, szTemp) ;
- wsprintf(szTemp, szLongFilter, (DWORD) ppd->hDC) ;
- SetDlgItemText(hwnd, ID_HDCP, szTemp) ;
- wsprintf(szTemp, szLongFilter, (DWORD) ppd->Flags) ;
- SetDlgItemText(hwnd, ID_FLAGSP, szTemp) ;
- wsprintf(szTemp, szLongFilter, (DWORD) ppd->nFromPage) ;
- SetDlgItemText(hwnd, ID_FROMPAGEP, szTemp) ;
- wsprintf(szTemp, szLongFilter, (DWORD) ppd->nToPage) ;
- SetDlgItemText(hwnd, ID_TOPAGEP, szTemp) ;
- wsprintf(szTemp, szLongFilter, (DWORD) ppd->nMinPage) ;
- SetDlgItemText(hwnd, ID_MINPAGEP, szTemp) ;
- wsprintf(szTemp, szLongFilter, (DWORD) ppd->nMaxPage) ;
- SetDlgItemText(hwnd, ID_MAXPAGEP, szTemp) ;
- wsprintf(szTemp, szLongFilter, (DWORD) ppd->nCopies) ;
- SetDlgItemText(hwnd, ID_COPIESP, szTemp) ;
- wsprintf(szTemp, szLongFilter, ppd->hInstance) ;
- SetDlgItemText(hwnd, ID_HINSTANCEP, szTemp) ;
- wsprintf(szTemp, szLongFilter, ppd->lCustData) ;
- SetDlgItemText(hwnd, ID_CUSTDATAP, szTemp) ;
- wsprintf(szTemp, szLongFilter, (DWORD) ppd->lpfnPrintHook) ;
- SetDlgItemText(hwnd, ID_PRINTHOOKP, szTemp) ;
- wsprintf(szTemp, szLongFilter, (DWORD) ppd->lpfnSetupHook) ;
- SetDlgItemText(hwnd, ID_SETUPHOOKP, szTemp) ;
- SetDlgItemText(hwnd, ID_LPPRINTTEMPP, ppd->lpPrintTemplateName) ;
- SetDlgItemText(hwnd, ID_LPSETUPTEMPP, ppd->lpSetupTemplateName) ;
- wsprintf(szTemp, szLongFilter, (DWORD) ppd->hPrintTemplate) ;
- SetDlgItemText(hwnd, ID_HPRINTTEMPP, szTemp) ;
- wsprintf(szTemp, szLongFilter, (DWORD) ppd->hSetupTemplate) ;
- SetDlgItemText(hwnd, ID_HSETUPTEMPP, szTemp) ;
- }
- /************************************************************************
- Function: GetPrintDlg(HWND, LPPRINTDLG)
- Purpose: Fills a PRINTDLG structure with the users choices in CDTEST's
- print dialog box.
- Returns: Nothing.
- Comments:
- ************************************************************************/
- void GetPrintDlg(HWND hwnd, LPPRINTDLG ppd)
- {
- BOOL b ;
- TCHAR szNum[20] ;
- #define WMAX 20
- GetDlgItemText(hwnd, ID_STRUCTSIZEP, szNum, WMAX) ;
- ppd->lStructSize = MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_HWNDOWNERP, szNum, WMAX) ;
- ppd->hwndOwner = (HWND) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_HDEVMODEP, szNum, WMAX) ;
- ppd->hDevMode = (HANDLE) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_HDEVNAMESP, szNum, WMAX) ;
- ppd->hDevNames = (HANDLE) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_HDCP, szNum, WMAX) ;
- ppd->hDC = (HDC) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_FLAGSP, szNum, WMAX) ;
- ppd->Flags = MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_FROMPAGEP, szNum, WMAX) ;
- ppd->nFromPage = (WORD) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_TOPAGEP, szNum, WMAX) ;
- ppd->nToPage = (WORD) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_MINPAGEP, szNum, WMAX) ;
- ppd->nMinPage = (WORD) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_MAXPAGEP, szNum, WMAX) ;
- ppd->nMaxPage = (WORD) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_COPIESP, szNum, WMAX) ;
- ppd->nCopies = (WORD) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_HINSTANCEP, szNum, WMAX) ;
- ppd->hInstance = (HANDLE) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_CUSTDATAP, szNum, WMAX) ;
- ppd->lCustData = MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_PRINTHOOKP, szNum, WMAX) ;
- ppd->lpfnPrintHook = (LPPRINTHOOKPROC) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_SETUPHOOKP, szNum, WMAX) ;
- ppd->lpfnSetupHook = (LPSETUPHOOKPROC) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_LPPRINTTEMPP, szPrintTempName, 100) ;
- GetDlgItemText(hwnd, ID_LPSETUPTEMPP, szSetupTempName, 100) ;
- GetDlgItemText(hwnd, ID_HPRINTTEMPP, szNum, WMAX) ;
- ppd->hPrintTemplate = (HANDLE) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_HSETUPTEMPP, szNum, WMAX) ;
- ppd->hSetupTemplate = (HANDLE) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- }
- /************************************************************************
- Function: FillDevnamesDlg(HWND, LPPRINTDLG)
- Purpose: Fills CDTEST's devnames dialog box with the values in
- The hDevNames structure member of a PRINTDLG structure.
- Returns: Nothing.
- Comments:
- ************************************************************************/
- void FillDevnamesDlg(HWND hwnd, LPPRINTDLG ppd)
- {
- LPDEVNAMES pn = (LPDEVNAMES) 0 ;
- if (ppd->hDevNames == (HANDLE) 0)
- return ;
- pn = (LPDEVNAMES) GlobalLock(ppd->hDevNames) ;
- if (pn == (LPDEVNAMES) NULL) return ;
- /* To find the strings in this block of memory, add the correct
- offset to the original pointer returned by GlobalLock() */
- SetDlgItemText(hwnd, ID_WDRIVEROFF, (LPTSTR) pn + pn->wDriverOffset) ;
- SetDlgItemText(hwnd, ID_WDEVICEOFF, (LPTSTR) pn + pn->wDeviceOffset) ;
- SetDlgItemText(hwnd, ID_WOUTPUTOFF, (LPTSTR) pn + pn->wOutputOffset) ;
- wsprintf(szTemp, szShortFilter, (int) pn->wDefault) ;
- SetDlgItemText(hwnd, ID_WDEFAULT, szTemp) ;
- GlobalUnlock(ppd->hDevNames) ;
- }
- /************************************************************************
- Function: GetDevnamesDlg(HWND, LPPRINTDLG)
- Purpose: Retrieves the user's choices in CDTEST's devnames dialog box,
- Allocates some memory to hold a new DEVNAMES structure, fills
- the users choices into the new DEVNAMES structure, and sets
- the hDevNames member of a PRINTDLG structure to this new
- memory handle.
- Returns: Nothing.
- Comments:
- ************************************************************************/
- void GetDevnamesDlg(HWND hwnd, LPPRINTDLG ppd)
- {
- BOOL b ;
- TCHAR szNum[30] ;
- LPDEVNAMES pn ;
- TCHAR sz1[100] ;
- TCHAR sz2[100] ;
- TCHAR sz3[100] ;
- DWORD dwSize ;
- int n1, n2, n3 ;
- GetDlgItemText(hwnd, ID_WDRIVEROFF, sz1, 100) ;
- GetDlgItemText(hwnd, ID_WDEVICEOFF, sz2, 100) ;
- GetDlgItemText(hwnd, ID_WOUTPUTOFF, sz3, 100) ;
- n1 = lstrlen(sz1) ;
- n2 = lstrlen(sz2) ;
- n3 = lstrlen(sz3) ;
- if (hDevNames)
- {
- GlobalFree(hDevNames) ;
- hDevNames = (HANDLE) 0 ;
- }
- /* allocate size of everything + 5 extra bytes for zeroes */
- dwSize = sizeof(DEVNAMES) + ((n1+n2+n3+5) * sizeof(TCHAR)) ;
- /* Allocate the memory and lock it down */
- if (!(hDevNames = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwSize)))
- {
- MessageBox(hwnd, TEXT("Can't Alloc memory for hDevNames!"),
- TEXT("Fatal Error!"), MB_OK | MB_APPLMODAL) ;
- return ;
- }
- if (!(pn = (LPDEVNAMES) GlobalLock(hDevNames)))
- {
- MessageBox(hwnd, TEXT("Can't Lock New hDevNames memory!"),
- TEXT("Fatal Error"), MB_OK | MB_APPLMODAL) ;
- GlobalFree(hDevNames) ;
- hDevNames = (HANDLE) 0 ;
- return ;
- }
- /* skip over devnames and copy string 1 there. Make sure to
- divide by sizeof(TCHAR) or the compiler will create a pointer
- that points too far if you compile as a UNICODE program */
- pn->wDriverOffset = sizeof(DEVNAMES) / sizeof(TCHAR) ;
- lstrcpy((LPTSTR) pn + pn->wDriverOffset, (LPTSTR) sz1) ;
- /* skip over string 1 and add string 1 with a zero between them */
- pn->wDeviceOffset = pn->wDriverOffset + n1 + 1 ;
- lstrcpy((LPTSTR) pn + pn->wDeviceOffset, (LPTSTR) sz2) ;
- /* skip over string 2 and put string 3 there with a zero between them */
- pn->wOutputOffset = pn->wDeviceOffset + n2 + 1 ;
- lstrcpy((LPTSTR) pn + pn->wOutputOffset, (LPTSTR) sz3) ;
- GetDlgItemText(hwnd, ID_WDEFAULT, szNum, 30) ;
- pn->wDefault = (WORD) MyAtol(szNum, uMode == IDM_HEXMODE, &b) ;
- GlobalUnlock(hDevNames) ;
- ppd->hDevNames = hDevNames ;
- wsprintf(szTemp, szLongFilter, ppd->hDevNames) ;
- SetDlgItemText(GetParent(hwnd), ID_HDEVNAMESP, szTemp) ;
- }
- /************************************************************************
- Function: FillDevmodeDlg(HWND, LPPRINTDLG)
- Purpose: Fills CDTEST's devmode dialog with the contents of the DEVMODE
- structure handle of a PRINTDLG structure.
- Returns: Nothing.
- Comments:
- ************************************************************************/
- void FillDevmodeDlg(HWND hwnd, LPPRINTDLG ppd)
- {
- LPDEVMODE p ;
- if (ppd->hDevMode == (HANDLE) 0)
- return ;
- p = (LPDEVMODE) GlobalLock(ppd->hDevMode) ;
- if (p == (LPDEVMODE) NULL) return ;
- SetDlgItemText(hwnd, ID_DMDEVNAME, (LPTSTR) p->dmDeviceName) ;
- wsprintf(szTemp, szShortFilter, (int) p->dmSpecVersion) ;
- SetDlgItemText(hwnd, ID_DMSPECVER, szTemp) ;
- wsprintf(szTemp, szShortFilter, (int) p->dmDriverVersion) ;
- SetDlgItemText(hwnd, ID_DMDRIVERVER, szTemp) ;
- wsprintf(szTemp, szShortFilter, (int) p->dmSize) ;
- SetDlgItemText(hwnd, ID_DMSIZEDEV, szTemp) ;
- wsprintf(szTemp, szShortFilter, (int) p->dmDriverExtra) ;
- SetDlgItemText(hwnd, ID_DMDRIVEREXTRA, szTemp) ;
- wsprintf(szTemp, szShortFilter, (int) p->dmFields) ;
- SetDlgItemText(hwnd, ID_DMFIELDS, szTemp) ;
- wsprintf(szTemp, szShortFilter, (int) p->dmOrientation) ;
- SetDlgItemText(hwnd, ID_DMORIENTATION, szTemp) ;
- wsprintf(szTemp, szShortFilter, (int) p->dmPaperSize) ;
- SetDlgItemText(hwnd, ID_DMPAPERSIZE, szTemp) ;
- wsprintf(szTemp, szLongFilter, p->dmPaperLength) ;
- SetDlgItemText(hwnd, ID_DMPAPERLENGTH, szTemp) ;
- wsprintf(szTemp, szLongFilter, p->dmPaperWidth) ;
- SetDlgItemText(hwnd, ID_DMPAPERWIDTH, szTemp) ;
- wsprintf(szTemp, szLongFilter, p->dmScale) ;
- SetDlgItemText(hwnd, ID_DMSCALE, szTemp) ;
- wsprintf(szTemp, szLongFilter, p->dmCopies) ;
- SetDlgItemText(hwnd, ID_DMCOPIES, szTemp) ;
- wsprintf(szTemp, szLongFilter, p->dmDefaultSource) ;
- SetDlgItemText(hwnd, ID_DMDEFAULTSOURCE, szTemp) ;
- wsprintf(szTemp, szLongFilter, p->dmPrintQuality) ;
- SetDlgItemText(hwnd, ID_DMPRINTQUALITY, szTemp) ;
- wsprintf(szTemp, szLongFilter, p->dmColor) ;
- SetDlgItemText(hwnd, ID_DMCOLOR, szTemp) ;
- wsprintf(szTemp, szLongFilter, p->dmDuplex) ;
- SetDlgItemText(hwnd, ID_DMDUPLEX, szTemp) ;
- wsprintf(szTemp, szLongFilter, p->dmCollate) ;
- SetDlgItemText(hwnd, ID_DMCOLLATE, szTemp) ;
- SetDlgItemText(hwnd, ID_DMFORMNAME, (LPTSTR) p->dmFormName) ;
- wsprintf(szTemp, szLongFilter, p->dmBitsPerPel) ;
- SetDlgItemText(hwnd, ID_DMBITSPERPEL, szTemp) ;
- wsprintf(szTemp, szLongFilter, p->dmPelsWidth) ;
- SetDlgItemText(hwnd, ID_DMPELSWIDTH, szTemp) ;
- wsprintf(szTemp, szLongFilter, p->dmPelsHeight) ;
- SetDlgItemText(hwnd, ID_DMPELSHEIGHT, szTemp) ;
- wsprintf(szTemp, szLongFilter, p->dmDisplayFrequency) ;
- SetDlgItemText(hwnd, ID_DMDISPLAYFREQ, szTemp) ;
- GlobalUnlock(ppd->hDevMode) ;
- }
- /************************************************************************
- Function: GetDevmodeDlg(HWND, LPPRINTDLG)
- Purpose: Retrieves the user's edits in CDTEST's DEVMODE dialog box,
- allocates memory for a new DEVMODE structure, fills that
- memory with the user's edits, and puts a handle to that
- memory in the hDevMode member of a PRINTDLG structure.
- Returns: Nothing.
- Comments:
- ************************************************************************/
- void GetDevmodeDlg(HWND hwnd, LPPRINTDLG ppd)
- {
- LPDEVMODE p ;
- BOOL b ;
- TCHAR szNum[30] ;
- #define WMAXDEV 30
- if (hDevMode)
- {
- GlobalFree(hDevMode) ;
- hDevMode = (HANDLE) 0 ;
- }
- if (!(hDevMode = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE, sizeof(DEVMODE))))
- {
- MessageBox(hwnd, TEXT("Can't allocate memory for hDevMode"),
- TEXT("Fatal Error"), MB_OK | MB_APPLMODAL) ;
- return ;
- }
- if (!(p = (LPDEVMODE) GlobalLock(hDevMode)))
- {
- MessageBox(hwnd, TEXT("Can't lock memory for hDevMode"),
- TEXT("Fatal Error"), MB_OK | MB_APPLMODAL) ;
- GlobalFree(hDevMode) ;
- hDevMode = (HANDLE) 0 ;
- return ;
- }
- GetDlgItemText(hwnd, ID_DMDEVNAME, p->dmDeviceName, 32) ;
- GetDlgItemText(hwnd, ID_DMSPECVER, szNum, WMAXDEV) ;
- p->dmSpecVersion = (WORD) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_DMDRIVERVER, szNum, WMAXDEV) ;
- p->dmDriverVersion = (WORD) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_DMSIZEDEV, szNum, WMAXDEV) ;
- p->dmSize = (WORD) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_DMDRIVEREXTRA, szNum, WMAXDEV) ;
- p->dmDriverExtra = (WORD) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_DMFIELDS, szNum, WMAXDEV) ;
- p->dmFields = MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_DMORIENTATION, szNum, WMAXDEV) ;
- p->dmOrientation = (short) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_DMPAPERSIZE, szNum, WMAXDEV) ;
- p->dmPaperSize = (short) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_DMPAPERLENGTH, szNum, WMAXDEV) ;
- p->dmPaperLength = (short) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_DMPAPERWIDTH, szNum, WMAXDEV) ;
- p->dmPaperWidth = (short) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_DMSCALE, szNum, WMAXDEV) ;
- p->dmScale = (short) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_DMCOPIES, szNum, WMAXDEV) ;
- p->dmCopies = (short) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_DMDEFAULTSOURCE, szNum, WMAXDEV) ;
- p->dmDefaultSource = (short) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_DMPRINTQUALITY, szNum, WMAXDEV) ;
- p->dmPrintQuality = (short) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_DMCOLOR, szNum, WMAXDEV) ;
- p->dmColor = (short) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_DMDUPLEX, szNum, WMAXDEV) ;
- p->dmDuplex = (short) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_DMCOLLATE, szNum, WMAXDEV) ;
- p->dmCollate = (short) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_DMFORMNAME, p->dmFormName, 32) ;
- GetDlgItemText(hwnd, ID_DMBITSPERPEL, szNum, WMAXDEV) ;
- p->dmBitsPerPel = (USHORT) MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_DMPELSWIDTH, szNum, WMAXDEV) ;
- p->dmPelsWidth = MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_DMPELSHEIGHT, szNum, WMAXDEV) ;
- p->dmPelsHeight = MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GetDlgItemText(hwnd, ID_DMDISPLAYFREQ, szNum, WMAXDEV) ;
- p->dmDisplayFrequency = MyAtol(szNum, uMode==IDM_HEXMODE, &b) ;
- GlobalUnlock(hDevMode) ;
- ppd->hDevMode = hDevMode ;
- wsprintf(szTemp, szLongFilter, (DWORD) ppd->hDevMode) ;
- SetDlgItemText(GetParent(hwnd), ID_HDEVMODEP, szTemp) ;
- }
- /************************************************************************
- Function: GetPrintDlgHandle(void)
- Purpose: Finds the custom Print dialog template in the EXE, loads it
- into a handle, and returns the handle.
- Returns: Nothing.
- Comments:
- ************************************************************************/
- HANDLE GetPrintDlgHandle(void)
- {
- hResPrint = FindResource(hInst, TEXT("prtemp1"), RT_DIALOG) ;
- hDialogPrint = LoadResource(hInst, hResPrint) ;
- return hDialogPrint ;
- }
- /************************************************************************
- Function: GetSetupDlgHandle(void)
- Purpose: Finds the custom Setup dialog template in the EXE, loads it
- into a handle, and returns the handle.
- Returns: Nothing.
- Comments:
- ************************************************************************/
- HANDLE GetSetupDlgHandle(void)
- {
- hResPrint = FindResource(hInst, TEXT("prtemp2"), RT_DIALOG) ;
- hDialogPrint = LoadResource(hInst, hResPrint) ;
- return hDialogPrint ;
- }
- /************************************************************************
- Function: PrintHookProc(HWND, UINT, UINT, LONG)
- Purpose: A callback function that will receive messages intended for
- the PrintDlg() dialog boxes before the normal common dialog
- routine receives them.
- Returns: FALSE to allow the common dialogs to process the message
- with its normal logic. TRUE to discard the message.
- Comments:
- To enable this function for the Print dialog in CDTEST, enter the
- value for PD_ENABLEPRINTHOOK in the "Flags" edit box.
- To enable this function for the Setup dialog in CDTEST, enter the
- value for (PD_ENABLESETUPHOOK | PD_PRINTSETUP) in the "Flags" edit box.
- ************************************************************************/
- UINT APIENTRY PrintHookProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
- {
- LPPRINTDLG pPr ;
- TCHAR szMsg[50] ;
- switch(msg)
- {
- case WM_INITDIALOG:
- pPr = (LPPRINTDLG) lParam ;
- if (pPr->lCustData != 0)
- {
- wsprintf(szMsg, TEXT("PRINTDLG->lCustData is: %ld"), pPr->lCustData) ;
- MessageBox(hwnd, szMsg, TEXT("lCustData Sent!"), MB_OK | MB_APPLMODAL) ;
- }
- SetWindowText(hwnd, TEXT("Print Hook Proc Dialog")) ;
- break ;
- /* use the WM_CTLCOLOR* messages to change the color of the Open
- dialog */
- case WM_CTLCOLORDLG:
- if (!hBrushDlg)
- hBrushDlg = GetStockObject(LTGRAY_BRUSH) ;
- return (UINT) hBrushDlg ;
- break ;
- case WM_CTLCOLORBTN:
- SetBkMode((HDC) wParam, TRANSPARENT) ; //sets background color
- //for push and check box
- //buttons...
- if (!hBrushButton)
- hBrushButton = GetStockObject(LTGRAY_BRUSH) ;
- return (UINT) hBrushButton ;
- break ;
- case WM_CTLCOLORSTATIC:
- SetTextColor((HDC) wParam, RGB(0x00, 0xff, 0x00)) ; //green
- SetBkMode((HDC) wParam, TRANSPARENT) ; //transparent text
- if (!hBrushDlg)
- hBrushDlg = GetStockObject(LTGRAY_BRUSH) ;
- return (UINT) hBrushDlg ;
- break ;
- default:
- break ;
- }
- return FALSE ; //send msg to the common dialog code
- }
- /************************************************************************
- Function: PrintMultiProc1(LPDWORD)
- Purpose: Is the starting address for the first new thread when
- multithreading.
- Returns: Any DWORD value.
- Comments:
- The new thread will start executing here and will end when
- the PrintDlg() function returns and it has posted a message
- to the CDTEST's print dialog window saying that one of the
- two multithreading dialogs been terminated.
- ************************************************************************/
- DWORD PrintMultiProc1(LPDWORD pdw)
- {
- GetPrintDlg(hwndMainPrint, &pdThread1) ;
- DoPrintDlgStuff(hwndMainPrint, &pdThread1) ;
- PostMessage(hwndMainPrint, UMSG_DECREMENTDLGCOUNT, 0, 0L ) ;
- return 0L ;
- }
- /************************************************************************
- Function: PrintMultiProc2(LPDWORD)
- Purpose: Is the starting address for the second new thread when
- multithreading.
- Returns: Any DWORD value.
- Comments:
- The new thread will start executing here and will end when
- the PrintDlg() function returns and it has posted a message
- to the CDTEST's print dialog window saying that one of the
- two multithreading dialogs been terminated.
- ************************************************************************/
- DWORD PrintMultiProc2(LPDWORD pdw)
- {
- GetPrintDlg(hwndMainPrint, &pdThread2) ;
- DoPrintDlgStuff(hwndMainPrint, &pdThread2) ;
- PostMessage(hwndMainPrint, UMSG_DECREMENTDLGCOUNT, 0, 0L ) ;
- return 0L ;
- }
- /************************************************************************
- Function: MultiThreadPrintDlg(void)
- Purpose: Is the starting address for the first new thread when
- multithreading.
- Returns: Any DWORD value.
- Comments:
- The new thread will start executing here and will end when
- the PrintDlg() function returns and it has posted a message
- to the CDTEST's print dialog window saying that one of the
- two multithreading dialogs been terminated.
- ************************************************************************/
- void MultiThreadPrintDlg(void)
- {
- dwPrintThreadParm1 = dwPrintThreadParm2 = 0L ;
- if (!(hPrintThread1 = CreateThread((LPSECURITY_ATTRIBUTES) NULL, 0,
- (LPTHREAD_START_ROUTINE) PrintMultiProc1,
- &dwPrintThreadParm1, CREATE_SUSPENDED, &dwPrintThreadID1)))
- {
- MessageBox(GetForegroundWindow(), TEXT("Error creating thread 1"), NULL,
- MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL) ;
- nOpenDialogCount = 0 ;
- EnablePrintControls(hwndMainPrint, TRUE) ;
- return ;
- }
- if (!(hPrintThread2 = CreateThread((LPSECURITY_ATTRIBUTES) NULL, 0,
- (LPTHREAD_START_ROUTINE) PrintMultiProc2,
- &dwPrintThreadParm2, CREATE_SUSPENDED, &dwPrintThreadID2)))
- {
- MessageBox(GetForegroundWindow(), TEXT("Error creating thread 2"), NULL,
- MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL) ;
- nOpenDialogCount = 0 ;
- EnablePrintControls(hwndMainPrint, TRUE) ;
- return ;
- }
- ResumeThread(hPrintThread1) ;
- ResumeThread(hPrintThread2) ;
- return ;
- }
- /************************************************************************
- Function: EnablePrintControls(HWND, BOOL)
- Purpose: Enable or disable CDTEST's print dialog's controls.
- Returns: Nothing.
- Comments: This is necessary when CDTEST is multithreading.
- ************************************************************************/
- void EnablePrintControls(HWND hwnd, BOOL bEnable)
- {
- EnableWindow(GetDlgItem(hwnd, IDOK), bEnable) ;
- EnableWindow(GetDlgItem(hwnd, IDCANCEL), bEnable) ;
- EnableWindow(GetDlgItem(hwnd, ID_RESETPRINT), bEnable) ;
- EnableWindow(GetDlgItem(hwnd, ID_MULTITHREADPRINT), bEnable) ;
- EnableWindow(GetDlgItem(hwnd, ID_EDITDEVMODE), bEnable) ;
- EnableWindow(GetDlgItem(hwnd, ID_EDITDEVNAMES), bEnable) ;
- }
- /************************************************************************
- Function: DoPrintDlgStuff(HWND, LPPRINTDLG)
- Purpose: Calls PrintDlg() with the correct parameters.
- Returns: Nothing.
- Comments:
- ************************************************************************/
- void DoPrintDlgStuff(HWND hwnd, LPPRINTDLG ppd)
- {
- BOOL bRet = FALSE ;
- /* Figure out how the user want's to call PrintDlg() */
- if (IsDlgButtonChecked(hwnd, ID_PREPRINTP) == 1)
- ppd->hPrintTemplate = GetPrintDlgHandle() ;
- if (IsDlgButtonChecked(hwnd, ID_PRESETUPP) == 1)
- ppd->hSetupTemplate = GetSetupDlgHandle() ;
- wsprintf(szTemp, szLongFilter, (DWORD) ppd->hPrintTemplate) ;
- SetDlgItemText(hwnd, ID_HPRINTTEMPP, szTemp) ;
- wsprintf(szTemp, szLongFilter, (DWORD) ppd->hSetupTemplate) ;
- SetDlgItemText(hwnd, ID_HSETUPTEMPP, szTemp) ;
- /* Call the function */
- if (IsDlgButtonChecked(hwnd, ID_NULLSTRUCTP) == 1)
- bRet = PrintDlg((LPPRINTDLG) NULL) ;
- else
- bRet = PrintDlg(ppd) ;
- /* Clean up and show results */
- wsprintf(szTemp, szLongFilter, CommDlgExtendedError()) ;
- SetDlgItemText(hwnd, ID_ERRORP, szTemp) ;
- SetDlgItemInt(hwnd, ID_RETURNP, bRet, TRUE) ;
- if (hDialogPrint)
- {
- FreeResource(hDialogPrint) ; //obsolete call, but
- hDialogPrint = (HANDLE) 0 ; //it's possible that this
- hResPrint = (HANDLE) 0 ; //might be recompiled for win 3.x
- }
- pd.hDevMode = ppd->hDevMode ; //need to fix this so that FillDevnamesDlg()
- pd.hDevNames = ppd->hDevNames ; //and FillDevmodeDlg() work...
- FillPrintDlg(hwnd, ppd) ;
- if (ppd->hDC) //release the HDC after its value is
- //returned to the test app
- {
- ReleaseDC(ppd->hwndOwner, ppd->hDC) ;
- ppd->hDC = (HDC) 0 ;
- }
- }