Skip to content

Instantly share code, notes, and snippets.

@bg1bgst333
Created April 18, 2025 06:20
Show Gist options
  • Save bg1bgst333/c182109b01e196df3629c42d429a8fd9 to your computer and use it in GitHub Desktop.
Save bg1bgst333/c182109b01e196df3629c42d429a8fd9 to your computer and use it in GitHub Desktop.
EnableWindow
// ヘッダファイルのインクルード
// 既定のヘッダファイル
#include <windows.h> // 標準WindowsAPI
#include <tchar.h> // TCHAR型
#include <commctrl.h> // コモンコントロール
// 独自のヘッダファイル
#include "resource.h" // リソースID
// マクロの宣言
#define ID_BUTTON1 501 // Button1
// 関数のプロトタイプ宣言
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); // ウィンドウプロシージャ
// _tWinMain関数の定義
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd){
// 変数・配列の宣言・初期化
HWND hWnd; // ウィンドウハンドルhWnd.
MSG msg; // メッセージmsg.
WNDCLASS wc; // ウィンドウクラスwc.
// ウィンドウクラスの設定
wc.lpszClassName = _T("EnableWindow"); // ウィンドウクラス名"EnableWindow".
wc.style = CS_HREDRAW | CS_VREDRAW; // スタイルCS_HREDRAW | CS_VREDRAW.
wc.lpfnWndProc = WindowProc; // ウィンドウプロシージャWindowProc.
wc.hInstance = hInstance; // インスタンスhInstance.
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // アイコンはアプリケーション既定のもの.
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // カーソルIDC_ARROW.
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 背景WHITE_BRUSH.
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAINMENU); // メニューにはIDR_MAINMENUをMAKEINTRESOURCEマクロで指定.
wc.cbClsExtra = 0; // 0.
wc.cbWndExtra = 0; // 0.
// ウィンドウクラスの登録
if (!RegisterClass(&wc)){ // RegisterClassでウィンドウクラスを登録.
// エラー処理
return -1; // 異常終了(-1)
}
// ウィンドウの作成
hWnd = CreateWindow(_T("EnableWindow"), _T("EnableWindow"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); // CreateWindowでウィンドウ作成.
if (hWnd == NULL){
// エラー処理
return -2; // 異常終了(-2)
}
// ウィンドウの表示
ShowWindow(hWnd, SW_SHOW);
// メッセージループ
while (GetMessage(&msg, NULL, 0, 0) > 0){ // GetMessageでメッセージ取得.
// ウィンドウメッセージの送出
TranslateMessage(&msg); // TranslateMessageで仮想キーメッセージを文字メッセージへ変換.
DispatchMessage(&msg); // DispatchMessageで受け取ったメッセージをウィンドウプロシージャに送出.
}
// プログラムの終了
return (int)msg.wParam; // msg.wParamを返す.
}
// WindowProc関数の定義
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
// ウィンドウメッセージに対する処理.
switch (uMsg){ // uMsgごとに処理振り分け.
// ウィンドウの作成が開始された時.
case WM_CREATE:
// WM_CREATEブロック
{
// 変数の宣言
LPCREATESTRUCT lpCS; // CREATESTRUCT構造体ポインタlpCS.
HWND hButton1; // ボタンハンドルhButton1.
// lpCSの取得.
lpCS = (LPCREATESTRUCT)lParam; // lParamをlpCSに変換.
// Button1の作成.(無効にしておく.)
hButton1 = CreateWindow(WC_BUTTON, _T("Button1"), WS_CHILD | WS_VISIBLE | WS_DISABLED, 50, 50, 200, 100, hwnd, (HMENU)ID_BUTTON1, lpCS->hInstance, NULL); // CreateWindowで"Button1"を作成.
if (hButton1 == NULL){
return -1;
}
// ウィンドウ作成成功
return 0; // 0を返すとウィンドウ作成成功となる.
}
// 既定の処理へ向かう.
break;
// ウィンドウが破棄された時.
case WM_DESTROY:
// WM_DESTROYブロック
{
// 終了メッセージの送信.
PostQuitMessage(0); // PostQuitMessageで終了コードを0とするWM_QUITを送信.
}
// 既定の処理へ向かう.
break;
// メニュー項目が選択されたり, ボタンなどのコントロールが押されたりした時.
case WM_COMMAND: // メニュー項目が選択されたり, ボタンなどのコントロールが押されたりした時.(uMsgがWM_COMMANDの時.)
// WM_COMMANDブロック
{
// どのメニュー項目が選択されたかを判定する.
switch (LOWORD(wParam)){ // LOWORD(wParam)で選択されたメニュー項目のIDが取得できるので, その値で判定する.
// 取得したIDごとに処理を分岐.
// Enable Buttonが選択された時.
case ID_ITEM_ENABLE_BUTTON:
// ID_ITEM_ENABLE_BUTTONブロック
{
// チェック済みかそうでないか調べる.
UINT uiRet = GetMenuState(GetMenu(hwnd), ID_ITEM_ENABLE_BUTTON, MF_BYCOMMAND); // GetMenuStateでID_ITEM_ENABLE_BUTTONがチェックされてるか取得.
if (uiRet & MF_CHECKED){ // チェックされている.
EnableWindow(GetDlgItem(hwnd, ID_BUTTON1), FALSE); // EnableWindowでID_BUTTON1を無効化.
// Enable Buttonのチェックを外す.
CheckMenuItem(GetMenu(hwnd), ID_ITEM_ENABLE_BUTTON, MF_BYCOMMAND | MF_UNCHECKED); // CheckMenuItemでID_ITEM_ENABLE_BUTTONのチェックを外す.
}
else{ // チェックされていない.
EnableWindow(GetDlgItem(hwnd, ID_BUTTON1), TRUE); // EnableWindowでID_BUTTON1を有効化.
// Enable Buttonにチェックを入れる.
CheckMenuItem(GetMenu(hwnd), ID_ITEM_ENABLE_BUTTON, MF_BYCOMMAND | MF_CHECKED); // CheckMenuItemでID_ITEM_ENABLE_BUTTONにチェック.
}
}
// 既定の処理へ向かう.
break; // breakで抜けて, 既定の処理(DefWindowProc)へ向かう.
// 上記以外の時.
default:
// 既定の処理へ向かう.
break;
}
// 既定の処理へ向かう.
break;
}
// 既定の処理へ向かう.
break;
// 上記以外の時.
default:
// 既定の処理へ向かう.
break;
}
// 既定の処理に任せる.
return DefWindowProc(hwnd, uMsg, wParam, lParam); // DefWindowProcを呼び, 戻り値をそのまま返す.
}
#include "resource.h"
IDR_MAINMENU MENU
BEGIN
POPUP "Enable(&E)"
BEGIN
MENUITEM "Enable Button(&B)", ID_ITEM_ENABLE_BUTTON
END
END
#define IDR_MAINMENU 101
#define ID_ITEM_ENABLE_BUTTON 10101
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment