windows - sheet - MFC-대화 상자가 표시된 직후에 코드를 실행합니다(.NET의 Form.Shown에 해당).



mfc property sheet tutorial (2)

여기서 대답을 찾았습니다. 뭔가를하기 전에 대화 상자가 표시 될 때까지 기다리는 중입니다 .

Short story:
INT_PTR CALLBACK
DlgProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
  switch (uiMsg) {

  case WM_INITDIALOG:
    return TRUE;

  case WM_WINDOWPOSCHANGED:
    if ((((WINDOWPOS*)lParam)->flags & SWP_SHOWWINDOW) &&
        !g_fShown) {
      g_fShown = TRUE;
      PostMessage(hwnd, WM_APP, 0, 0);
    }
    break;


  case WM_APP:
      MessageBox(hwnd,
                 IsWindowVisible(hwnd) ? TEXT("Visible")
                                       : TEXT("Not Visible"),
                 TEXT("Title"), MB_OK);
      break;

  case WM_CLOSE:
   EndDialog(hwnd, 0);
   break;
  }

  return FALSE;
}

내가 MFC를 사용하고 있다면 WM_WINDOWPOSCHANGED를 매핑 한 다음 ON_MESSAGE를 사용하여 WM_APP를 매핑해야합니다. 자세한 내용은 이 CodeProject 문서 를 참조하십시오.

C ++ 프로젝트에 약간의 변경을하고 있습니다. 나는 .NET 개발자이므로 Windows 프로그래밍은 새로운 것입니다.

처음 CDialog가 완전히 표시 (페인트) 된 직후에 몇 가지 방법을 시작해야합니다.

어떻게해야합니까? .NET에서 나는 Form.Shown 이벤트를 처리 할 것이다.

메시지를 처리해야합니까? 어느? 일부 CDialog 메서드를 재정의해야합니까? 또는 쉬운 방법이 있습니까? 나는 WM_ACTIVATE를 처리하고 플래그를 사용하여 다른 메서드를 한 번만 호출하도록합니다.


Answer #1

지옥은 OnPaint ()에 코드를 추가하고 클래스에 bool m_fullyInitilized를 추가합니다. 나는 타이머도 좋아한다. 나는 보통 100ms로 가긴하지만. 나는 또한 모든 initilization 코드를 oninit 밖으로 옮긴다.이 경우에는 너무 많은 처리를 막기 위해서이다.