「Windows API/入力」の版間の差分

fix lint error (use script)、シンボルに{{Microsoft Docs Search}}wo
(fix lint error (use script)、シンボルに{{Microsoft Docs Search}}wo)
キー入力に反応させるには、単に、関数
 
LRESULT CALLBACK {{Microsoft Docs Search|WndProc}}(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
 
の関数ブロック内に、下記のように case WM_KEYDOWN: を作成し、
 
<sourcesyntaxhighlight lang=c>
case WM_KEYDOWN:
switch (wParam)
break;
}
</syntaxhighlight>
</source>
 
のように、すればいい。上記のコードはZボタンとXボタンにだけ反応する。
まず、入力欄を作らなければいけない。そのためには、「エディット ボックス」というのを使うと便利である。
 
「エディット ボックス」を呼び出せる関数は2つあり、{{Microsoft Docs Search|CreateWindow}}() 関数と、{{Microsoft Docs Search|CreateWindowEX}}() 関数である。
 
==== CreateWindow() 関数の使い方 ====
CreateWindow() 関数を使う。
 
<sourcesyntaxhighlight lang=c>
case WM_CREATE:
CreateWindow(TEXT("EDIT"), TEXT("ここに名前を入力"),
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT,
10, 10, 200, 30, hWnd, (HMENU)1,((LPCREATESTRUCT)(lParam))->hInstance, NULL);
</syntaxhighlight>
</source>
と書く。
 
最近のVisual Studio では、これを単に hInst と置き換えて
 
<sourcesyntaxhighlight lang=c>
case WM_CREATE:
CreateWindow(TEXT("EDIT"), TEXT("ここに名前を入力"),
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT,
10, 10, 200, 30, hWnd, (HMENU)1, hInst, NULL);
</syntaxhighlight>
</source>
 
と書いても、コンパイルできて、エディットボックスを実行できる。(Visual Studio 2017 で動作確認してある。)
というのがあり、その下に、
 
<sourcesyntaxhighlight lang=c>
if (!hWnd)
{
return FALSE;
}
</syntaxhighlight>
</source>
 
というのがあるので、その下でCreateWindowEX() 関数を使う。
 
 
<sourcesyntaxhighlight lang=c>
if (!hWnd)
{
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT,
0, 0, 150, 30, hWnd, (HMENU)1, hInst, NULL);
</syntaxhighlight>
</source>
 
なお、この位置は、lParam の効果が及ばない位置なのでエラーになので、それを使わないように引数を書く必要がある。
というのがあり、その下に、
 
<sourcesyntaxhighlight lang=c>
if (!hWnd)
{
return FALSE;
}
</syntaxhighlight>
</source>
 
というのがあるので、その下でCreateWindowEX() 関数を使う。
 
最終的に、次のようなコードになる。
<sourcesyntaxhighlight lang=c>
if (!hWnd)
{
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT,
10, 10, 200, 30, hWnd, (HMENU)1, hInstance, NULL);
</syntaxhighlight>
</source>
 
なお、この位置は、lParam の効果が及ばない位置なのでエラーになので、それを使わないように引数を書く必要がある。
ボタンコントロールもまた、CreateWindow()関数で作成できます。
 
<sourcesyntaxhighlight lang=c>
CreateWindow(
TEXT("BUTTON"), TEXT("決定"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
110, 70, 100, 50, hWnd, NULL, hInst, NULL);
</syntaxhighlight>
</source>
 
なお<code>BS_PUSHBUTTON,</code>の次の
 
例えば、
<sourcesyntaxhighlight lang=c>
CreateWindow(
TEXT("BUTTON"), TEXT("決定"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
110, 70, 100, 50, hWnd, (HMENU)BUTTON1_ID, hInst, NULL);
</syntaxhighlight>
</source>
と書いたら、
さらにソースファイルの冒頭の、defineマクロのある箇所に、
 
<sourcesyntaxhighlight lang=c>
#define BUTTON1_ID 10
</syntaxhighlight>
</source>
 
のように定義して、BUTTON1_ID に任意の数字を与えます。
まず、ボタンコントロールが押されたときの処理は、
 
<sourcesyntaxhighlight lang=c>
case WM_COMMAND:
</syntaxhighlight>
</source>
 
の段落に書きます。この段落は、既にウィザードによって自動作成されています。
既に、
 
<sourcesyntaxhighlight lang=c>
case WM_COMMAND:
{
}
break;
</syntaxhighlight>
</source>
 
というようなコードが自動生成されているので、
 
 
<sourcesyntaxhighlight lang=c>
case WM_COMMAND:
{
}
break;
</syntaxhighlight>
</source>
 
のように、case ボタンID を追加するだけです。
 
さて、われわれが行いたいのは、エディットボックスの文字列の取得ですから、上述の {{Microsoft Docs Search|MessageBox}}() の代わりにエディットボックスの文字列を取得するコードを記述する必要があります。
 
まず、エディットボックスに名前をつける必要があります。どのエディットボックスから文字を読みこむか指定するためです。
エディットボックスに名前をつけるには、エディットボックスの作成時に、下記のように代入する必要があります。
 
<sourcesyntaxhighlight lang=c>
case WM_CREATE:
editbox1 = CreateWindow(TEXT("EDIT"), TEXT("ここに名前を入力"), // この行の冒頭が変わった。
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
110, 70, 100, 50, hWnd, (HMENU)BUTTON_ID1, hInst, NULL);
</syntaxhighlight>
</source>
 
 
GetWindowText() 関数の第1引数で、どのコントロールから取得するかを指定するので、そこに 先ほど名づけたエディットボックスの名前を入れます。また、取得した変数を代入するための変数として、事前に文字列型を定義しておきます。下記のコードでは、エディットボックスから取得した文字列を、 変数 kakunou に格納します。
 
<sourcesyntaxhighlight lang=c>
case BUTTON1_ID:
GetWindowText(editbox1, kakunou, 100);
InvalidateRect(hWnd, NULL, FALSE);
UpdateWindow(hWnd);
</syntaxhighlight>
</source>
 
これだけだとエラーになってしまいますので、次のようなコードをソース冒頭のグローバル領域に追加します。
 
<sourcesyntaxhighlight lang=c>
static HWND editbox1;
TCHAR kakunou[256];
</syntaxhighlight>
</source>
 
 
文字を取得しただけでは、まだ画面の描画内容の更新は行われません。
 
ボタンコントロールを押した場合にかぎらず、一般にwin32APIで画面の更新をするには、さらに下記の {{Microsoft Docs Search|InvalidateRect}} 命令と {{Microsoft Docs Search|UpdateWindow}} 命令が必要です。
 
<sourcesyntaxhighlight lang=c>
InvalidateRect(hWnd, NULL, TRUE);
UpdateWindow(hWnd);
</syntaxhighlight>
</source>
は決まり文句ですので、鵜呑みにしてください。
 
 
たとえば case WM_PAINT: に、
<sourcesyntaxhighlight lang=c>
TextOut(hdc, 200, 200, kakunou, lstrlen(kakunou));
</syntaxhighlight>
</source>
のコードを追加したりします。
733

回編集