ホットキーコントロールを作成する(C/C++版)
ホットキーコントロールを作成するサンプルです。
サンプルの実行画面
ソースコード
[Sample68.c]
//-------------------------------------------------------------------------------------- // ■ホットキーコントロールを作成する■ Sample NO.68 // //-------------------------------------------------------------------------------------- //リンクの設定 //comctl32.lib をリンクしてください。 #include <windows.h> #include <commctrl.h> HWND hHot; //ホットキーコントロールのハンドル #define ID_BUTTON1 100 #define ID_BUTTON2 200 //ウインドウを中央にする為に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_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: //コモンコントロールの初期化 InitCommonControls(); //ホットキーコントロールの作成 hHot=CreateControlWindow(hwnd,10,10,200,100,0,WS_CHILD | WS_VISIBLE,"", HOTKEY_CLASS,NULL ,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE)); CreateControlWindow(hwnd,10,120,200,40,0,WS_CHILD | WS_VISIBLE|BS_PUSHBUTTON,"ホットキーの設定", "BUTTON",(HMENU)ID_BUTTON1 ,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE)); CreateControlWindow(hwnd,10,162,200,40,0,WS_CHILD | WS_VISIBLE|BS_PUSHBUTTON,"ホットキーの解除", "BUTTON",(HMENU)ID_BUTTON2 ,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE)); SetFocus(hHot); break; case WM_COMMAND: { DWORD buf; if (LOWORD(wParam)==ID_BUTTON1) { //現在のホットキーを取得 buf= SendMessage(hHot, HKM_GETHOTKEY, 0, 0); //ホットキーをメインウインドウに関連付ける switch (SendMessage(hwnd, WM_SETHOTKEY, buf, 0)) { case 2 : MessageBox(hwnd,"関数は正常に終了しましたが、 別のウィンドウがすでに同じホットキーを持っています。","情報",MB_OK);break; case 0 : MessageBox(hwnd,"ウィンドウが無効なので関数が正常に終了しませんでした。","情報",MB_OK);break; case -1 : MessageBox(hwnd,"ホット キーが無効なので関数が正常に終了しませんでした。","情報",MB_OK);break; //成功は1 } } else if (LOWORD(wParam)==ID_BUTTON2) { //ホットキーを無効にする SendMessage(hwnd, WM_SETHOTKEY, 0,0); SendMessage(hHot, HKM_SETHOTKEY, 0,0); } else return(DefWindowProc(hwnd, uMsg, wParam, lParam)); break; } case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hwnd, uMsg, wParam, lParam)); } return (0); }
ソースコード一式のダウンロード
capi_sample68.zip 2,832 バイト
動作環境
このサンプルは 「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:00524