仕事を頑張る人のおしりトラブル対策

質問タイトルのようにEM_GETSELメッセージについての質問です。

カーソルで選択されている文字列の最初の位置と最後の位置を調査するため

SendMessage(hEdit, EM_GETSEL, (WPARAM)&Start, (LPARAM)&End);

このように記述しました。

ここで、例えば検索文字列内にカーソルのついた文字列がない場合にはStart、Endの値は何が格納されるのでしょう?

初期値を指定した場合はその値のままなのでしょうか?

それとも見つからない場合は何か返り値が発生するのでしょうか?

ご教授よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

★『Start』と『End』には同じ値が格納されます。


・これはカーソル(キャレット)位置をオフセット値で得ることになります。
 同様に『EM_SETSEL』メッセージで『Start』と『End』に同じ値をセットすると
 範囲選択ではなく、カーソル(キャレット)位置をオフセット値で設定することになります。
・範囲選択されていないと『EM_GETSEL』の戻り値は、上位16ビット、下位16ビットが
 同じ値になります。ただし、16ビットで表せる場合ですが…。
・下の『参考URL』で『EM_SETSEL』メッセージで始点、終点を同じにするとカーソルの移動
 になるサンプルがあります。エディット・ボックスのメッセージや仕組みを理解するための
 参考にどうぞ。→質問内容も読んでテストして下さい。
・以上。おわり。

参考URL:http://oshiete1.goo.ne.jp/qa2854941.html
    • good
    • 0
この回答へのお礼

遅くなりましたが、解説ありがとうございました。
色々お世話になった結果、文字列検索プログラムをうまくを組むことができました^^

ありがとうございました。

お礼日時:2007/04/07 21:47

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qエディットボックスで改行

お世話になっております。
VC++でプログラムを組んでおり、下記の要領でエディットボックスに文字を表示しています。
_itoa(inputData[i], receivedChar, 16 );//数値を文字列に変換
SetDlgItemText(argThr1->hWnd, IDC_EDIT2, receivedChar);

このとき、エディットボックス内で、任意の位置で改行しながら表示する方法はありますでしょうか?
よろしくお願い致します。
表示例
ABC(改行)
DEF(改行)

Aベストアンサー

★エディット・ボックスに文字列を行単位で追加していくのかな?
・この場合はエディット・ボックスの機能で『文字列の置換』があります。
 この機能を利用して数値を文字列に変換した内容を行単位で追加していけます。
 方法は『EM_REPLACESEL』というメッセージを利用します。このメッセージは
 エディット・ボックスの範囲選択された文字列を指定の文字列に置換する処理を
 行いますが、カーソル位置にある場所に文字列を挿入する事も可能です。
・挿入する場合は、最初にテキストのサイズを取得して、カーソル位置を最後に移動
 させます。→『EM_SETSEL』メッセージで始点、終点を同じにするとカーソルの移動
 になります。その後に『receivedChar』の文字列を挿入(追加)します。
 下にそのサンプルを載せます。

サンプル:
LONG lSize;

_itoa( inputData[i], receivedChar, 16 );
lSize = (LONG)SendDlgItemMessage( argThr1->hWnd, IDC_EDIT2, WM_GETTEXTLENGTH, 0, 0 );
SendDlgItemMessage( argThr1->hWnd, IDC_EDIT2, EM_SETSEL, (WPARAM)lSize, (LPARAM)lSize );
SendDlgItemMessage( argThr1->hWnd, IDC_EDIT2, EM_REPLACESEL, TRUE, (LPARAM)receivedChar );
SendDlgItemMessage( argThr1->hWnd, IDC_EDIT2, EM_REPLACESEL, TRUE, (LPARAM)TEXT("\r\n") );

最後に:
・上記の方法で複数行のエディット・ボックス内に文字列を行単位で追加していけます。
 ただし、このときに改行コードも追加します。これをしないと行単位になりません。
 この改行コードの追加が最後の『TEXT("\r\n")』という1行です。
