본문 바로가기
C++ 200제/코딩 IT 정보

MFC 다이얼로그 : 항상 위 설정 (Dialog 포커스 최상위 고정)

by vicddory 2017. 3. 24.


MFC에서 특정 다이얼로그를 항상 위에 놓는 소스입니다.

다른 dialog 예제를 보면 SetWindowsPos()를 사용하는 경우도 있으나, 다른 창, 또는 다른 다이얼로그에 위치를 내주는 경우가 있어서 위의 소스가 사용하긴 더 쉽습니다.


아래 소스는 왼쪽 최상단을 기준으로 다이얼로그를 항상 위로 설정하는 방법입니다.


void CMy600MVDlg::OnPaint()
{
    CPaintDC dc(this); // device context for painting
    
    CRect wndRect;
 
    SystemParametersInfo(SPI_GETWORKAREA, NULL, &wndRect, NULL);
 
    int nShow = this->ShowWindow(SW_SHOW);
    int nWidth = wndRect.right - wndRect.left;
    int nHeight = wndRect.bottom - wndRect.top ;
 
    nShow = this->SetWindowPos(&wndTopMost,
                    (wndRect.right - nWidth),
                    (wndRect.bottom - nHeight), 0, 0, SWP_NOSIZE);
...
...
}


추가로, System Modal의 속성을 True로 바꾸거나, TopMost의 속성을 바꾸는 방법도 있는데, 완벽하진 않습니다.


경우에 따라 다른 창에 밀려 항상 위로 나타나지 않습니다. 그렇기에 처음부터 다이얼로그의 위치를 잡아주는 것이 좋아요. 위의 소스처럼 dialog SetWindowPos() 함수를 이용해서 말이죠.


만약, 위와 같은 방법으로도 해결되지 않으면 상속 관계를 살펴보셔야 하는데요.


class CMyDlg : public CDialog
{
public:
    CString m_MyStr;
    CMyDlg(CWnd *pParentWnd = NULL) :
    CDialog("MYDLG", pParentWnd) { }
      
protected:
    virtual void OnOK();
};


위와 같이 CDialog를 상속한 후 생성할 때, pParentWnd에 부모 다이얼로그 대신 this를 지정하고 있는지 살펴보세요.


부모 클래스에선,


CMyDlg dlg(this);

if(dlg.DoModal() == IDOK) {
    MyMainStr = dlg.m_MyStr;
}


이런 형태로 호출할 수 있습니다.


관련 글

MFC dll에서 다이얼로그 생성이 안 될때 (윈도우 Dialog)

mfc 다이얼로그 스크롤바(PictureControl) 만들기 (프로그래밍 팁)

mfc EnableWindow 다이얼로그 포커스로 무반응 해결

댓글