// Copyright 2005 Doi Shigeki // list050b.cpp // 〜USB-プリンタ・ケーブルを使った外部制御,ダイアログ・ボックス版 // list309.h、list309.rcを一緒にビルドすること #include #include "list309.h" BOOL CALLBACK dlgproc( HWND, UINT, WPARAM, LPARAM ); HANDLE h; // ダイアログ・プロシージャでも使うので // グローバル変数にする int WINAPI WinMain( HINSTANCE hi, HINSTANCE, LPSTR, int ) { if( ! OpenPrinter( "NEC PC-PR101", // シンプルなプリンタを仮に指定 &h, NULL) ){ MessageBox( NULL, "指定のプリンタがオープンできません","err", MB_OK); return 0; } DOC_INFO_1 docinfo; DWORD dwJob; // ジョブの開始 docinfo.pDocName = "My Document"; docinfo.pOutputFile = NULL; docinfo.pDatatype = "RAW"; dwJob = StartDocPrinter( h, 1, (LPBYTE)&docinfo ); if (dwJob == 0) { MessageBox( NULL, "ジョブが開始できません","err", MB_OK); ClosePrinter( h ); return 0; } DialogBox( hi, "DLG_DATA", // ダイアログ・ボックスを開く HWND_DESKTOP, (DLGPROC)dlgproc ); // デバイスのクローズ EndDocPrinter(h ); ClosePrinter(h ); return TRUE; } BOOL CALLBACK dlgproc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { static int sw[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; int i,n,n2; char x; DWORD dwcnt; // ダミー switch(msg){ case WM_COMMAND: n = LOWORD( wp ); if( ID_o0 <= n && n <= ID_o3 ){ // あるチェック・ボックスが操作された n2 = ( n - ID_o0 ) / 10; // ID値は連続して10づつ増加であること sw[ n2 ] = ! sw[ n2 ]; // 値を反転 SendMessage( GetDlgItem( hwnd, n ), BM_SETCHECK, sw[n2], 0); // 表示に反映 x = 0; // 出力データを組み立てる for( i = 0; i < 4; i++){ x = x + ( sw[ i ] << (3 - i) ) ; } StartPagePrinter( h ); // 1バイトを1ページとして出力 WritePrinter( h, &x, 1, &dwcnt ); EndPagePrinter( h ); // 実際の出力開始 } return TRUE; case WM_CLOSE: EndDialog( hwnd, 0 ); return TRUE; } return FALSE; }