FrontPage

ウィンドウの生成と表示

Windowsアプリケーションの基本。

制約

.NET関数・MFCを使用しないこと。

#include <tchar.h>
#include <windows.h>
#include <commdlg.h>


#define PROC_NG -1
#define FUNC_NG_NEGATIVE -1
#define FUNC_NG 0
#define END_MSG 0
#define PROCESS_OK 0
#define RET_OK 0
#define RET_NG -1

typedef unsigned char u1b;


LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp );// プロトタイプ宣言
u1b wndRootin ( HINSTANCE de_hInst, HWND* de_hWnd );

int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd )
{
    HWND hWnd;                                                  // ウィンドウハンドル 
    MSG msg;                                                    // メッセージ 
   u1b rtnCod = RET_OK;                                         // リターンコード 
                                                                // 
   for ( ; ; )                                                  // 無限ループ 
   {                                                            //
      rtnCod = wndRootin( hInst,                                // ウィンドウ作成関数
         &hWnd );                                               // IN: hInst OUT: hWnd
      if( RET_OK != rtnCod )                                    // リターン判定 
      {                                                         // OK以外の場合 
         break;                                                 // 処理終了 
      }                                                         //
                                                                //
       ShowWindow( hWnd, SW_SHOW );                             // ウィンドウを表示する
       UpdateWindow( hWnd );                                    // ウィンドウ更新 
                                                                //
       for( ; ; )                                               // メッセージループ
       {                                                        // 終了メッセージがくるまで 
           BOOL ret = GetMessage( &msg, NULL, 0, 0 );           // キューからメッセージを取得する OUT: msg
           if( FUNC_NG == ret || END_MSG == ret )               // リターンコードの判定 
           {                                                    // 取得エラーまたは終了メッセージ  
               break;                                           // 処理終了 
           }                                                    //
           else                                                 // 
           {                                                    // その他
               TranslateMessage( &msg );                        // メッセージを処理する
               DispatchMessage( &msg );                         // OUT: msg
           }                                                    //
       }                                                        //
                                                                //
      break;                                                    // ループを抜ける 
   }                                                            //
                                                                //
    return ( rtnCod );                                          // リターンコードを返して終了 
}                                                         

LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp )// ウィンドウプロシージャ
{                                                               //
    switch( msg )                                               // メッセージを判定 
    {                                                           //
    case WM_DESTROY:                                            // ウィンドウ破棄のとき 
        PostQuitMessage( END_MSG );                             // 終了メッセージを送る 
        return PROCESS_OK;                                      // 正常終了 
    }                                                           // 
                                                                //
    return DefWindowProc( hWnd, msg, wp, lp );                  // 他のメッセージは、デフォルトの処理を行う
                                                                // 
}

u1b wndRootin ( HINSTANCE de_hInst, HWND* de_hWnd )
{                                                               //
   WNDCLASSEX wc;                                               // ウィンドウクラス構造体
   u1b rtnCod = RET_OK;                                         // リターンコード 
                                                                //
   for ( ; ; )                                                  // 無限ループ 
   {                                                            //
      wc.cbSize = sizeof( wc );                                 // ウィンドウクラスの設定 サイズ 
       wc.style = CS_HREDRAW | CS_VREDRAW;                      // スタイル
       wc.lpfnWndProc = WndProc;                                // ウィンドウプロシージャ
       wc.cbClsExtra = 0;                                       // 拡張情報1
       wc.cbWndExtra = 0;                                       // 拡張情報2
       wc.hInstance = de_hInst;                                 // インスタンスハンドル
       wc.hIcon = ( HICON )LoadImage(                           // アイコン
         NULL, MAKEINTRESOURCE( IDI_APPLICATION ), IMAGE_ICON,  //
           0, 0, LR_DEFAULTSIZE | LR_SHARED );                  //
                                                                //        
       wc.hIconSm = wc.hIcon;                                   // 子アイコン
       wc.hCursor = (HCURSOR)LoadImage(                         // マウスカーソル
           NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR,      //
           0, 0, LR_DEFAULTSIZE | LR_SHARED );                  //
                                                                //
       wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);  // ウィンドウ背景
       wc.lpszMenuName = NULL;                                  // メニュー名
       wc.lpszClassName = _T("Menu");                           // ウィンドウクラス名
                                                                //
       if( FUNC_NG == RegisterClassEx( &wc ) )                  // ウィンドウクラスを登録する
      {                                                         //
         MessageBox(NULL, "ウィンドウクラスの登録失敗", "StyleMod", MB_OK);// 画面表示 
         rtnCod = RET_NG;                                       // 手続き失敗処理  
         break;                                                 // 処理終了 
      }                                                         //
                                                                // 
       *de_hWnd = CreateWindow(                                 // ウィンドウを作成する
           wc.lpszClassName,                                    // ウィンドウクラス名
           _T("StyleMod"),                                      // タイトルバーに表示する文字列
           WS_OVERLAPPEDWINDOW,                                 // ウィンドウの種類
           CW_USEDEFAULT,                                       // ウィンドウを表示する位置(X座標)
           CW_USEDEFAULT,                                       // ウィンドウを表示する位置(Y座標)
           CW_USEDEFAULT,                                       // ウィンドウの幅
           CW_USEDEFAULT,                                       // ウィンドウの高さ
           NULL,                                                // 親ウィンドウのウィンドウハンドル
           NULL,                                                // メニューハンドル
           de_hInst,                                            // インスタンスハンドル
           NULL );                                              // その他の作成データ
                                                                //
       if( NULL == *de_hWnd )                                   // ウインドウが作成できたか 
      {                                                         // 作成に失敗 
         MessageBox(NULL, "ウィンドウの作成失敗", "StyleMod", MB_OK); // 画面表示 
         rtnCod = RET_NG;                                       // 手続き失敗処理  
         break;                                                 // 処理終了 
      }                                                         //
                                                                //
   break;                                                       // ループを抜ける 
   }                                                            //
                                                                //
   return ( rtnCod );                                           // リターンコードを返して終了 
}

参考ページ

http://www.geocities.jp/ky_webid/win32c/index.html
http://lets-go.hp.infoseek.co.jp/c_setting08.html


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-02-08 (月) 02:08:06 (5185d)