HANDL hThread_A = NULL;// スレッドAのハンドル HANDL hThread_B = NULL;// スレッドBのハンドル CRITICAL_SECTION Critical_Se; // クリティカルセッション // メイン int APIENTRY WinMain(HINSTANCE hinst, HINSTANCE hprev_inst, LPSTR Cmd_Line, int Cmd_Show) { InitializeCriticalSection( &Critical_Se );// クリティカルセッションの初期化 // メッセージループなど処理 DeleteCriticalSection( &Critical_Se);// クリティカルセッションの削除 } void WINAPI Thread_A() { EnterCriticalSection( &Critical_Se );// クリティカルセッション開始 // クリティカルセッションが使用されているなら、↑ここで順番待ち // ↓ここから // ↑ここまでが、スレッドAで、安全な処理ができる部分 LeaveCriticalSection( &Critical_Se );//クリティカルセッション終了 DWORD Thread_ExitCode = 0; GetExitCodeThread( hThread_A, &Thread_ExitCode );// スレッド終了コード ExitThread( Thread_ExitCode );// スレッドの終了 hThread_A = NULL; } void WINAPI Thread_B() { EnterCriticalSection( &Critical_Se );// クリティカルセッション開始 // クリティカルセッションが使用されているならここで順番待ち // ↓ここから // ↑ここまでが、スレッドBで、安全な処理ができる部分 LeaveCriticalSection( &Critical_Se );//クリティカルセッション終了 DWORD Thread_ExitCode = 0; GetExitCodeThread( hThread_B, &Thread_ExitCode );// スレッド終了コード ExitThread( Thread_ExitCode );// スレッドの終了 hThread_B = NULL; } // 適当な関数 void ...() { // セキュリティ属性の初期化 SECURITY_ATTRIBUTES Security = { sizeof(SECURITY_ATTRIBUTES), NULL, true }; DWORD Thread_A_ID = 0;// スレッドID DWORD Thread_B_ID = 0;// スレッドID // スレッドA作成 hThread_A = CreateThread( &Security, 0, (LPTHREAD_START_ROUTINE)Thread_A, NULL, 0, &Thread_A_ID ); // この関数後にスレッドハンドル hThread_Aが NULL なら失敗 // スレッドB作成 hThread_B = CreateThread( &Security, 0, (LPTHREAD_START_ROUTINE)Thread_B, NULL, 0, &Thread_B_ID ); // この関数後にスレッドハンドル hThread_Bが NULL なら失敗 }
// ウインドウプロシージャ // hwnd:ウインドウハンドル msg:変換されたメッセージ // wParam・lParam:メッセージパラメータ(各メッセージの情報) LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { // このswitch文でメッセージを受け取ります switch (msg) { case WM_LBUTTONDOWN : // ここに左クリックしたときの処理を入れる break; // 右上のXボタンなどが押された場合 case WM_CLOSE : DestroyWindow(hwnd); break; // これがないと終了できない case WM_DESTROY : PostQuitMessage(0); // 終了メッセージ break; // 処理をしないメッセージは、ここ↓で処理 default : return ( DefWindowProc(hwnd, msg, wParam, lParam) ); } return 0; } // メイン関数 int APIENTRY WinMain(HINSTANCE hinst, HINSTANCE hprev_inst, LPSTR Cmd_Line, int Cmd_Show) { // ウインドウの基本設定 WNDCLASS wc; memset( &wc, 0, sizeof(WNDCLASS)); wc.style = CS_DBLCLKS; // ダブルクリックを使用可能に wc.lpfnWndProc = WndProc; // ウインドウプロシージャの指定 wc.hInstance = hinst; // インスタンスの指定 wc.hCursor = LoadCursor(hinst, MAKEINTRESOURCE(IDC_ARROW)); // リソース内のカーソルを指定 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); // 背景色 wc.lpszClassName = "登録名"; // この設定の登録名 if( !RegisterClass(&wc) ) // 設定を登録 return FALSE; // ウインドウを作成 hWnd = CreateWindow( "登録名", // 登録されている設定の名前 "ういんどう", // ウインドウのタイトル WS_CAPTION | WS_SYSMENU, // タイトルバー・終了ボタン有効 0, 0, // 左上の位置をX:0 Y:0 640, 480, //サイズを640x480(クライアント領域+外枠) NULL, NULL, hinst, // インスタンスの指定 NULL); MSG msg; // メッセージを格納するMSG構造体 while( GetMessage(&msg, NULL, 0, 0) ) // WM_QUIT(終了)メッセージが入ると抜ける { TranslateMessage( &msg ); // 仮想キー メッセージを文字メッセージに変換 DispatchMessage( &msg ); // ウィンドウ プロシージャにメッセージを送る Sleep(1); // プロセッサ使用率を軽減するため、Sleep()関数を入れておきます } return 0; }DialogBox関数・CreateDialog関数で作成されたダイアログはウインドウプロシージャのみで動作します
// 描画するウインドウのハンドル HWND hWnd = NULL; // 動作中は常に下記の「hVS」ビットマップを選択している // hDC(ウインドウのDC)に「SRCCOPY」で転送される HDC VSDC = NULL; // ビットマップ用。ロードしたビットマップを選択している // VSDCに「SRCPAINT」で転送される HDC BmpDC = NULL; // ビットマップ用。BmpDCの白黒マスクなどを入れる // VDDCに「SRCAND」で転送される HDC BmpDC_M = NULL; HBITMAP hVS,// VSDCのビットマップ hVSOld, // VSDCの前の状態 hBmp1, // ビットマップ1 hBmp2, // ビットマップ2 hBmp1_M, // ビットマップ1のマスク hBmp2_M; // ビットマップ2のマスク // ウインドウメッセージ処理 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { /* ウインドウ作成時にデバイスコンテキストとGDIオブジェクトを初期化・ロードしてます (別にここでなくてもいいです) 先に作れるものは作り、オーバーヘッドを減らします*/ case WM_CREATE : { // ←この括弧は、case内でローカル変数を使うため、{}でブロックします // ウインドウのDCを取得 HDC hDC = GetDC(hwnd); // hDCと互換性のあるDCを作成します VSDC = CreateCompatibleDC(hDC); BmpDC = CreateCompatibleDC(hDC); BmpDC_M = CreateCompatibleDC(hDC); // hDCのビットマップと互換性のあるビットマップを作成します hVS = CreateCompatibleBitmap(hDC,640,480); // ウインドウから取得したDCを解放します ReleaseDC(hWnd,hDC); // VSDCにビットマップハンドルを渡します hVSOld = (HBITMAP) SelectObject(VSDC, hVS); // ビットマップをファイルから読み込みます // 「Bmp」フォルダにあるCG1・CG2・CG1_M・CG2_Mを読み込みます hBmp1 = (HBITMAP)LoadImage(NULL, "Bmp\\CG1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE| LR_CREATEDIBSECTION); hBmp2 = (HBITMAP)LoadImage(NULL, "Bmp\\CG2.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE| LR_CREATEDIBSECTION); hBmp1_M = (HBITMAP)LoadImage(NULL, "Bmp\\CG1_M.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE| LR_CREATEDIBSECTION); hBmp2_M = (HBITMAP)LoadImage(NULL, "Bmp\\CG2_M.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE| LR_CREATEDIBSECTION); } break; // 描画処理 case WM_PAINT : { /* BmpDC BmpDC_Mにビットマップオブジェクトを渡します DCには指定されたビットマップが渡され、戻り値として以前のハンドルが戻ってきます この状態で初めてビットマップをGDIで操作できます つまり、ビットマップにアクセスすためにデバイスコンテキストを通さないといけないわけです*/ HBITMAP hBmpOld = (HBITMAP)SelectObject( BmpDC, hBmp1), hBmpOld_M = (HBITMAP)SelectObject( BmpDC_M, hBmp1_M); // VSDCのビットマップを黒く塗りつぶす BitBlt( VSDC, 0, 0, 640, 480, NULL, 0, 0, BLACKNESS ); /* hBmp1_MをAND転送(SRCAND)してから、hBmp1をOR転送(SRCPAINT)する すでにVSDCにはhVSビットマップが選択されているので、このビットマップに転送される*/ BitBlt( VSDC, 0,0,32,32, BmpDC_M, 64, 64, SRCAND ); BitBlt( VSDC, 0,0,32,32, BmpDC, 64, 64, SRCPAINT ); /* デバイスコンテキストに別のビットマップを指定します 以前の状態はhBmpOld・hBmpOld_Mに残しているので、ここではビットマップオブジェクトのハンドルを渡すだけです*/ SelectObject( BmpDC, hBmp2); SelectObject( BmpDC_M, hBmp2_M); // hBmp2_MをAND転送(SRCAND)してから、hBmp2をOR転送(SRCPAINT)する BitBlt( VSDC, 0,0,32,32, BmpDC_M, 64, 64, SRCAND ); BitBlt( VSDC, 0,0,32,32, BmpDC, 64, 64, SRCPAINT ); // 転送が終わったので元に戻します SelectObject( BmpDC, hBmpOld ); SelectObject( BmpDC_M, hBmpOld_M ); /* BeginPaint()によって再描画に必要な部分が更新されます BeginPaint() 〜 EndPaint()を使用しないとメニューなどが更新されません*/ PAINTSTRUCT ps; HDC hDC = BeginPaint( hwnd, &ps ); // VSDCに入っているhVSビットマップに転送されているので、これをWindowのDCに転送 BitBlt( hDC, 0, 0, 640, 480, VSDC, 0, 0, SRCCOPY ); // WindowのDCに文字を表示する TextOut( hDC, 0, 40, "文字表示だよ", lstrlen("文字表示だよ")); EndPaint( hWnd, &ps ); } break; // アプリケーション終了 case WM_DESTROY : SelectObject(VSDC,hVSOld); DeleteObject(hVS); DeleteObject(hBmp1); DeleteObject(hBmp2); DeleteObject(hBmp1_M); DeleteObject(hBmp2_M); DeleteDC(VSDC); DeleteDC(BmpDC); DeleteDC(BmpDC_M); break; } }
XCopy A2OA_WF2_MS-06D1.Chernarus\MS_Script\_expFull.sqs A2OA_WF2_MS-06D1.Chernarus_lite\MS_Script /s /y XCopy A2OA_WF2_MS-06D1.Chernarus\MS_Script\_expFull.sqs A2OA_WF2_MS-06D1.Porto\MS_Script /s /y XCopy A2OA_WF2_MS-06D1.Chernarus\common A2OA_WF2_MS-06D1.Chernarus_lite\common /s /y XCopy A2OA_WF2_MS-06D1.Chernarus\common A2OA_WF2_MS-06D1.Porto\common /s /yと、テキストに書いて、このファイルをバッチの拡張子「.bat」にします。
Copy /b abc.7z.001+abc.7z.002 def.7z<abc.7z.001> <abc.7z.002>
「ばけらった ハウス」トップページに戻る