・もちろん『receivedChar』の文字列に『TEXT("\r\n")』を追加すれば最後の1行は必要ありません。
・あと『_itoa』関数よりも『wsprintf』関数の『%X』書式制御で変換することをお勧めします。
 これは『_itoa』関数が VC 環境でしか利用できないため、他の処理系ではコンパイルできなくなる
 可能性があるからです。ずっと VC 環境でプログラミングするのならばいいですけど。
・以上。おわり。→下の『参考URL』もどうぞ。

参考URL:http://www.winapi-database.com/Message/EM/EM_REPLACESEL.html

★エディット・ボックスに文字列を行単位で追加していくのかな?
・この場合はエディット・ボックスの機能で『文字列の置換』があります。
 この機能を利用して数値を文字列に変換した内容を行単位で追加していけます。
 方法は『EM_REPLACESEL』というメッセージを利用します。このメッセージは
 エディット・ボックスの範囲選択された文字列を指定の文字列に置換する処理を
 行いますが、カーソル位置にある場所に文字列を挿入する事も可能です。
・挿入する場合は、最初にテキストのサイズを取得して...続きを読む

Qwsprintf関数の使い方について

いつもお世話になっております。
 
いまいち、分からなくて質問しました。
 
 
int hp=60;

としたとき、
 
TextOut(.............,hp,lstrlen(hp));

としようと思ってたんですけど、
 
文字がでないので、
 
 
wsprintf((LPWSTR)nowhp,"%d",hp);

としたら、エラーがでて実行できませんでした。
 
TextOut関数で、60とだしたいのですが、
その後の処理で値が変わってくるので
 
TextOut(......................,TEXT("60")..........)
 
ともできず、困っています。 
 
 
要は
wsprintfに値を格納して
その後の処理で
 
hp-=10
 
としても、
wsprintfでnowhpに値を格納し
TextOutで50と表示されるようにしたいのです。
 
 
うまく説明できませんが、↑のようにする方法を
 
教えてください。
 
お願いします。

Aベストアンサー

なんか怪しげなキャストが見えますが……。

wsprintfは文字列を扱うWin32 APIなので,wsprintfAとwsprintfWがあります。
int WINAPI wsprintfA (char *, const char *, ...);
int WINAPI wsprintfW (wchar_t *, const wchar_t *, ...);
なので,wsprintfとして使う場合は,全てTCHAR系で統一する必要があります。
TCHAR nowhp[11];
wsprintf(nowhp, TEXT("%d"), hp);

ただし,
MSDN: wsprintf function (Windows)
http://msdn.microsoft.com/es-ar/library/ms647550
には,wsprintfは使うな,と書いてありますので,
TCHAR nowhp[11];
if (FAILED(StringCbPrintf(nowhp, sizeof(nowhp) / sizeof(nowhp[0]), TEXT("%d"), hp))
{
// 失敗時処理
}
のようにした方がよいでしょう。

なんか怪しげなキャストが見えますが……。

wsprintfは文字列を扱うWin32 APIなので,wsprintfAとwsprintfWがあります。
int WINAPI wsprintfA (char *, const char *, ...);
int WINAPI wsprintfW (wchar_t *, const wchar_t *, ...);
なので,wsprintfとして使う場合は,全てTCHAR系で統一する必要があります。
TCHAR nowhp[11];
wsprintf(nowhp, TEXT("%d"), hp);

ただし,
MSDN: wsprintf function (Windows)
http://msdn.microsoft.com/es-ar/library/ms647550
には,wsprintfは使うな,と書いてありますので...続きを読む

Qコンボボックス表示文字列を取得する場合

VC++ver6.0を使用しています。

コンボボックスのドロップダウンリストより
表示されている文字列を取得しようと思い、
下記のようにコーディングを行いました。


コンボボックスメンバ変数名:m_combo_year
ON_CBN_SELCHANGE(IDC_COMBO_HYOJI_SEIREKI, OnSelChangeComboHyojiSeireki)

void CKoyomiDlg::OnSelChangeComboHyojiSeireki()
{
 CString strComboYear;
 m_combo_year.GetWindowText(strComboYear);
}

実行すると、
ドロップダウンリストを
初期値2007 → 2006選択 → 2005選択
と、2回選択した場合
取得する値は
起動せず → 2007 → 2006
と、「選択した値」ではなく「表示していた値」を取得してしまいます。

何か解決策はございますでしょうか。

宜しくお願い致します。

Aベストアンサー

> m_combo_year.GetWindowText(strComboYear);
m_Combo_year.GetLBText(m_Combo_year.GetCurSel(), strComboYear);

Qキャレットの現在位置の表示 (Win32API)

 Win32APIの習作としてエディタを作っているのですが,
ステータスバーに現在のキャレット位置を表示する部分で困っています.
いろいろ調べて下記のコードを書いてみたのですが,
エディットコントロールに更新が無いとき(矢印キーで移動など)
にキャレット位置の更新ができないです.
良い方法がありましたらご教授下さい.
(ここのサンプルコードが良いとかでもありましたらお願いします.)

////////////////////////////////////////////////////////////////
// MyEditor.c

static const int FONT_WIDTH = 6;
static const int FONT_HEIGHT = 18;

int __stdcall WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
...略...
}

