ダイアログボックスの表示

 

 あえて紹介するのを迷うくらい簡単なサンプルコードです。

 

 ベースとなっているのは、このスケルトンコードです。

 要点は 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 を指定すると、さらに 最小化ボタンや最大化ボタンが付きます。

 

 

[トップ] [戻る]