Posted by : Izumikawa Fukumi 2014年6月11日水曜日

今回初めてC言語のWinAPIを使ってボタンを作成したのですが、
作成する過程で結構苦労しました。

様々なサイトを参考にしてやっとボタンが作成出来ました。
書き方等もサイトによって違って結構大変でしたので、

初心者でも分かりやすい様にボタンの作成方法をご紹介します。




では、始めに以下のソースを分からなくてもいいので適当に読んで下さい。

#define CHILD_ID 0 //ボタンID

//プロトタイプ宣言 (ウィンドウプロジャー)
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);


int WINAPI WinMain(HINSTANCE hInstacnce, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow){
 
 TCHAR szAppName[] = TEXT("test_music");
 WNDCLASS wc;
 HWND hwnd;
 MSG msg;

 wc.style   = CS_HREDRAW | CS_VREDRAW;
 wc.lpfnWndProc  = WndProc;
 wc.cbClsExtra  = 0;
 wc.cbWndExtra  = 0;
 wc.hInstance  = hInstacnce;
 wc.hIcon   = LoadIcon(NULL, IDC_ARROW);
 wc.hCursor   = LoadCursor(NULL, IDC_ARROW);
 wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
 wc.lpszMenuName  = NULL;
 wc.lpszClassName =szAppName;


 //ウィンドウクラス登録
 if(!RegisterClass(&wc)) return 0;

 hwnd = CreateWindow( //ウィンドウ作成
  szAppName, TEXT("サンプルアプリケーション"),
  WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT, CW_USEDEFAULT,
  300, 300,
  NULL, NULL,
  hInstacnce, NULL);

 CreateWindow(   //ボタン作成
   _T("button"),                            // ウィンドウクラス名
   _T("OK"),                                // キャプション
   WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,   // スタイル指定
   120, 120,                                  // 座標
   60, 40,                                  // サイズ
   hwnd,                                    // 親ウィンドウのハンドル
   (HMENU)CHILD_ID,                                    // メニューハンドル
   hInstacnce,                                 // インスタンスハンドル
   NULL                                     // その他の作成データ
  );


 if(!hwnd) return 0;

 

 ShowWindow(hwnd, nCmdShow);
 UpdateWindow(hwnd);

 while (GetMessage(&msg, NULL, 0, 0) > 0)
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }

 return msg.wParam;
 
}

//ウィンドウプロジャー
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){

 switch (uMsg) {
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 case WM_COMMAND:
  switch(LOWORD(wParam)) {
  case CHILD_ID: //ID: 0がクリックされた時の処理
   
   MessageBox(hwnd , TEXT("ボタンが押されました。") , TEXT("メッセージ") , MB_OK);
   break;
  }
  return 0;
 }
 return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

※都合上#includeは省略しています。


では説明に入りたいと思います。



[1]行目を見て下さい。

1行目ではどのボタンクリックされたのか判断する為のIDを記述します。
ウィンドウプロジャーでこのIDクリックされたら処理する様な流れになります。


[37]行目は実際にボタンを作成しています。
ソース内コメントを見れば分かるのですが、メニューハンドルと言う部分でIDボタンに割り当てています。後は大体分かるかと思います。


[74]行目ではユーザーがアイテムを選択した時に出るメッセージです。
何らかアイテムを選択した時にこの中が実行されます。


[76]行目でボタンIDを指定して押されたIDであれば中の処理がされます。







私が元々ボタンを作ったキッカケはボタンを押したら音声が流れると言う仕組みをやりたかっただけなので、おまけとして音声の簡単な流し方をお教えします。

2行目と3行目に以下を記述

#include <windows.h>
#include <tchar.h>
#pragma comment(lib, "winmm.lib")


「MessageBox(hwnd , TEXT("ボタンが押されました。") , TEXT("メッセージ") , MB_OK);」を消して以下を記述



PlaySound( _T("C:/test.wav"), NULL, SND_ASYNC);


※C:\に「test.wav」と言うファイルを置いて下さい。


これで実行すれば音声が流れるはずです。


- Copyright © I aim to creator. - Hatsune Miku - Powered by Blogger - Designed by Johanes Djogan -