Windows API/入力
入力

キー入力に反応させるには、単に、関数
入力

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
入力

の関数ブロック内に、下記のように case WM_KEYDOWN: を作成し、
入力

のように、すればいい。上記のコードはZボタンとXボタンにだけ反応する。
入力

case が複数通りある場合、break文をすると、switchブロックの外に出てしまいます。
入力

上記のコードでは、単にメッセージボックスが出るだけなのに、画面更新の関数は不要です。
入力

ですが、一般的には、そういう関数とはかぎらず、また、なにかの入力をプアプリが受け付けたことをユーザーに知らせるために、画面更新の関数が必要です。
入力

このため、たとえば case 'Z': と case 'X': の入力検出後の、画面更新のようにどのブロックのあとでも必要になる処理などを、まとめてコードに書きたいと思うでしょう。
入力

しかし、break文によってswitchブロックの外側に出てしまいます。
入力

べつに、switch文の抜けたあとの場所に書くこともできるので、画面更新などの共通処理をコードを記述できる場所もあります。
入力

しかし、実際に書いてみると分かるのですが、WindowsAPIではカッコ { } 記号がコード中に多かったりするので、よく、共通処理を書くべき場所を間違えてしまいます。
入力

なので、慣れない内は、もし検出後の共通処理があまり長くない処理なら、それぞれのcase ブロックに処理を記述してしまうほうが簡単だし、見た目でも処理内容が分かりやすくなるでしょう。
入力

まず、入力欄を作らなければいけない。そのためには、「エディット ボックス」というのを使うと便利である。
入力

「エディット ボックス」を呼び出せる関数は2つあり、CreateWindow() 関数と、CreateWindowEX() 関数である。
入力

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
入力

の関数ブロック内に、下記のように case WM_CREATE: を作成し、
入力

CreateWindow() 関数を使う。
入力

と書く。
入力

((LPCREATESTRUCT)(lParam))->hInstance について
入力

最近のVisual Studio では、これを単に hInst と置き換えて
入力

と書いても、コンパイルできて、エディットボックスを実行できる。(Visual Studio 2017 で動作確認してある。)
入力

この CreateWindow() 関数は、名前はあたかもウィンドウ作成の関数っぽくて、まぎらわしいが、ウィンドウだけでなく、ボタンなどのコントロールも作成できる。
入力

そして、作成できるコントロールの中には、文字入力欄を簡単に作れるエディットボックスがあるので、それを使う。
入力

第1引数の TEXT("EDIT") により、エディットボックスを使うことを宣言している。第2引数は、ボックス内に表示される文字を指定している。アプリ起動後にエディットボックス内に表示される この文字(上記の場合は「ここに名前を入力」)は、エディットボックスDeleteキーなどで消去できる。
入力

アプリ起動後に、ボックス内をマウスクリックすれば、文字入力カーソルがボックス内に表示され、ボックス内の文字を編集できるようになる。
入力

これによって、文字列の入力欄を作れるが、しかし、まだ入力欄を作っただけなので、入力してみてエンターを押しても、まだ何も起こらない。
入力

よって、入力後の処理をコードに追記していく必要がある。
入力

または、ウィザードで作ったテンプレートの100行目あたりに
入力

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
入力

というのがあり、その下に、
入力

というのがあるので、その下でCreateWindowEX() 関数を使う。
入力

なお、この位置は、lParam の効果が及ばない位置なのでエラーになので、それを使わないように引数を書く必要がある。
入力

ウィザードで作ったテンプレートの100行目あたりに
入力

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
入力

というのがあり、その下に、
入力

というのがあるので、その下でCreateWindowEX() 関数を使う。
入力

最終的に、次のようなコードになる。
入力

なお、この位置は、lParam の効果が及ばない位置なのでエラーになので、それを使わないように引数を書く必要がある。
入力

エディットボックスに文字を打ち込んだら、文字列を確定したことをOSに知らせる処理が必要です。(さらにその後、確定した文字列を変数に代入する処理が必要になります。)
入力

まず、どうやって文字列を確定したことを宣言するか、考える必要があります。
入力

実用的には、決定ボタンなどのコントロールをアプリウィンドウ上に配置するのが、簡単でしょう。
入力

ボタンコントロールもまた、CreateWindow()関数で作成できます。
入力

なおBS_PUSHBUTTON,の次の
入力

について、これは
入力

という意味です。
入力

後の処理のために、このボタンを呼び出すためのIDをつける必要があります。
入力

後ろから3番目の引数(hWnd, NULL, hInst のNULL の部分)がIDです。IDは数字でなければ、なりません。
入力

通常、 define マクロで定義するのが慣例です。
入力

例えば、
入力

と書いたら、 さらにソースファイルの冒頭の、defineマクロのある箇所に、
入力

のように定義して、BUTTON1_ID に任意の数字を与えます。
入力

なお HMENU は型名であり、ハンドルの識別番号をあらわす型です。
入力

上述のように、ウィンドウ上に、ボタンコントロールで作成した決定ボタンを配置したとしましょう。
入力

まず、ボタンコントロールが押されたときの処理は、
入力

の段落に書きます。この段落は、既にウィザードによって自動作成されています。
入力

既に、
入力

というようなコードが自動生成されているので、
入力

のように、case ボタンID を追加するだけです。
入力

さて、われわれが行いたいのは、エディットボックスの文字列の取得ですから、上述の MessageBox() の代わりにエディットボックスの文字列を取得するコードを記述する必要があります。
入力

まず、エディットボックスに名前をつける必要があります。どのエディットボックスから文字を読みこむか指定するためです。
入力

とりあえず editbox1 という名前をつけたとしましょう。
入力

エディットボックスに名前をつけるには、エディットボックスの作成時に、下記のように代入する必要があります。
入力

エディットボックスにある文字列を取得するには、GetWindowText() 関数を使います。
入力

GetWindowText() 関数の第1引数で、どのコントロールから取得するかを指定するので、そこに 先ほど名づけたエディットボックスの名前を入れます。また、取得した変数を代入するための変数として、事前に文字列型を定義しておきます。下記のコードでは、エディットボックスから取得した文字列を、 変数 kakunou に格納します。
入力

これだけだとエラーになってしまいますので、次のようなコードをソース冒頭のグローバル領域に追加します。
入力

文字を取得しただけでは、まだ画面の描画内容の更新は行われません。
入力

ボタンコントロールを押した場合にかぎらず、一般にwin32APIで画面の更新をするには、さらに下記の InvalidateRect 関数と UpdateWindow 関数が必要です。
入力

は決まり文句ですので、鵜呑みにしてください。
入力

また、 case WM_PAINT: に、描画内容を書く必要があります。
入力

たとえば case WM_PAINT: に、
入力

のコードを追加したりします。
入力

上述のこれらのコードを記述すれば、エディットボックスの入力結果を、ウィンドウに表示できます。