ホーム > カテゴリ > C/C++ >

ヘッダーコントロールを作成する(C/C++版)

ヘッダーコントロールを作成するサンプルです。

サンプルの実行画面

ソースコード

[Sample67.c]

//--------------------------------------------------------------------------------------
//  ■ヘッダーコントロールを作成する■ Sample NO.67
//
//--------------------------------------------------------------------------------------

//リンクの設定
//comctl32.lib をリンクしてください。

#include <windows.h>
#include <commctrl.h>

#define ID_HEADER   100

HWND  hHeader;     //ヘッダーコントロール
int   index[3];    //ヘッダーコントロールのアイテムのID

//ウインドウを中央にする為にX座標(LEFT)とY座標(TOP)算出するマクロ
#define ScreenCenterX(Width) ((0)<((int)((GetSystemMetrics(SM_CXSCREEN)- Width) / 2)) ? ((int)((GetSystemMetrics(SM_CXSCREEN)- Width) / 2)) :(0))
#define ScreenCenterY(Height) ((0)<((int)((GetSystemMetrics(SM_CYSCREEN)- Height) / 2)) ? ((int)((GetSystemMetrics(SM_CYSCREEN)- Height) / 2)) :(0))

//いつものプロシージャ
HWND CreateMainWindow(int Width,int Height,LPCTSTR Caption,HINSTANCE hInstance,int nCmdShow,WNDPROC lpfnWndProc, DWORD dwstyle,DWORD dwExstyle,LPCTSTR MenuID,HICON hIcon);
HWND CreateControlWindow(HWND hwndParent, int Left, int Top,int Width, int Height,int dwExStyle ,int dwFlag ,LPCTSTR Caption, LPCTSTR ClassName,HMENU ChildID,HINSTANCE hInstance);
int  WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow);
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);


//------------------------------------------------------
//■関数 CreateMainWindow
//■用途 メインウインドウを作成する
//■引数
//  Width       ...ウインドウの横幅
//  Height      ...ウインドウの縦幅
//  Caption     ...タイトル名
//  hInstance   ...インスタンスハンドル
//  nCmdShow    ...ウインドウの表示形態
//  lpfnWndProc ...コールバックプロシージャ
//  dwstyle     ...ウインドウスタイル
//  dwExstyle   ...拡張ウインドウスタイル
//  MenuID      ...メニューのID
//  hIcon       ...アイコン
//■戻り値
//  ウインドウのハンドル
//------------------------------------------------------
HWND CreateMainWindow(int Width,int Height,LPCTSTR Caption,HINSTANCE hInstance,int nCmdShow,WNDPROC lpfnWndProc, DWORD dwstyle,DWORD dwExstyle,LPCTSTR MenuID,HICON hIcon)
{
    HWND hWnd;         //メインウインドウのハンドル
    WNDCLASS myClass;  //WNDCLASS構造体
    
    //WNDCLASS構造体を0で初期化
    ZeroMemory(&myClass,sizeof(WNDCLASS));
 
//--->WNDCLASS構造体の設定&ウインドウクラスの登録

    myClass.style =CS_HREDRAW | CS_VREDRAW;       //ウインドウスタイルを設定 
    myClass.lpfnWndProc   = lpfnWndProc;          //コールバックプロシージャへのポインタ
    myClass.hInstance=hInstance;                  //インスタンスハンドルを設定
    myClass.hCursor=LoadCursor(NULL, IDC_ARROW);  //カーソルの設定(Windows標準リソースを使用)  
    myClass.hbrBackground=(HBRUSH)COLOR_WINDOW;   //ウインドウの背景を設定(デフォルトカラー)
    myClass.lpszClassName="TForm";                //クラス名の設定(Borland Delphi風)  
    myClass.hIcon =hIcon;                         //アイコンの指定
    myClass.lpszMenuName=MenuID;                  //メニューの設定

    //ウィンドウ クラスdを登録
    RegisterClass(&myClass); 
    
//--->ウインドウの作成&表示
   
  //メインウインドウの生成
  hWnd = CreateWindowEx(
           dwExstyle,            //拡張ウインドウスタイル
           "TForm",              //登録されたクラス名のアドレス 
           Caption,              //ウインドウ名
           dwstyle,              //ウインドウスタイルを設定
           ScreenCenterX(Width), //X座標の位置設定
           ScreenCenterY(Height),//Y座標の位置設定
           Width,                //横幅を設定
           Height,               //縦幅を設定
           NULL,                 //親ウインドウを設定
           NULL,                 //メニューを設定
           hInstance,            //インスタンスを識別
           NULL);                //作成したウインドウに渡すデータへのポインタ
 
  //ウインドウの表示(表示方法はnCmdShowに従う)
  ShowWindow(hWnd, nCmdShow);
  return(hWnd);
}
//------------------------------------------------------
//■関数名  ControlCreate
//■用途    ウインドウ(コントロール)を作成
//■引数
//       hwndParent ...親ウインドウのハンドル
//       Left       ...作成するウインドウの左隅のX座標
//       Top        ...作成するウインドウの左隅のY座標
//       Width      ...作成するウインドウの横幅
//       Height     ...作成するウインドウの縦幅
//       dwExStyle  ...ウインドウの拡張フラグ
//       dwFlag     ...ウインドウの作成フラグ
//       Caption    ...作成するウインドウのキャプション
//       ClassName  ...作成するウインドウクラス名
//       ChildID    ...子ウインドウの識別子
//       hInstance  ...インスタンスハンドル 
//■戻り値
//  子ウインドウのハンドル
//------------------------------------------------------
 HWND CreateControlWindow(HWND hwndParent, int Left, int Top,int Width, int Height,int dwExStyle ,int dwFlag ,LPCTSTR Caption, LPCTSTR ClassName,HMENU ChildID,HINSTANCE hInstance)
 { 
 return CreateWindowEx(dwExStyle,ClassName,Caption,dwFlag    ,
                         Left, Top, Width, Height, hwndParent, ChildID, hInstance, NULL);
 }


