ダイアログを使わずに、設定変更を反映するには、ResetDCでプリンタ用デバイスコンテキストを更新する。
ResetDCA function (wingdi.h) - Win32 apps | Microsoft Docs
プリンタの情報
普通に、
// 取得したIDごとに処理を分岐. // Printが選択された時. case ID_ITEM_PRINT: // ID_ITEM_PRINTブロック { // 変数の宣言 HWND hEdit1; // エディットコントロールのハンドルhEdit1. int len; // ウィンドウ名の文字数len. TCHAR *ptszPrinterName; // ウィンドウ名へのポインタptszPrinterName. HDC hPrinterDC; // プリンタのデバイスコンテキストハンドルhPrinterDC. int iRetSD; // StartDocの戻り値iRetSD. int iRetSP; // StartPageの戻り値iRetSP. // エディットボックスのプリンタ名の取得. hEdit1 = GetDlgItem(hwnd, ID_EDIT1); // GetDlgItemでID_EDIT1のハンドルを取得. len = GetWindowTextLength(hEdit1); // GetWindowTextLengthでhEdit1のウィンドウ名の文字数を取得. ptszPrinterName = new TCHAR[len + 1]; // newで長さlen + 1のTCHAR配列バッファを用意. GetWindowText(hEdit1, ptszPrinterName, len + 1); // GetWindowTextでウィンドウ名をptszPrinterNameに格納. // 取得したプリンタ名のプリンタで"ABCDE"を印刷. DOCINFO di = {0}; // DOCINFO構造体diを{0}で初期化. di.cbSize = sizeof(DOCINFO); // sizeofでDOCINFOのサイズを指定. di.lpszDocName = _T("ResetDC"); // ドキュメント名は"ResetDC"とする. hPrinterDC = CreateDC(NULL, ptszPrinterName, NULL, NULL); // CreateDCでptszPrinterNameのデバイスコンテキストハンドルhPrinterDCを取得. if (hPrinterDC != NULL){ // hPrinterDCがNULLでなければ. // 印刷開始 iRetSD = StartDoc(hPrinterDC, &di); // StartDocで印刷ジョブの開始. if (iRetSD > 0){ // 印刷開始成功. iRetSP = StartPage(hPrinterDC); // StartPageでページの開始. if (iRetSP > 0){ // ページ開始成功. TextOut(hPrinterDC, 50, 0, _T("ABCDE"), _tcslen(_T("ABCDE"))); // TextOutでプリンタの(50, 0)の位置に"ABCDE"を描画. EndPage(hPrinterDC); // EndPageでページ終了. } EndDoc(hPrinterDC); // EndDocで印刷ジョブ終了. } DeleteDC(hPrinterDC); // DeleteDCでhPrinterDCを削除. } // バッファの解放. delete [] ptszPrinterName; // deleteでptszPrinterNameを解放. } // 既定の処理へ向かう. break; // breakで抜けて, 既定の処理(DefWindowProc)へ向かう.
これで印刷する。
印刷設定を見ても、
縦になってるよね。
この状態で印刷。
わかりにくいけど縦印刷。
DEVMODEで設定変更して、ResetDCでhPrinterDCを更新。
これで印刷すると、
これもちょっとわかりにくいけど横印刷になっている。
Sample/winapi/ResetDC/ResetDC/src/ResetDC at master · bg1bgst333/Sample · GitHub