LRESULT __stdcall WndProc(HWND hWnd, UINT uMsg, WPARAM wp, LPARAM lp)
{
...略...
switch (uMsg) {
...略...
case IDC_EDIT:{
char str[64];
POINT pt = {0, 0};
RECT rc = {0, 0, 0, 0};
GetCaretPos(&pt);
wsprintf(str, "現在のキャレット位置 (%d, %d)",
pt.x / FONT_WIDTH, pt.y / FONT_HEIGHT);
SendMessage(hStatusbar, SB_SETTEXT, 1, (LPARAM)str);
GetClientRect(hStatusbar,&rc);
InvalidateRect(hStatusbar, &rc, TRUE);
break ;}
...略...
}
return 0L;
}

 Win32APIの習作としてエディタを作っているのですが,
ステータスバーに現在のキャレット位置を表示する部分で困っています.
いろいろ調べて下記のコードを書いてみたのですが,
エディットコントロールに更新が無いとき(矢印キーで移動など)
にキャレット位置の更新ができないです.
良い方法がありましたらご教授下さい.
(ここのサンプルコードが良いとかでもありましたらお願いします.)

////////////////////////////////////////////////////////////////
// MyEditor.c

static const int...続きを読む

Aベストアンサー

★アドバイス
・エディット・ボックスをサブクラス化してWM_KEYDOWNで
 カーソルキーの移動を監視。移動されていればキャレット位置の
 表示をすれば良いでしょう。
 http://wisdom.sakura.ne.jp/system/winapi/win32/win64.html→『サブクラス化』
 http://wisdom.sakura.ne.jp/system/winapi/win32/win30.html→『キーボードイベント』

Qエディットボックスの入力制限について

いつもお世話になっております。
VS2005でC++を使ってWindowsプログラミングの作成を行っています。

エディットボックスに半角数字のみ入力するような制限はできますが、
この制限をもっと詳しくし、例えば数字の0~60までしか入力できないようにすることは可能でしょうか。

ご教授お願いいたします。

Aベストアンサー

Win32 APIを使っていて、入力があるたびに値のチェックをするのであれば、WM_COMMANDの処理で通知コードがEN_UPDATEまたはEN_CHANGEの場合を扱えば実現できます。
たとえば、エディットボックスのあるダイアログボックスのメッセージハンドラをに以下のような文を挿入すれば、エディットボックスの入力値が変わるごとに入力チェックをしてくれます(半角スペース*2を全角スペースに変換しています)。

case WM_COMMAND:
(挿入ここから)
 if (HIWORD(wParam) == EN_UPDATE/* 表示の変更前にチェックするならEN_CHANGE */ && LOWORD(wParam) == IDC_EDIT/* チェックを行うエディットボックスのコントロールID */)
 {
  char buf[256]; /* 文字列処理用バッファ */
  int value; /* 入力値 */

  GetWindowText((HWND)lParam, buf, 255); /* エディットボックスの文字列取得 */
  value = atoi(buf);
  if (value < 0 || 60 < value) /* 入力値チェック */
  {
   /* 入力値が範囲外であることをユーザーに通知する */
   MessageBox(hDlg, "0から60までの間の数を入力してください。", "入力エラー", MB_OK);
  }
 }
