クールバー(レバー)コントロールを作成する(C/C++版)
クールバー(レバー)コントロールを作成するサンプルです。
サンプルの実行画面
ソースコード
[Sample73.c]
//--------------------------------------------------------------------------------------
// ■クールバー(レバー)コントロールを作成す■ Sample NO.73
//
//--------------------------------------------------------------------------------------
//※Delphiではレバーコントロールのことをクールバーといいます。
//リンクの設定
//comctl32.lib をリンクしてください。
#include <windows.h>
#include <commctrl.h>
HWND hCool=NULL; //クールバーコントロールのハンドル
#define ID_COOL 300
#define ID_BUTTON1 200
#define ID_BUTTON2 100
//ウインドウを中央にする為に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);
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; //メニューの設定
//ウィンドウ クラスを登録
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);
}
//--------------------------------------------------------
//■関数 WinMain
//■用途 メインの関数
//■引数
// hInstance ...現在のインスタンスのハンドル
// hPrevInstance...以前のインスタンスのハンドル
// pszCmdLine ...コマンド ラインのアドレス
// nCmdShow ...ウィンドウの表示状態
//--------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
MSG msg;
//メインウインドウを作成
CreateMainWindow(300,300,"クールバー(レバー)コントロールを作成する",hInstance,nCmdShow,(WNDPROC)WindowProc,
WS_OVERLAPPEDWINDOW|WS_TABSTOP,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)
{
switch (uMsg)
{
case WM_CREATE:
{
RECT Rect;
INITCOMMONCONTROLSEX InitEx;
REBARINFO RebarInfo;
REBARBANDINFO RebarbandInfo;
//コモンコントロールの初期化
InitEx.dwICC = ICC_COOL_CLASSES;
InitEx.dwSize = sizeof(INITCOMMONCONTROLSEX);
InitCommonControlsEx(&InitEx);
//クールバーコントロールの作成
hCool=CreateWindowEx(0,REBARCLASSNAME,"",
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |WS_CLIPCHILDREN |CCS_NODIVIDER,
0,0,0,0,hwnd,(HMENU)ID_COOL,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
//クールバーの詳細設定--->
RebarInfo.cbSize =sizeof(REBARINFO); //構造体のサイズ
RebarInfo.fMask=0; //マスクフラグ
RebarInfo.himl=NULL; //イメージリストのハンドル
SendMessage(hCool, RB_SETBARINFO, 0, (LPARAM)&RebarInfo);
ZeroMemory(&RebarbandInfo, sizeof(REBARBANDINFO));
//クールバーのバンドの設定--->
//構造体のサイズ
RebarbandInfo.cbSize = sizeof(REBARBANDINFO);
//マスクフラグ
RebarbandInfo.fMask = RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE;
//バンドのスタイルフラグ
RebarbandInfo.fStyle = RBBS_CHILDEDGE;
//最小値の高さ
RebarbandInfo.cyMinChild = 30;
//最小値の幅
RebarbandInfo.cxMinChild = 100;
//コンテナ(クールバーのバンド)にのせる対象の子ウインドウのハンドル
RebarbandInfo.hwndChild =CreateWindowEx(0,"BUTTON", "Button1", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
0, 0, 0, 0, hCool, (HMENU)ID_BUTTON1,
(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE) ,NULL);
//クールバーにバンド1を挿入
SendMessage(hCool, RB_INSERTBAND,0, (LPARAM)&RebarbandInfo);
//クールバーにバンド2を挿入
RebarbandInfo.hwndChild = CreateWindowEx(0,"BUTTON", "Button2", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
0, 0, 0, 100, hCool, (HMENU)ID_BUTTON2,
(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE) ,NULL);
GetClientRect(hCool, &Rect);
RebarbandInfo.cx = Rect.right - 100;
SendMessage(hCool, RB_INSERTBAND,1, (LPARAM)&RebarbandInfo);
break;
}
case WM_SIZE:
SendMessage(hCool,WM_SIZE,wParam,lParam);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case ID_BUTTON1 :MessageBox(hwnd,"Button1がクリック!!","情報",MB_OK);break;
case ID_BUTTON2 :MessageBox(hwnd,"Button2がクリック!!","情報",MB_OK);break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default: return(DefWindowProc(hwnd, uMsg, wParam, lParam));
}
return (0);
}
ソースコード一式のダウンロード
capi_sample73.zip 2,880 バイト
動作環境
このサンプルは 「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:00529
プチモンテ ※この記事を書いた人
![]() | |
![]() | 💻 ITスキル・経験 サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。 画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ |
| 🎵 音楽制作 BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は抒情詩、抒情的な楽曲が多い。楽曲制作は🔰2023年12月中旬 ~ | |









