開発者テクノロジ | C++
C プログラミング言語の拡張機能として作成された高レベルの汎用プログラミング言語。低レベルのメモリ操作機能に加えて、オブジェクト指向、汎用、関数型の機能を備えています。
このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
WindowsAPIのPrintDlgEx()を使用して印刷ダイアログを表示させているが、Windows11 22H2におけるUI改善により印刷ダイアログのデザイン変更があり、既存の印刷ダイアログが表示されなくなり、新しい「Win32アプリケーションから印刷しています」という印刷ダイアログ画面が表示されるように変更になった。
PrintDlgEx()では以下を指定していますが、指定している情報(プリンタ名、用紙サイズ、印刷方向)が新しい「Win32アプリケーションから印刷しています」という印刷ダイアログ画面では有効にならない。原因を教えて下さい。
PRINTDLGEXA構造体で以下を指定
・hDevNames:プリンタ名
・hDevMode:DEVMODE構造体
dmPaperSize:用紙サイズ
dmOrientation:印刷方向
原因は判りませんが、いつまで使えるかわからないけど以前のダイアログをつかうという小細工なら。
PRINTDLGEX pdx = { 0 };
pdx.lStructSize = sizeof(pdx);
pdx.nPageRanges = 1;
pdx.nMaxPageRanges = 1;
pdx.lpPageRanges = (PRINTPAGERANGE*)GlobalAlloc(GPTR, pdx.nMaxPageRanges * sizeof(PRINTPAGERANGE));
if (!pdx.lpPageRanges)
{
goto CLEANUP;
}
pdx.lpPageRanges[0] = { 1,5 };
pdx.nMinPage = 1;
pdx.nMaxPage = 5;
pdx.nCopies = 1;
pdx.nStartPage = START_PAGE_GENERAL;
pdx.Flags = PD_RETURNDC | PD_PAGENUMS | PD_DISABLEPRINTTOFILE;
pdx.hDevMode = (DEVMODE*)GlobalAlloc(GPTR, sizeof(DEVMODE));
if (!pdx.hDevMode)
{
goto CLEANUP;
}
else
{
DEVMODE* pdevmode = (DEVMODE*)pdx.hDevMode;
wcscpy_s(&pdevmode->dmDeviceName[0], CCHDEVICENAME, L"Microsoft XPS Document Writer");
pdevmode->dmSpecVersion = DM_SPECVERSION;
pdevmode->dmSize = sizeof(DEVMODE);
pdevmode->dmFields = DM_ORIENTATION | DM_PAPERSIZE;
pdevmode->dmOrientation = DMORIENT_LANDSCAPE;
pdevmode->dmPaperSize = DMPAPER_A3;
}
pdx.hwndOwner = ::GetDesktopWindow();//デスクトップのHWNDを設定すると以前のダイアログになるという
PrintDlgEx(&pdx);
CLEANUP:
GlobalFree(pdx.lpPageRanges);
GlobalFree(pdx.hDevMode);
20250822: DEVMODEのメモリ確保間違え修正