2

私はこれについて調査を試みましたが、まだ非常に混乱しています。私は本当にグローバルを使用したくありませんが、msdn サイトでさえ、「ダイアログ ボックスのコールバックからアクセスするには、これをグローバルに設定してください」と言っています。ヒープにメモリを作成し、新しく作成されたダイアログ ボックスへのポインターを渡す方法はありますか? ダイアログ ボックスで、ポインターを介してアクセスされるデータを変更できるようにしたいと考えています。

4

2 に答える 2

8

を使用しているDialogBoxParam場合は、次のようにポインターを渡すことができますdwInitParam

DialogBoxParam(hInstance, 
               MAKEINTRESOURCE(IDD_DIALOG), 
               hwndParent, 
               YourDialogFunc, 
               dwInitParam);

次に、ダイアログ コールバックからデータにアクセスします。

INT_PTR CALLBACK YourDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  switch(uMsg) [
    case WM_INITDIALOG:
      // the lParam parameter will contain the data sent through the dwInitParam
      return 1;
    break;
  }
  return 0;
}

を使用すると、パラメータを介して送信されるデータCreateWindowExが を介して送信されます。lpCreateParamsCREATESTRUCTlpParam

 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch(uMsg) [
      case WM_CREATE:
      {
        CREATESTRUCT *pCreate = reinterpret_cast<CREATESTRUCT*>(lParam);
        int* userdata = reinterpret_cast<int*>(pCreate->lpCreateParams);
        // store the pointer in the instance data of the window
        // so it could always be retrieved by using GetWindowLongPtr(hwnd, GWLP_USERDATA) 
        SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)userdata);
      }
      break;
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
 }
于 2013-11-04T03:50:52.460 に答える