// Copyright 2005 Doi Shigeki // list203.cpp コンソールかつマルチスレッド版シンプルなウィンドウプログラム // ランタイムの設定をマルチスレッドにすること #include #include // getch()の宣言 #include #include // スレッド用 DWORD WINAPI tproc( LPVOID ); LRESULT CALLBACK wproc( HWND, UINT, WPARAM, LPARAM ); HINSTANCE hi; // スレッド側でも利用するのでグローバルに置く void main( ) { // ウィンドウの登録,メッセージループ用スレッドの起動 hi = (HINSTANCE)GetWindowLong( HWND_DESKTOP, GWL_HINSTANCE ); WNDCLASSEX wc; // 新しくつくるウインドクラス用 memset( &wc, 0, sizeof( wc )); wc.cbSize = sizeof(WNDCLASSEX); // WNDCLASSEXの大きさ wc.lpfnWndProc = wproc; // このクラスの持つウインドプロシージャ wc.hInstance = hi; wc.hCursor = LoadCursor( NULL, IDC_ARROW ); wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH ); wc.lpszClassName = "wc00"; // このウィンドウクラスの名前 if(! RegisterClassEx( &wc )) return ; // ウィンドクラスの登録 // メッセージループのスレッドを起動 DWORD id; CreateThread( NULL, // pointer to thread security attributes 0, // initial thread stack size, 0はデフォルト tproc, // pointer to thread function NULL, // argument for new thread 0, // creation flags &id ); // pointer to returned thread identifier printf("\n push any key"); getch(); } // // メッセージループのためのスレッド // 必ずスレッド側でウィンドウを作ること // DWORD WINAPI tproc( LPVOID ) { MSG msg; CreateWindow( "wc00", // クラスの名前 "コンソールかつマルチスレッド版hello", WS_OVERLAPPEDWINDOW | WS_VISIBLE, // ウィンドウの属性 CW_USEDEFAULT, CW_USEDEFAULT, // 位置は指定しない 400, 300, // ウィンドウの大きさ HWND_DESKTOP, // 親はディスクトップ NULL, hi, NULL ); while( GetMessage( &msg, NULL, 0, 0 ) ){ DispatchMessage( &msg ); } return 0; } // ウィンドウプロシージャ,描画オブジェクトの準備と再描画を行う LRESULT CALLBACK wproc( HWND hwnd, UINT imsg, WPARAM wp, LPARAM lp ) { switch(imsg){ case WM_PAINT:{ PAINTSTRUCT ps; char *p = "hello Windows"; BeginPaint( hwnd, &ps ); TextOut( ps.hdc, 10, 10, p, strlen( p )); EndPaint( hwnd, &ps ); break; } case WM_DESTROY: // 必ず必要,DefWindowProcでは処理されない PostQuitMessage( 0 ); // メッセージループを終了させる break; default: return DefWindowProc( hwnd, imsg, wp, lp ); } return 0; }