0

エディット コントロール ウィンドウ プロシージャをサブクラス化したところ、EN_UPDATE が送信されなくなっていることがわかりました。

私は何かを見逃していますか?誰かが私にこの回避策を提案してくれますか

LRESULT CALLBACK EditBoxProc_textbox3( HWND hwnd, UINT message , WPARAM wParam, LPARAM lParam )
{
  int previous_position = 0 ;
  WCHAR previous_text [1024];
  WCHAR current_text [1024];


  switch (message)
  {

    case WM_CREATE:
       previous_text[0] = L'\0';
       current_text[0] = L'\0';
       break;

    case EN_SETFOCUS:
      // :TODO: read the current text of the textbox3 and update textbox2 
      // text according to it.                                             //
      Edit_Enable(hwndTextBox2,FALSE);
      break;

    case EN_UPDATE:
      MessageBox(NULL,L"EN_UPDATE", lpszAppName,MB_OK);
      GetWindowText( hwndTextBox3,  current_text ,1024);
      if( is_valid_textbox3(current_text))
      {
        wcscpy(previous_text,current_text);
        previous_position = LOWORD(Edit_GetSel(hwndTextBox3));
        update_textbox2(NULL);

      }else
      {
        SetWindowText(hwndTextBox3, previous_text );
        Edit_SetSel(hwndTextBox3,previous_position, previous_position);
      }  
      break;

    case EN_KILLFOCUS:
      Edit_Enable(hwndTextBox2,TRUE);
      break;
    default:
      break;
  }
  return CallWindowProc(edit_old_wndproc_textbox3,hwnd,message,\
           wParam,lParam);
}
4

1 に答える 1

4

その後、EN_UPDATE が送信されなくなっていることがわかりました

そもそも EN_UPDATE を送信していません。これは、実際に WM_COMMAND メッセージとして送信される通知メッセージです。また、コントロール自体ではなく、編集コントロールの親に送信されます。EN_SET/KILLFOCUS についても同様です。

ここでの設計哲学は、エディット コントロールをダイアログなどに簡単に配置できるということです。また、ダイアログを特定の方法で動作させるカスタム コードは、親ウィンドウのプロシージャに記述され、コントロールをサブクラス化する必要はありません。これは問題ありませんが、独自の動作を持つカスタマイズされた編集コントロールを作成するのが難しくなります。つまり、エディット コントロールのコンポーネント化が難しくなります。EN_SET/KILLFOCUS 通知は問題ではありません。対応する WM_SET/KILLFOCUS メッセージを簡単に検出できます。しかし、EN_UPDATE で壁にぶつかるでしょう。コントロールはそのようなメッセージをそれ自体に送信しません。親ウィンドウだけがそれを検出できます。

エディット コントロールのコンポーネント化は非常に望ましく、Winforms や Qt などのオブジェクト指向クラス ライブラリによって積極的に追求されています。それらには、オーバーライド可能な仮想メソッド (OnTextChanged、changeEvent) を持つコントロール (TextBox、QLineEdit) のクラス ラッパーがあり、コントロールを独自の動作を持つ派生クラスにカスタマイズできます。そして、親 (TextChanged、textChanged) だけでなく、誰でもサブスクライブできるイベント (別名シグナル) を生成します。これを機能させるには、親ウィンドウが参加する必要があります。WM_COMMAND メッセージを取得したら、通知を子コントロールにエコー バックする必要があります。特別なメッセージを送り返すか、子クラスで仮想メソッドを呼び出します。

もちろん、これを自分で実装することもできますが、そのようなクラス ライブラリを再発明する責任はあります。代わりに既存のものを使用することを検討してください。

于 2013-03-30T14:25:32.790 に答える