ダイアログボックスの表示
あえて紹介するのを迷うくらい簡単なサンプルコードです。
ベースとなっているのは、この
スケルトンコードです。要点は CreateDialog() 関数と、ダイアログプロシージャ DlgProc() です。
灰色の部分は、スケルトンコードとしてありきたりの部分です。
EXSTYLE には WS_EX_TOOLWINDOW を指定してみました。タイトルバーの部分が少ししゃれた小さなバーになる指定です。
■ リソーススクリプト "dialog.rc"
// // RESOURCE-SCRIPT "dialog.rc" // brc32 -iC:\borland\bcc55\include dialog.rc dlgsample.exe MYDIALOG DIALOGEX DISCARDABLE -10, -10, 160, 100 STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_SIZEBOX | WS_MAXIMIZEBOX | DS_SETFONT EXSTYLE WS_EX_TOOLWINDOW // MENU MYMENU1 // この指定により、ダイアログボックスにもメニューを持たせることができます。もちろんメニューのスクリプト(定義)も忘れずに. CAPTION "取っての小さなダイアログボックス" FONT 14, "MS P明朝" BEGIN END
■ ソースコード "dlgsample.cpp"
// // PROGRAM "dlgsample.cpp" // bcc32 -tW dlgsample.cpp #define _WIN32_WINNT 0x400 #define WINVER 0x400 #define _WIN32_IE 0x0501 #define STRICT #include <windows.h> #include <windowsx.h> #include <commctrl.h> #include <commdlg.h> BOOL InitApp( HINSTANCE ) ; BOOL InitWnd( HINSTANCE, int ) ; LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ) ; LRESULT CALLBACK DlgProc( HWND, UINT, WPARAM, LPARAM ) ; HINSTANCE hAppInst ; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hInst_prev, LPSTR lpszCmdLine, int nCmdShow ) { BOOL ret ; MSG msg ; if ( ! hInst_prev ) { if ( ! InitApp( hInstance )) return FALSE ; } if ( ! InitWnd( hInstance, nCmdShow )) return FALSE ; while ( 0 != ( ret = GetMessage( &msg, NULL, 0, 0 ))) { if ( ret != -1 ) { TranslateMessage( &msg ) ; DispatchMessage( &msg ) ; } } return ( msg.wParam ) ; } BOOL InitApp( HINSTANCE hInstance ) { WNDCLASS wc ; wc.style = CS_HREDRAW | CS_VREDRAW ; wc.lpfnWndProc = WndProc ; wc.cbClsExtra = 0 ; wc.cbWndExtra = 0 ; wc.hInstance = hInstance ; wc.hIcon = ( HICON ) LoadIcon ( NULL, IDI_APPLICATION ) ; wc.hCursor = ( HCURSOR ) LoadCursor( NULL, IDC_ARROW ) ; wc.hbrBackground = ( HBRUSH ) GetStockObject( LTGRAY_BRUSH ) ; wc.lpszMenuName = NULL ; wc.lpszClassName = ( LPCTSTR ) "MyApp_Classification_1" ; hAppInst = hInstance ; return( RegisterClass( &wc )) ; } BOOL InitWnd( HINSTANCE hInstance, int nCmdShow ) { HWND hWnd ; hWnd = CreateWindow( (LPCTSTR) "MyApp_Classification_1", (LPCTSTR) "My Project", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT , CW_USEDEFAULT, CW_USEDEFAULT , NULL, NULL, hInstance, NULL ) ; if ( ! hWnd ) return FALSE ; ShowWindow( hWnd, nCmdShow ) ; UpdateWindow( hWnd ) ; SetFocus( hWnd ) ; return TRUE ; } LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_CREATE : CreateDialog( hAppInst, "MYDIALOG", hWnd, (DLGPROC)DlgProc ) ; // たったのこれだけなのです. break ; case WM_COMMAND : switch( LOWORD( wParam )) { default : return( DefWindowProc( hWnd, msg, wParam, lParam )) ; } break ; case WM_CLOSE : if( IDOK != MessageBox( NULL , "終了しますか?" , "Confirmation" , MB_OKCANCEL | MB_ICONQUESTION )) break ; DestroyWindow( hWnd ) ; break ; case WM_DESTROY : PostQuitMessage( 0 ) ; break ; default : return( DefWindowProc( hWnd, msg, wParam, lParam )) ; } return 0L ; } LRESULT CALLBACK DlgProc( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp ) { switch( msg ) { case WM_INITDIALOG : return FALSE ; case WM_COMMAND : switch( LOWORD( wp )) { case IDOK : break ; case IDCANCEL : break ; } break ; case WM_CLOSE : DestroyWindow( hWnd ) ; // CreateDialog() 関数による場合はこちら(モードレスダイアログの場合). // EndDialog( hWnd , 0 ) ; // DialogBox() 関数による場合はこちら(モーダルダイアログの場合). break ; case WM_DESTROY : break ; } return FALSE ; }
コンパイルは、
bcc32 -tW dlgsample.cpp で、ソースコードをコンパイル後、リソースのリンク、
brc32 dialog.rc dlgsample.exe
です。
この例では、出現したダイアログボックスは常に、親ウィンドウより前面のポジションを保ち続けます。これを変えたい場合は、CreateDialog() の親ウィンドウハンドルのパラメータを NULL にしましょう。
WS_MINIMIZEBOX や WS_MAXMIZEBOX を指定すると、さらに 最小化ボタンや最大化ボタンが付きます。
[トップ] [戻る]