대화상자를 생성하고 대화상자 스타일을 Resizing으로 설정합니다.
실행시켜보면 대화상자 가장자리에 마우스로 크기조절을 할 수 있도록 나타나며 실제로 마우스 드래그를 통해 대화상자 크기조절이 됩니다.

대화상자 위에 버튼이나 에디트박스, 리스트박스 등등의 콘트롤을 올리고 조절되는 대화상자 크기에 맞추어 콘트롤들도 같이 변경하고 싶다면 대화상자 클래스의 WM_SIZE 메시지를 등록하여 대화상자의 크기조절이 일어날때마다 콘트롤 크기를 동적으로 맞추면 됩니다.

void CTestDlg::OnSize(UINT nType, int cx, int cy) 

{

CDialog::OnSize(nType, cx, cy);

// TODO: Add your message handler code here


TRACE("\ncx = %d, cy = %d\n", cx, cy);


if (m_List.GetSafeHwnd())  // m_List: 다이얼로그에 그려진 리스트박스의 멤버변수
        {
                // m_List의 크기조절

                CRect rect;

        GetClientRect(&rect);


        rect.left += 5;

        rect.top += 5;

        rect.right -= 5;
                rect.bottom -= 5;

                m_List.MoveWindow(rect);
        } 

}


한가지 주의할 점은 대화상자가 처음 생성될 때 대화상자의 크기가 조절되면서, 아직 콘트롤들이 생성되지 않은 상태에서 OnSize함수가 호출됩니다. 콘트롤이 생성되기 이전에 콘트롤의 멤버함수를 호출하면 프로그램이 죽어버리게 되므로 이러한 문제를 막기위해 GetSafeHwnd() 함수를 호출하여 콘트롤이 생성되었는지 확인하고 MoveWindow를 해 주어야 합니다.

Resizing 되는 대화상자의 최소 및 최대크기를 지정하고 싶다면 WM_GETMINMAXINFO 메시지를 등록하여 최소 및 최대크기를 지정해주면 됩니다.

void CTestDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
     // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

     LPMINMAXINFO lpminmax = (LPMINMAXINFO)lpMMI; 
 
     lpminmax->ptMinTrackSize.x = 500;      // 최소값
     lpminmax->ptMinTrackSize.y = 300; 

     lpminmax->ptMaxTrackSize.x = 1000;   // 최대값
     lpminmax->ptMaxTrackSize.y = 600;


     CDialog::OnGetMinMaxInfo(lpMMI);
}



WM_GETMINMAXINFO 메시지가 보이지 않는다면 클래스위자드의 ClassInfo 탭의 Advanced options의 메시지 필터를 window로 설정하면 볼 수 있습니다.
 
Posted by 루시엔시엘

댓글을 달아 주세요