(以下、他のWM_COMMANDメッセージ処理)

ただし、入力値チェックを1からにして動かしてみればわかりますが、入力があるたび値のチェックをすると使う側からすればウザいです。

このような場合、自分ならば、値を入力ではなく選択させる(コンボボックスやスピンコントロールなどを使って)か、入力チェックを入力した値を利用/取得する時点で行うようにします。

Win32 APIを使っていて、入力があるたびに値のチェックをするのであれば、WM_COMMANDの処理で通知コードがEN_UPDATEまたはEN_CHANGEの場合を扱えば実現できます。
たとえば、エディットボックスのあるダイアログボックスのメッセージハンドラをに以下のような文を挿入すれば、エディットボックスの入力値が変わるごとに入力チェックをしてくれます(半角スペース*2を全角スペースに変換しています)。

case WM_COMMAND:
(挿入ここから)
 if (HIWORD(wParam) == EN_UPDATE/* 表示の変更前にチェックするな...続きを読む

Qエディットボックスの背景の色変更方法

C++初心者です。
どうしても、答えが出てこないことがあり質問致します。

環境
VC++Express2008 Win32API ダイアログベース

ダイアログにResEditにエディットボックスを配置して
あとは文字や背景の色替えをコーディングしてます。
文字は表示できるのですがその背景を色替えができません。
いろいろ、ネットで調べるも、ほとんどMFCのサンプルばかりで
意味がわかりません。
テストプログラムは以下です。

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
hInst = hInstance;
//ダイアログボックス表示
DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc);

return 0;
}

BOOL CALLBACK DialogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
HWND pWnd;
PAINTSTRUCT ps;

switch (msg)
{
case WM_INITDIALOG:
break;
case WM_PAINT:

pWnd = GetDlgItem(hWnd, IDC_EDIT10);
hdc = BeginPaint(pWnd,&ps);
SetBkColor(hdc, RGB(0,255,0)); //←うまくいかない!!
SetWindowText(pWnd, _T("aaa"));
EndPaint(pWnd, &ps);
      break;
 
      以下省略

これで、テキスト"aaa"は表示されますが、背景は変わりません。
SetBkColorの使い方がまずいと思うのですが
僕のイメージ的にSetWindowTextと同じようにウィンドウハンドル指定で
背景を変える方法ってないのかなって素人ながら思うのですが、、わかりません。
あと、質問が変わってしまうのですが、ダイアログウィンドウに100個くらいのエディットボックスを
作成して、それらの背景色を替えて状態表示(点滅もあり)を行うようなものを作りたいのですが
ナンセンスなのでしょうか?
Rectangleで座標指定で100個の箱を作成する方がCPU負荷などもないのかなーって思います。
では、質問の内容がよくわからない点などあるかもしれませんが
よろしくお願いいたします。
    

C++初心者です。
どうしても、答えが出てこないことがあり質問致します。

環境
VC++Express2008 Win32API ダイアログベース

ダイアログにResEditにエディットボックスを配置して
あとは文字や背景の色替えをコーディングしてます。
文字は表示できるのですがその背景を色替えができません。
いろいろ、ネットで調べるも、ほとんどMFCのサンプルばかりで
意味がわかりません。
テストプログラムは以下です。

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstan...続きを読む

Aベストアンサー

SetBkColor を使うんだったら、WM_PAINT ではダメみたいですね。
とりあえず、WM_CTLCOLOREDIT だと背景色が変わります。

INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
static HBRUSH hbrush;

switch (message)
{
case WM_INITDIALOG:
hbrush = CreateSolidBrush( RGB( 0, 255, 0 ) );
return (INT_PTR)TRUE;

case WM_CTLCOLOREDIT:
SetBkColor( (HDC)wParam, RGB( 0, 255, 0 ) );
SetWindowLong( hDlg, DWL_MSGRESULT, ( LPARAM )hbrush ); // ←なくても大丈夫かも
return (INT_PTR)TRUE;
}
return (INT_PTR)FALSE;
}

ただしこの方法では、フォントが小さくて余白がある場合、余白は指定した背景色にはならないみたいです。

他にもやり方があるのかもしれませんが、サブクラス化してエディットコントロールの WM_PAINT で塗りつぶしてやると、いい感じになります。

WNDPROC OrgEditProc;

INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
static HBRUSH hbrush;
HWND hwndEdit;

switch (message)
{
case WM_INITDIALOG:
hwndEdit = GetDlgItem( hDlg, IDC_EDIT1 );
OrgEditProc = ( WNDPROC )SetWindowLong( hwndEdit, GWL_WNDPROC, ( LPARAM )EditProc );
hbrush = CreateSolidBrush( RGB( 0, 255, 0 ) );
return (INT_PTR)TRUE;

case WM_CTLCOLOREDIT:
SetBkColor( (HDC)wParam, RGB( 0, 255, 0 ) );
SetWindowLong( hDlg, DWL_MSGRESULT, ( LPARAM )hbrush );
return (INT_PTR)TRUE;
}
return (INT_PTR)FALSE;
}

INT_PTR CALLBACK EditProc(HWND hwndEdit, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rc;
HBRUSH hbrush;

switch( message ) {
case WM_PAINT:
hdc = BeginPaint( hwndEdit, &ps );
hbrush = CreateSolidBrush( RGB( 0, 255, 0 ) );
GetClientRect( hwndEdit, &rc );
FillRect( hdc, &rc, hbrush );
EndPaint( hwndEdit, &ps );
DeleteObject( hbrush );
}
return( CallWindowProc( OrgEditProc, hwndEdit, message, wParam, lParam ) );
}


>Rectangleで座標指定で100個の箱を作成する方がCPU負荷などもないのかなーって思います。

これは、よくわかりませんでした。Rectangle で作った箱にはテキスト入力しないのだったらそれで良いと思いますけど・・・。

SetBkColor を使うんだったら、WM_PAINT ではダメみたいですね。
とりあえず、WM_CTLCOLOREDIT だと背景色が変わります。

INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
static HBRUSH hbrush;

switch (message)
{
case WM_INITDIALOG:
hbrush = CreateSolidBrush( RGB( 0, 255, 0 ) );
return (INT_PTR)TRUE;

case WM_CTLCOLOREDIT:
SetBkColor( (HDC)wParam, RGB( 0, 255, 0 ) );
SetWindowLong( hDlg, DWL_MSGRESULT, ( LPARAM )hbrush ); // ←なくても大丈夫かも
r...続きを読む

QcharからLPTSTRへの変換方法

リストコントロールにchar型の変数の値を数値として表示させたいのですが、charからLPTSTRへの洗練された変換方法がよくわからないです。

char tempChar;
CString tempString;
tempString.Format("%s", tempChar);
LPTSTR lpsz = new TCHAR[tempString.GetLength()+1];
_tcscpy(lpsz, tempString);

こんなプログラムを考えてみたのですが、汚いような気がします。もっと簡単で洗練された変換方法はないのでしょうか?

Aベストアンサー

wsprintfを使ってはどうでしょうか?

char tmpChar = 100;//表示する数値
TCHAR buf[5];
wsprintf(buf, "%d", tempChar);

QWM_SIZEとWM_SIZINGの違い (Win32API)

Windowsプログラミングで、画面のサイズを変更したときに送られてくるメッセージで、
WM_SIZEで処理するのとWM_SIZINGで処理するのとでは何が違うのでしょうか?
WM_SIZEとWM_SIZINGの違いは何なのでしょうか?

また、似たようなものでWM_MOVEとWM_MOVINGの違いも教えてもらいたいです。

Aベストアンサー

実際にプログラムを書いてみれば、両者の違いは明白になるでしょう。

WM_SIZE は「サイズの変更後に」メッセージがアプリケーションに飛んでくるので、
ウィンドウのコーナーからマウスを離した時に文字がビョンと移動します。

Windows98 くらいまではウィンドウのサイズの変更はまずは輪郭だけサイズが変って
マウスをコーナーから離した時にウィンドウの中身が再描画されていたので、
WM_SIZE のメッセージハンドラを実装することになったでしょう。

しかし最近のインターフェイスはサイズ変更中もズリズリとウィンドウの中身が
再描画され続けます。これには WM_SIZING のメッセージハンドラを実装して、
サイズ変更中常に文字列の再描画を繰り返す必要があるでしょう。

Qリストビューの選択状態を取得するメッセージはありますか?

リストビューが選択状態(1行が青色や灰色の背景になる状態)にあって、エディットボックスが空欄では無いときに、
あるボタンを有効にするという処理をしたいと思っています。

リストビューが選択されていることを教えてくれるメッセージがあれば、教えてください。よろしくお願いします。

環境:Win32 API, VC++6.0

Aベストアンサー

★アドバイス
>また話は少し変わってしまうのですが、リストビューに項目を追加したときに、
>その追加した行にフォーカスが合って、スクロールバーが自動的に下がってくるように
>することは可能でしょうか。
 ↑
 可能です。
 ListView_EnsureVisible( hList, 追加した行, TRUE );
 とします。これで自動的に最後に追加した行にスクロールします。
・あとちょっと不明な点がありますが、
 (1)追加した行にフォーカスを合わせるのか?
 (2)追加した行に範囲選択を設定するのか?
 どっちでしょうか。
 どちらにしても ListView_SetItemState() マクロで設定できますけど。
・(1)フォーカスを合わせる
 ListView_SetItemState( hList, 追加した行, LVIS_FOCUSED, LVIS_FOCUSED );
・(2)追加した行に範囲選択を設定する
 ListView_SetItemState( hList, 追加した行, LVIS_SELECTED, LVIS_SELECTED );
 とします。
※フォーカスと範囲選択は違います。注意。

>今回はある特定の行ではなく、リストビューのどこかの行が選択されているという
>イベントハンドラがあればと思っているのですが、そのようなものはあるのでしょうか。
 ↑
 イベントハンドラはないと思いますけど。
 その代わりに ListView_GetItemState()、ListView_GetNextItem() マクロのチェックで
 分かると思います。ListView_GetNextItem() で LVIS_SELECTED フラグを見つければ
 その行とかが分かると思います。
・あるいは先頭行から順番に ListView_GetItemState() マクロで LVIS_SELECTED フラグが
 立っている行を自分で検索するとかすれば良い。
 詳しくは下の『参考URL』をどうぞ。
・以上。

参考URL:http://www.geocities.jp/ekakibuta/Programing/ListView_GetNextItem.htm

★アドバイス
>また話は少し変わってしまうのですが、リストビューに項目を追加したときに、
>その追加した行にフォーカスが合って、スクロールバーが自動的に下がってくるように
>することは可能でしょうか。
 ↑
 可能です。
 ListView_EnsureVisible( hList, 追加した行, TRUE );
 とします。これで自動的に最後に追加した行にスクロールします。
・あとちょっと不明な点がありますが、
 (1)追加した行にフォーカスを合わせるのか?
 (2)追加した行に範囲選択を設定するのか?
 どっちでし...続きを読む

QEDITコントロールで入力できる文字を制限するには?

Windows APIを使ってソフト開発しています。

EDITコントロールで文字入力を受ける際、入力できる文字をアルファベットと数字のみ(もしくは任意の文字のみ)にするにはどうすればよいのでしょうか?ユーザーが記号キーなどを押しても無視されるようにしたいのですが。

「ES_NUMBER」スタイルを付加すると数字のみの入力にできますが、こうゆう感じで任意の文字のみを許可するようにできるでしょうか?

Aベストアンサー

★アドバイス
>「ES_NUMBER」スタイルを付加すると数字のみの入力にできますが、
>こうゆう感じで任意の文字のみを許可するようにできるでしょうか?
 ↑
 ES_XXXX などのスタイルでは出来ません。無理。
 任意の文字だけを入力可能にするにはエディットボックスを
 サブクラス化して WM_KEYDOWN を処理して下さい。
 http://wisdom.sakura.ne.jp/system/winapi/win32/win64.html→『サブクラス化』
 http://wisdom.sakura.ne.jp/system/winapi/win32/win30.html→『キーボードイベント』


人気Q&Aランキング

おすすめ情報