//--------------------------------------------------------
//■関数 WinMain
//■用途 メインの関数 
//■引数
// hInstance    ...現在のインスタンスのハンドル
// hPrevInstance...以前のインスタンスのハンドル
// pszCmdLine   ...コマンド ラインのアドレス
// nCmdShow     ...ウィンドウの表示状態
//--------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
   MSG msg;

  //メインウインドウを作成
  CreateMainWindow(420,320,"ヘッダーコントロールを作成する",hInstance,nCmdShow,(WNDPROC)WindowProc,
       WS_OVERLAPPEDWINDOW,WS_EX_CONTROLPARENT,NULL,LoadIcon(NULL,MAKEINTRESOURCE(IDI_APPLICATION)));

  //送られてくるメッセージを翻訳してプロシージャに渡す  
  while (GetMessage(&msg, NULL, 0, 0)) 
  {
    TranslateMessage(&msg); 
    DispatchMessage(&msg);   
  } 
 return (msg.wParam);
}
//------------------------------------------------------
// ■関数 WindowProc
// ■用途 メインウインドウに送られるメッセージを処理
// ■引数
//   hwnd    ...ウインドウのハンドル
//   uMsg    ...メッセージID
//   wParam  ...第1メッセージ パラメータ    
//   lParam  ...第2メッセージ パラメータ
//------------------------------------------------------
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{  
 HD_LAYOUT  hLayout;
 RECT       Rect;
 WINDOWPOS  WindowPos;
 HD_ITEM    hItem;

 switch (uMsg)
 {
  case WM_CREATE: 
        //コモンコントロールの初期化
        InitCommonControls(); 

        //ヘッダーコントロールの作成 
        //  ウインドスタイル
        //    HDS_BUTTONS         アイテムがボタンスタイル
        //    HDS_HIDDEN         ヘッダーコントロールを表示しない
        //    HDS_HORZ             水平ヘッダーコントロール        
         hHeader=CreateControlWindow(hwnd,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
                             0,WS_CHILD |WS_BORDER| HDS_BUTTONS | HDS_HORZ,"", WC_HEADER,
                            (HMENU)ID_HEADER ,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE));   
         
          GetClientRect(hwnd,&Rect);
         hLayout.prc   = &Rect;        //対象ウインドウの領域 
         hLayout.pwpos = &WindowPos;   //ヘッダーコントロールの適切なサイズの情報を受け取るWINDOWPOS構造へのポインタ
         //ヘッダーコントロールのレイアウトを設定
         SendMessage(hHeader, HDM_LAYOUT, 0, (LPARAM) &hLayout);
         SetWindowPos(hHeader, WindowPos.hwndInsertAfter, WindowPos.x, WindowPos.y,WindowPos.cx,WindowPos.cy, WindowPos.flags);

         //アイテムを追加(アイテム1)
         ZeroMemory(&hItem,sizeof(HD_ITEM));
         hItem.mask = HDI_TEXT | HDI_FORMAT | HDI_WIDTH;     //アイテムのマスクフラグ
         hItem.pszText = "アイテム1";                         //アイテムのテキスト
         hItem.cxy = 100;                                    //アイテムのサイズ
         hItem.cchTextMax = lstrlen(hItem.pszText);          //アイテムの文字列サイズ
         hItem.fmt = HDF_LEFT | HDF_STRING;                  //アイテムのフォーマットフラグ
         //ヘッダーコントロールにアイテムを追加 
         index[0]=SendMessage(hHeader, HDM_INSERTITEM,(WPARAM)0, (LPARAM) &hItem); 
         //アイテムを追加(アイテム2)
         hItem.pszText = "アイテム2"; 
         hItem.cchTextMax = lstrlen(hItem.pszText); 
         index[1]=SendMessage(hHeader, HDM_INSERTITEM,(WPARAM)1, (LPARAM) &hItem); 
         //アイテムを追加(アイテム3)
         hItem.pszText = "アイテム3"; 
         hItem.cchTextMax = lstrlen(hItem.pszText); 
         index[2]=SendMessage(hHeader, HDM_INSERTITEM,(WPARAM)2, (LPARAM) &hItem);
         ShowWindow(hHeader,SW_SHOW);
        break;
 case WM_NOTIFY:
 {
     LPNMHDR  Nmhdr=((LPNMHDR)lParam);
        //ヘッダーコントロールだったら
        if (Nmhdr->hwndFrom==hHeader) 
        {
         //アイテムがクリックされた。
         if (Nmhdr->code==HDN_ITEMCLICK)
         {   //クリックされたアイテムの種類を判別して表示
             if (((HD_NOTIFY FAR *) lParam)->iItem==index[0]) 
               MessageBox(hwnd,"「アイテム1」がクリックされました","情報",MB_OK); 
             else if (((HD_NOTIFY FAR *) lParam)->iItem==index[1]) 
               MessageBox(hwnd,"「アイテム2」がクリックされました","情報",MB_OK);
             else if (((HD_NOTIFY FAR *) lParam)->iItem==index[2]) 
                MessageBox(hwnd,"「アイテム3」がクリックされました","情報",MB_OK);
         }
        }
        break;
 }
 case WM_DESTROY:
        PostQuitMessage(0);
        break;

  default: return(DefWindowProc(hwnd, uMsg, wParam, lParam)); 
 }
 
 return (0);

}

ソースコード一式のダウンロード

capi_sample67.zip 3,240 バイト

動作環境

このサンプルは 「Windows98」及び「Microsoft Visual C++5.0」「Borland C++ Compiler 5.5」で確認しております。環境が異なる場合は正常に動作しない場合もございますのでご了承下さい。

Visual C++5.0でのコンパイル

VC5.0でサンプルをコンパイルする場合は新規プロジェクト(Win32Application)を作成後、各ファイルを追加してビルドしてください。

Borland C++ Compiler 5.5でのコンパイル

BCC5.5でサンプルをコンパイルする場合は「bcc32.exe」で*.c又は*.cppファイルをコンパイルします。リソースがある場合は「brc32.exe」で*resファイルを付与してください。

サンプルについて

このWindows APIサンプル集(C/C++版)は2000年頃にC/C++言語の学習の為に作成したものです。コードはエレガントではなく「初心者レベルのコーディング」です。仕事などの業務で利用する際にはエラー処理やメモリ解放などの再確認を必ずして下さい。





関連記事



公開日:2015年03月19日
記事NO:00523