Skip to content

Instantly share code, notes, and snippets.

@bg1bgst333
Created December 30, 2025 12:50
Show Gist options
  • Select an option

  • Save bg1bgst333/2ded71265ce15a5f91ad56ce773249fb to your computer and use it in GitHub Desktop.

Select an option

Save bg1bgst333/2ded71265ce15a5f91ad56ce773249fb to your computer and use it in GitHub Desktop.
STN_CLICKED
// ヘッダファイルのインクルード
// 既定のヘッダファイル
#include <windows.h> // 標準WindowsAPI
#include <tchar.h> // TCHAR型
#include <commctrl.h> // コモンコントロール
// 独自のヘッダファイル
#include "resource.h" // リソースID
// 関数のプロトタイプ宣言
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); // ウィンドウメッセージに対して独自の処理をするように定義したコールバック関数WindowProc.
// _tWinMain関数の定義
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd){
// 変数・配列の宣言・初期化
HWND hWnd; // CreateWindowで作成したウィンドウのウィンドウハンドルを格納するHWND型変数hWnd.
MSG msg; // ウィンドウメッセージ情報を格納するMSG構造体型変数msg.
WNDCLASS wc; // ウィンドウクラス情報をもつWNDCLASS構造体型変数wc.
// ウィンドウクラスの設定
wc.lpszClassName = _T("STN_CLICKED"); // ウィンドウクラス名は"STN_CLICKED".
wc.style = CS_HREDRAW | CS_VREDRAW; // スタイルはCS_HREDRAW | CS_VREDRAW.
wc.lpfnWndProc = WindowProc; // ウィンドウプロシージャは独自の処理を定義したWindowProc.
wc.hInstance = hInstance; // インスタンスハンドルは_tWinMainの引数.
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // アイコンはアプリケーション既定のもの.
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // カーソルは矢印.
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 背景は白ブラシ.
wc.lpszMenuName = NULL; // なし
wc.cbClsExtra = 0; // 0でいい.
wc.cbWndExtra = 0;
// ウィンドウクラスの登録
if (!RegisterClass(&wc)) { // RegisterClassでウィンドウクラスを登録し, 0が返ったらエラー.
// エラー処理
MessageBox(NULL, _T("RegisterClass Failure!"), _T("STN_CLICKED"), MB_OK | MB_ICONHAND); // MessageBoxで"RegisterClass Failure!"とエラーメッセージを表示.
return -1; // 異常終了(1)
}
// ウィンドウの作成
hWnd = CreateWindow(_T("STN_CLICKED"), _T("STN_CLICKED"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); // CreateWindowで, 上で登録した"STN_CLICKED"ウィンドウクラスのウィンドウを作成.
if (hWnd == NULL) { // ウィンドウの作成に失敗したとき.
// エラー処理
MessageBox(NULL, _T("CreateWindow Failure!"), _T("STM_SETIMAGE"), MB_OK | MB_ICONHAND); // MessageBoxで"CreateWindow Failure!"とエラーメッセージを表示.
return -2; // 異常終了(2)
}
// ウィンドウの表示
ShowWindow(hWnd, SW_SHOW); // ShowWindowでSW_SHOWを指定してウィンドウの表示.
// メッセージループ
while (GetMessage(&msg, NULL, 0, 0) > 0) { // GetMessageでメッセージを取得, 戻り値が0より大きい間はループし続ける.
// ウィンドウメッセージ処理
TranslateMessage(&msg); // TranslateMessageで仮想キーメッセージを文字メッセージへ変換.
DispatchMessage(&msg); // DispatchMessageで受け取ったメッセージをウィンドウプロシージャ(この場合は独自に定義したWindowProc)に送出.
}
// プログラムの終了
return (int)msg.wParam; // 終了コード(msg.wParam)を戻り値として返す.
}
// WindowProc関数の定義
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { // ウィンドウメッセージに対して独自の処理をするように定義したウィンドウプロシージャ.
// スタティック変数の宣言
static HWND hStatic; // スタティックコントロールハンドルhStatic.
static HBITMAP hBitmap; // ロードしたビットマップハンドルhBitmap.
// ウィンドウメッセージに対する処理.
switch (uMsg) { // switch-casa文でuMsgの値ごとに処理を振り分ける.
// ウィンドウの作成が開始された時.
case WM_CREATE: // ウィンドウの作成が開始された時.(uMsgがWM_CREATEの時.)
// WM_CREATEブロック
{
// 変数の宣言
LPCREATESTRUCT lpCS; // CreateStruct構造体のポインタlpCS.
// アプリケーションインスタンスハンドルの取得.
lpCS = (LPCREATESTRUCT)lParam; // lParamをLPCREATESTRUCTにキャストして, lpCSに格納.
// スタティックコントロールの作成.
hStatic = CreateWindow(WC_STATIC, _T(""), WS_CHILD | WS_VISIBLE | SS_BITMAP | SS_NOTIFY, 50, 50, 120, 40, hwnd, (HMENU)IDC_STATIC1, lpCS->hInstance, NULL); // CreateWindowのWC_STATICでスタティックコントロールを作成.
if (hStatic == NULL){ // hStaticがNULLなら.
// エラー処理.
return -1; // -1を返す.
}
// ビットマップ(リソース)のロード
hBitmap = (HBITMAP)LoadBitmap(lpCS->hInstance, MAKEINTRESOURCE(IDB_BITMAP1)); // LoadBitmapでビットマップリソースIDB_BITMAP1(bitmap1.bmp)をロードし, 戻り値のビットマップハンドルはhBitmapに格納する.
if (hBitmap == NULL){ // hBitmapがNULLならロード失敗.
// エラー処理.
return -2; // -2を返す.
}
// スタティックコントロールにビットマップをセット.
SendMessage(hStatic, STM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBitmap); // SendMessageのSTM_SETIMAGEでhStaticにhBitmapをセット.
// ウィンドウ作成成功
return 0; // return文で0を返して, ウィンドウ作成成功とする.
}
// 既定の処理へ向かう.
break; // breakで抜けて, 既定の処理(DefWindowProc)へ向かう.
// ウィンドウが破棄された時.
case WM_DESTROY: // ウィンドウが破棄された時.(uMsgがWM_DESTROYの時.)
// WM_DESTROYブロック
{
// 終了メッセージの送信.
PostQuitMessage(0); // PostQuitMessageで終了コードを0としてWM_QUITメッセージを送信.(するとメッセージループのGetMessageの戻り値が0になるので, メッセージループから抜ける.)
}
// 既定の処理へ向かう.
break; // breakで抜けて, 既定の処理(DefWindowProc)へ向かう.
// ウィンドウが閉じられた時.
case WM_CLOSE: // ウィンドウが閉じられた時.(uMsgがWM_CLOSEの時.)
// WM_CLOSEブロック
{
// ビットマップの破棄.
if (hBitmap != NULL){ // hBitmapがNULLでない場合.(ロードしたままの状態の場合.)
// ビットマップの破棄
DeleteObject(hBitmap); // DeleteObjectでhBitmapの破棄.
hBitmap = NULL; // hBitmapはNULLにしておく.
}
// 子ウィンドウの終了処理.
if (hStatic != NULL){ // NULLでない.
DestroyWindow(hStatic); // DestroyWindowでhStaticを破棄.
hStatic = NULL; // hStaticにNULLをセット.
}
}
// 抜ける.
break; // breakで抜ける.
// コントロールに関する通知が来た時.
case WM_COMMAND: // コントロールに関する通知が来た時.(uMsgがWM_COMMANDの時.)
// WM_COMMANDブロック
{
// どのコントロールが操作されたかを判定する.
switch (LOWORD(wParam)){ // LOWORD(wParam)で操作されたコントロール項目のIDが取得できるので, その値で判定する.
// 取得したIDごとに処理を分岐.
// IDC_STATIC1のイベント発生時.
case IDC_STATIC1:
// IDC_STATIC1ブロック.
{
// 通知コードごとに分岐.
switch (HIWORD(wParam)){
// STN_CLICKEDの時.
case STN_CLICKED:
{
// "IDC_STATIC1 STN_CLICKED"とデバッグ出力.
OutputDebugString(_T("IDC_STATIC1 STN_CLICKED\n"));
}
// 既定の処理へ向かう.
break;
// 上記以外の時.
default:
// 既定の処理へ向かう.
break;
}
}
// 既定の処理へ向かう.
break;
// 上記以外の時.
default:
// 既定の処理へ向かう.
break;
}
}
// 既定の処理へ向かう.
break; // breakで抜けて, 既定の処理(DefWindowProc)へ向かう.
// 上記以外の時.
default: // 上記以外の値の時の既定処理.
// 既定の処理へ向かう.
break; // breakで抜けて, 既定の処理(DefWindowProc)へ向かう.
}
// あとは既定の処理に任せる.
return DefWindowProc(hwnd, uMsg, wParam, lParam); // 戻り値も含めDefWindowProcに既定の処理を任せる.
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment