OninitDialog和OnCreate

ウィンドウの作成時に表示されるコントロールと表示されないコントロールを指定する場合は、CDialog CDialog :: OnInitDialogのメンバー関数であるOninitDialogをオーバーライドすることを選択します。

MSDNサンプルコード:

BOOL CSimpleDlg::OnInitDialog()
{
   CDialog::OnInitDialog();

   // TODO: Add extra initialization here
   m_cMyEdit.SetWindowText(_T("My Name")); // Initialize control values
   m_cMyList.ShowWindow(SW_HIDE);          // Show or hide a control, etc.

   return TRUE; // return TRUE unless you set the focus to a control
   // EXCEPTION: OCX Property Pages should return FALSE
}

VS2017は、クラスウィザードで仮想関数を書き換えることにより、この関数を追加します。

OnCreate

CWndのメッセージ応答機能です

CWnd :: OnCreate

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

CDialogがCWndのサブクラスであることを指定しているので、どちらが最初に呼び出されるか想像できますか?もちろん、親クラスは最初にOnCreateを呼び出して基本ウィンドウを作成することをここで理解します。この基本ウィンドウでは、ウィンドウがテキストボックス、ダイアログボックス、または別のウィンドウであるかどうかは、対応するクラスの初期化関数によって決定されます。 。ダイアログの場合ボックスの場合はOninitDialogです

 

ネチズンはそれを非常によく言います:

通常、最初にフォームを作成(OnCreate)してから、初期化(OninitDialog)する必要があります。

 

++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++

 

  WM_CREATEメッセージ(つまりOnCreate)に応答するとき、ウィンドウは作成されていません。メンバー変数を割り当てたり、スタイルなどのウィンドウの基本コンテンツを変更したりできますが、ウィンドウが作成されていないため、ウィンドウコントロールを操作できません。作成した。

  WM_CREATEメッセージに応答するとき、ダイアログボックスとサブコントロールはまだ作成されていません。つまり、ウィンドウが作成されることだけがシステムに通知されます。メッセージが応答された後、ダイアログボックスとサブコントロールは作成されます。したがって、このメッセージ応答関数で制御を変更および初期化することはできません。

 

++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++


  WM_INITDIALOGメッセージ(つまりOnInitDialog)に応答すると、ウィンドウが作成されます。ウィンドウを移動したり、スタイルを変更したり、メンバー変数に値を割り当てたりすることができます。

  WM_INITDIALOGメッセージ応答関数は、プログラムの実行中、ダイアログボックスと子コントロールがすべて作成され、コンテンツが表示されようとしているときに送信されるメッセージです。したがって、編集ボックスコントロールの初期化と変更は、WM_INITDIALOGメッセージ応答関数に追加できます。

おすすめ

転載: blog.csdn.net/yangkunhenry/article/details/112549015