0

典型的なパターンは、メッセージコールバック(WndProc)のメッセージで子ウィンドウを作成することWM_CREATEです。

LRESULT APIENTRY WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
...
switch (message) {
  case WM_CREATE:
  ....
  hwndChild[i] = CreateWindow (szChildClass[i], NULL, WS_CHILDWINDOW | WS_BORDER  ...

これは良い機会だと完全に理解していますが、後でそれを行うのは問題ですか?その理由の1つは、子ウィンドウが同じスレッド内に作成されることです。しかし、他に理由はありますか?

そして、(親と)同じスレッドで子ウィンドウを作成することはどれほど重要ですか?「親GUIダイアログスレッドの子スレッドは子ウィンドウを作成できますか?」の時点では、これは一般的な問題ではないようです。

4

1 に答える 1

1

後で子ウィンドウを作成することは問題ありませんが、前述のように、同じスレッドから作成する必要があります。

たとえば、WM_COMMANDメッセージハンドラー内(たとえば、ユーザーがボタンをクリックしたとき)に、またはWM_TIMERへの応答として子ウィンドウを作成できます。

各スレッドには独自のメッセージキューがあるため、別のスレッドから子ウィンドウを作成することはお勧めできません。ただし、別のスレッドでウィンドウの作成を開始する場合は、ユーザー定義のメッセージをウィンドウに送信することで回避できます。

  1. メッセージを定義します(例:#define WM_CREATEMYWINDOW WM_USER + 123)
  2. 別のスレッドからそれをあなたのウィンドウに投稿してください:

    PostMessage(g_hWnd, WM_CREATEMYWINDOW, 0, 0);
    
  3. ウィンドウプロシージャで、子ウィンドウを作成します。

    if (message == WM_CREATEMYWINDOW)
        hwndChild[i] = CreateWindow(...);
    
于 2012-06-24T22:36:19.110 に答える