MFC - 대화 상자가 표시된 직후 코드 실행(Form.Shown과 동등한 .NET)

StackOverflow https://stackoverflow.com/questions/269462

  •  06-07-2019
  •  | 
  •  

문제

C++ MFC 프로젝트에 약간의 변경을 하고 있습니다.저는 .NET 개발자이기 때문에 Windows 프로그래밍이 처음입니다.

CDialog가 처음으로 완전히 표시(채색)된 직후에 몇 가지 메서드를 실행해야 하지만 단 한 번만 실행해야 합니다.

어떻게 해야 하나요?.NET에서는 처리하겠습니다. 양식.표시됨 이벤트.

일부 메시지를 처리해야 합니까?어느?일부 CDialog 메서드를 재정의해야 합니까?아니면 쉬운 방법은 없나요?WM_ACTIVATE를 처리한 다음 플래그를 사용하여 다른 메서드를 한 번만 호출할 생각입니다.

도움이 되었습니까?

해결책

여기에서 답을 찾았습니다. 대화 상자가 표시 될 때까지 대기 대기 무언가를하기 전에

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_WINDOWPOSCHANDED를 맵핑 한 다음 ON_MESSAGE를 사용하여 WM_APP를 맵핑해야합니다. 보다 이 CodeProject 기사 자세한 사항은.

다른 팁

제가 여러 번 사용해 큰 성공을 거둔 또 다른 접근 방식은 타이머를 사용하는 것입니다.10m0s로 설정하세요.대화 상자가 표시된 후에만 실행됩니다.

지옥은 코드를 OnPaint ()에 넣고 수업에서 bool m_lyInitilized를 넣습니다. 나는 타이머도 좋아한다 .. 나는 보통 100ms와 함께 간다. 또한이 경우 모든 시작 코드를 Oninit에서 옮깁니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top