typedef struct tagPD { // pd
DWORD lStructSize;
HWND hwndOwner;
HANDLE hDevMode;
HANDLE hDevNames;
HDC hDC;
DWORD Flags;
WORD nFromPage;
WORD nToPage;
WORD nMinPage;
WORD nMaxPage;
WORD nCopies;
HINSTANCE hInstance;
DWORD lCustData;
LPPRINTHOOKPROC lpfnPrintHook;
LPSETUPHOOKPROC lpfnSetupHook;
LPCTSTR lpPrintTemplateName;
LPCTSTR lpSetupTemplateName;
HANDLE hPrintTemplate;
HANDLE hSetupTemplate;
} PRINTDLG;
lStructSize には、この構造体のサイズを指定します| 定数 | 解説 |
|---|---|
| PD_ALLPAGES | 「すべて」ボタンが選択された |
| PD_COLLATE | 入力時に「部単位で印刷」チェックボックスがセットされる PrintDlg() 関数が戻った後では、ユーザーが「部単位で印刷」を選択したが プリンタドライバが部単位の印刷をサポートしていないことを表す |
| PD_DISABLEPRINTTOFILE | 「ファイルへ出力」チェックボックスを無効にする1 |
| PD_ENABLEPRINTHOOK | lpfnHook で指定されたフック関数を有効にする |
| PD_ENABLEPRINTTEMPLATE | hInstance が lpPrintTemplateName メンバで指定された ダイアログテンプレートを含むリソースのインスタンスであることを示す |
| PD_ENABLEPRINTTEMPLATEHANDLE | hPrintTemplate メンバがロード済みのダイアログボックステンプレートを含む メモリブロックを指していることを表す このフラグが指定されている場合、lpPrintTemplateName は無視される |
| PD_ENABLESETUPHOOK | lpfnSetupHook で指定されたフック関数を有効にする |
| PD_ENABLESETUPTEMPLATE | hInstance および lpSetupTemplateName で指定された ダイアログボックステンプレートを使用することを示す |
| PD_ENABLESETUPTEMPLATEHANDLE | hSetupTemplate メンバがロード済みのダイアログボックステンプレートを含む メモリブロックを指していることを表す このフラグが指定されている場合、lpSetupTemplateName は無視される |
| PD_HIDEPRINTTOFILE | 「ファイルへ出力」チェックボックスを隠す |
| PD_NONETWORKBUTTON | 「ネットワーク」ボタンを無効にする |
| PD_NOPAGENUMS | 「ページ設定」ボタンと関連する編集コントロールを無効にする |
| PD_NOSELECTION | 「選択した部分」ボタンを無効にする |
| PD_NOWARNING | デフォルトプリンタがない場合に、警告を表示しない |
| PD_PAGENUMS | 「ページ設定」ボタンが選択された状態であることを示す |
| PD_PRINTSETUP | 「印刷」ダイアログボックスではなく 「プリンタの設定」ダイアログボックスを表示する |
| PD_PRINTTOFILE | 「ファイルへ出力」チェックボックスがチェック状態であることを示す |
| PD_RETURNDC | hDC にデバイスコンテキストを格納することを表す |
| PD_RETURNDEFAULT | ダイアログを表示せず、システム設定のデフォルトプリンタで初期化する DEVMODE と DEVNAMES 構造体は NULL でなければならない |
| PD_RETURNIC | hDC に情報コンテキストを格納することを表す |
| PD_SELECTION | 「選択した部分」ボタンが選択されていることを示す |
| PD_SHOWHELP | 「ヘルプ」ボタンを表示する この値が設定される場合、親ウィンドウを持たなければなりません |
| PD_USEDEVMODECOPIES | PD_USEDEVMODECOPIESANDCOLLATE と同じ |
| PD_USEDEVMODECOPIESANDCOLLATE | プリンタドライバが複数部印刷をサポートしていない場合 「部数」編集コントロールを無効にする 部単位印刷をサポートしていない場合は 「部単位で印刷」チェックボックスを無効にする |
typedef struct tagDEVNAMES { // dvnm
WORD wDriverOffset;
WORD wDeviceOffset;
WORD wOutputOffset;
WORD wDefault;
} DEVNAMES;
この構造体は、面白いことに文字列型のメンバを含んでいません#include <windows.h>
#define TITLE TEXT("Kitty on your lap")
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
HDC hdc;
PAINTSTRUCT ps;
BCHAR *strName;
static PRINTDLG pd;
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CREATE:
pd.lStructSize = sizeof (PRINTDLG);
pd.hwndOwner = hWnd;
pd.Flags = PD_RETURNDC;
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd , &ps);
if (pd.hDevMode) {
strName = (BCHAR *)GlobalLock(pd.hDevMode);
TextOut(hdc , 0 , 0 , strName , lstrlen(strName));
GlobalUnlock(pd.hDevMode);
}
EndPaint(hWnd , &ps);
return 0;
case WM_RBUTTONUP:
PrintDlg(&pd);
InvalidateRect(hWnd , NULL , TRUE);
return 0;
}
return DefWindowProc(hWnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow ) {
HWND hwnd;
MSG msg;
WNDCLASS winc;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("KITTY");
if (!RegisterClass(&winc)) return -1;
hwnd = CreateWindow(
TEXT("KITTY") , TITLE ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
NULL , NULL , hInstance , NULL
);
if (hwnd == NULL) return -1;
while(GetMessage(&msg , NULL , 0 , 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

typedef struct tagPSD { // psd
DWORD lStructSize;
HWND hwndOwner;
HGLOBAL hDevMode;
HGLOBAL hDevNames;
DWORD Flags;
POINT ptPaperSize;
RECT rtMinMargin;
RECT rtMargin;
HINSTANCE hInstance;
LPARAM lCustData;
LPPAGESETUPHOOK lpfnPageSetupHook;
LPPAGEPAINTHOOK lpfnPagePaintHook;
LPCTSTR lpPageSetupTemplateName;
HGLOBAL hPageSetupTemplate;
} PAGESETUPDLG, * LPPAGESETUPDLG;
lStructSize には、この構造体のサイズを指定します| 定数 | 解説 |
|---|---|
| PSD_DEFAULTMINMARGINS | デフォルトの最小余白値を使用する |
| PSD_DISABLEMARGINS | 余白を無効にする |
| PSD_DISABLEORIENTATION | 印刷の向きを無効にする |
| PSD_DISABLEPAGEPAINTING | ページ設定プレビューを無効にする |
| PSD_DISABLEPAPER | 用紙の設定を無効にする |
| PSD_DISABLEPRINTER | 「プリンタ」ボタンを無効にする |
| PSD_ENABLEPAGEPAINTHOOK | lpfnPagePaintHook で指定されたフック関数を有効にする |
| PSD_ENABLEPAGESETUPHOOK | lpfnPageSetupHook で指定されたフック関数を有効にする |
| PSD_ENABLEPAGESETUPTEMPLATE | hInstance と lpPageSetupTemplateName で指定された ダイアログボックステンプレートを用いて作成する |
| PSD_ENABLEPAGESETUPTEMPLATEHANDLE | lPageSetupTemplate がロード済みの ダイアログボックステンプレートを格納する データブロックを指すことを示す |
| PSD_INHUNDREDTHSOFMILLIMETERS | 1/100 ミリメートルを測定単位とする |
| PSD_INTHOUSANDTHSOFINCHES | 1/1000 インチを測定単位とする |
| PSD_INWININIINTLMEASURE | 実装されない |
| PSD_MARGINS | 初期余白値を rMargin メンバの値に設定する |
| PSD_MINMARGINS | 最小余白値を rMinMargin メンバの値に設定する |
| PSD_NONETWORKBUTTON | 「ネットワーク」ボタンを隠して無効にする |
| PSD_NOWARNING | エラーメッセージを表示しない |
| PSD_RETURNDEFAULT | 「ページ設定」ダイアログボックスを表示せず デフォルトプリンタに関する情報を取得する |
| PSD_SHOWHELP | 「ヘルプ」ボタンを表示する この場合、ダイアログは親ウィンドウを持たなければならない |
#include <windows.h>
#define TITLE TEXT("Kitty on your lap")
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
static TCHAR strText[1024] = "";
static PAGESETUPDLG psd;
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CREATE:
psd.lStructSize = sizeof (PAGESETUPDLG);
psd.hwndOwner = hWnd;
psd.Flags = PSD_INTHOUSANDTHSOFINCHES;
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd , &ps);
GetClientRect(hWnd , &rect);
DrawText(hdc , strText , -1 , &rect , DT_LEFT);
EndPaint(hWnd , &ps);
return 0;
case WM_RBUTTONUP:
PageSetupDlg(&psd);
wsprintf(strText , TEXT("width=%d\nheight=%d\nMargin=%d,%d,%d,%d") ,
psd.ptPaperSize.x , psd.ptPaperSize.y ,
psd.rtMargin.left , psd.rtMargin.top ,
psd.rtMargin.right , psd.rtMargin.bottom);
InvalidateRect(hWnd , NULL , TRUE);
return 0;
}
return DefWindowProc(hWnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow ) {
HWND hwnd;
MSG msg;
WNDCLASS winc;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("KITTY");
if (!RegisterClass(&winc)) return -1;
hwnd = CreateWindow(
TEXT("KITTY") , TITLE ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
NULL , NULL , hInstance , NULL
);
if (hwnd == NULL) return -1;
while(GetMessage(&msg , NULL , 0 , 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
