IPrintDialogCallback
COM公式ドキュメント
印刷プロパティシートの表示中に、アプリケーションが PrintDlgEx 関数から通知やメッセージを受け取れるようにするメソッドを提供します。
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
システムが印刷プロパティシートの [全般] ページの初期化を完了したときに、PrintDlgEx によって呼び出されます。
戻り値
型: HRESULT
PrintDlgEx 関数が既定の動作を実行しないようにするには、S_OK を返します。
PrintDlgEx に既定の動作を実行させるには、S_FALSE を返します。現在のところ、PrintDlgEx は InitDone の呼び出し後に既定の処理を一切実行しません。
解説(Remarks)
コールバックオブジェクトが IObjectWithSite インターフェイスを実装している場合、PrintDlgEx 関数は IObjectWithSite::SetSite メソッドを呼び出して、IPrintDialogServices ポインターをコールバックオブジェクトに渡します。PrintDlgEx 関数は、InitDone メソッドを呼び出す前に IObjectWithSite::SetSite メソッドを呼び出します。これにより、InitDone の実装内で IPrintDialogServices のメソッドを使用して、現在選択されているプリンターに関する情報を取得できます。
印刷プロパティシートの [全般] ページで、インストール済みプリンターの一覧からユーザーが別のプリンターを選択したときに、PrintDlgEx によって呼び出されます。
戻り値
型: HRESULT
PrintDlgEx 関数が既定の動作を実行しないようにするには、S_OK を返します。
PrintDlgEx に既定の動作を実行させるには、S_FALSE を返します。既定の動作には、部数、部単位で印刷、印刷範囲 の各項目の調整が含まれます。
印刷プロパティシートの [全般] ページ下部にある子ダイアログボックスに送られるメッセージを、アプリケーションで処理する機会を与えるために、PrintDlgEx によって呼び出されます。
| hDlg | HWND | in | [全般] ページ下部にある子ダイアログボックスへのハンドルです。 |
| uMsg | DWORD | in | 受信するメッセージの識別子です。 |
| wParam | WPARAM | in | メッセージに関する追加情報です。正確な意味は uMsg パラメーターの値によって異なります。 |
| lParam | LPARAM | in | メッセージに関する追加情報です。正確な意味は uMsg パラメーターの値によって異なります。 uMsg パラメーターが WM_INITDIALOG メッセージを示す場合、lParam は、プロパティシートの作成時に指定された値を格納した PRINTDLGEX 構造体へのポインターです。 |
| pResult | LRESULT* | inout | メッセージに対してダイアログボックスプロシージャが返すべき結果を示します。メッセージを処理した場合、ポイント先の値は TRUE にする必要があります。それ以外の場合は FALSE、またはメッセージの種類に応じた適切な値にする必要があります。 |
戻り値
型: HRESULT
IPrintDialogCallback::HandleMessage の実装がメッセージを処理した場合は S_OK を返します。この場合、PrintDlgEx 関数は既定のメッセージ処理を一切実行しません。
PrintDlgEx に既定のメッセージ処理を実行させたい場合は S_FALSE を返します。
解説(Remarks)
WM_NOTIFY メッセージによって渡される通知メッセージについては、戻り値を設定するために SetWindowLong 関数を DWL_MSGRESULT 値とともに使用する必要があります。SetWindowLong を呼び出す際は、GetParent(hDlg) を使用して、子ウィンドウの親である [全般] ページの DWL_MSGRESULT 値を設定します。
[全般] ページ下部にある子ウィンドウの既定のダイアログボックスプロシージャは、WM_INITDIALOG メッセージを HandleMessage メソッドに渡す前に処理します。子ウィンドウに送られるその他すべてのメッセージについては、HandleMessage が最初にメッセージを受け取ります。その後、HandleMessage の戻り値によって、既定のダイアログプロシージャがメッセージを処理するか無視するかが決まります。
HandleMessage が WM_CTLCOLORDLG メッセージを処理する場合は、ダイアログボックスの背景を描画するための有効なブラシハンドルを返す必要があります。一般に、HandleMessage がいずれかの WM_CTLCOLOR* メッセージを処理する場合は、指定されたコントロールの背景を描画するための有効なブラシハンドルを返す必要があります。
HandleMessage メソッドから EndDialog 関数を呼び出さないでください。代わりに、HandleMessage は PostMessage 関数を呼び出して、IDABORT 値を持つ WM_COMMAND メッセージをダイアログボックスプロシージャにポストできます。IDABORT をポストすると、印刷プロパティシートが閉じ、PrintDlgEx は PRINTDLGEX 構造体の dwResultAction メンバーに PD_RESULT_CANCEL を返します。HandleMessage がダイアログボックスを閉じた理由を知る必要がある場合は、HandleMessage メソッドとアプリケーションとの間で独自の通信メカニズムを用意する必要があります。
[全般] ページ下部にある子ダイアログボックスの標準コントロールはサブクラス化できます。これらの標準コントロールは、[印刷] ダイアログボックスにあるものと同様です。ただし、既定のダイアログボックスプロシージャもコントロールをサブクラス化する場合があります。このため、コントロールのサブクラス化は HandleMessage が WM_INITDIALOG メッセージを処理するときに行う必要があります。こうすることで、ダイアログボックスプロシージャが設定したサブクラスプロシージャよりも先に、独自のサブクラスプロシージャがコントロール固有のメッセージを受け取ることが保証されます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IPrintDialogCallback "{5852A2C3-6530-11D1-B6A3-0000F8757BF9}" #usecom global IPrintDialogCallback IID_IPrintDialogCallback "{}" #comfunc global IPrintDialogCallback_InitDone 3 #comfunc global IPrintDialogCallback_SelectionChange 4 #comfunc global IPrintDialogCallback_HandleMessage 5 sptr,int,sptr,sptr,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IPrintDialogCallback "{5852A2C3-6530-11D1-B6A3-0000F8757BF9}" #usecom global IPrintDialogCallback IID_IPrintDialogCallback "{}" #comfunc global IPrintDialogCallback_InitDone 3 #comfunc global IPrintDialogCallback_SelectionChange 4 #comfunc global IPrintDialogCallback_HandleMessage 5 sptr,int,sptr,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。