1. 모달리스 생성

CModeLess *m_pmodeless = new CModeLess(this);
m_pmodeless->Create(CModeLess::IDD);
m_pmodeless->ShowWindow(SW_SHOW);

2. 현재 메인윈도우 뒤쪽으로 숨기고 싶은경우

m_pmodeless->Create(CModeLess::IDD,GetDesktopWindow());

3. 모달리스로 띄운 다이얼로그의 메모리 해제
/* 1번째 경우 */
// 모달리스 종료시 삭제
void CModeLess::PostNcDestroy()
{
    CDialog::PostNcDestroy();
    ((CMainFrame*)m_parent)->m_pmodeless = NULL;
    delete this;
}
/* 2번째 경우 */
// 모달리스 종료시 부모에게 메시지를 날려 처리
void CModeLess::PostNcDestroy()
{
    CDialog::PostNcDestroy();
    GetParent()->PostMessage(WM_MODELESS_CLOSED,0,0);
    delete this;
}
LRESULT CMainFrame::OnMyMethod(WPARAM wParam, LPARAM lParam)
{
    m_pmodeless = NULL;
    return 0;
}

4. 한개의 인스턴스만 허용하게 할경우
if(m_pmodeless)
{
    m_pmodeless->SetForegroundWindow();
}
else
{
    m_pmodeless = new CModeLess(this);
    m_pmodeless->Create(CModeLess::IDD);
    m_pmodeless->ShowWindow(SW_SHOW);


5. OnOK(), OnCancle()에서의 문제점

void CModeLess::OnCancel()
{
    DestroyWindow();
}
void CModeLess::OnOK()
{
    if(UpdateData(true))
    {
        DestroyWindow();
    }
}

출처 : http://whoim.tistory.com/entry/MFC-%EB%AA%A8%EB%8B%AC%EB%A6%AC%EC%8A%A4modeless-%EB%8B%A4%EC%9D%B4%EC%96%BC%EB%A1%9C%EA%B7%B8-%EC%83%9D%EC%84%B1
Posted by pkss
,

MFC 에서 초기 윈도우의 크기를 설정하는 방법은


CWnd 에서 Override 한 PreCreateWindow(CREATESTRUCT& cs) 함수에서 할 수 있다.

typedef struct tagCREATESTRUCTA {
    LPVOID      lpCreateParams;
    HINSTANCE   hInstance;
    HMENU       hMenu;
    HWND        hwndParent;
    int         cy;
    int         cx;
    int         y;
    int         x;
    LONG        style;
    LPCSTR      lpszName;
    LPCSTR      lpszClass;
    DWORD       dwExStyle;
} CREATESTRUCTA, *LPCREATESTRUCTA;
typedef CREATESTRUCTA CREATESTRUCT;


CREATESTRUCT 구조체의 멤버변수는 위와 같은데, 이중에 cx , cy 값을 조정하게 되면, 윈도우의 시작하는 윈도우의 크기를 조정할 수 있다.

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.cx = 400;
cs.cy = 300;
return TRUE;
}
 
이런 식으로 사용하면 된다.
Posted by pkss
,

MFC에서 기본적으로 CView 라는 녀석을 상속 받는 뷰 클래스를 생성할 수 있는데, 이녀석은 스크롤바가 달려있지 않다.

물론 스타일을 수정하여 스크롤바를 달 수도 있지만 MFC에서 제공해주는 CScrollView를 통해서 간단하게 해결할 수가 있다.

아래는 CView 를 상속 받는 AView 를 스크롤뷰로 변경하는 예제다.

***변 경 방 법***

[Step 1]
class AView : public CView 를
class AView : public CScrollView 로 변경

[Step 2]
IMPLEMENT_DYNCREATE(AView, CView)
BEGIN_MESSAGE_MAP(AView, CView) 를

IMPLEMENT_DYNCREATE(AView, CScrollView)
BEGIN_MESSAGE_MAP(AView, CScrollView) 로 변경

[Step 3]
OnInitialUpdate() 함수를 오버라이딩해서 SetScrollSizes() 함수를 호출함. SetScrollSizes() 함수를 호출하여 초기화 하지 않을 경우 오류를 발생시킴.
void AView::OnInitialUpdate()
{
CView::OnInitialUpdate();

// TODO: Add your specialized code here and/or call the base class
CRect rc;
GetClientRect(&rc);
CSize sizeViewPage;
sizeViewPage.cx = rc.right-rc.left;
sizeViewPage.cy = rc.bottom-rc.top;

CSize sizeViewPageTotal;
sizeViewPageTotal.cx = sizeViewPage.cx;
sizeViewPageTotal.cy = sizeViewPage.cy; // 3페이지를 설정하고 싶으면 * 3을 하면 되긋지

SetScrollSizes(MM_TEXT, sizeViewPageTotal);

}

[Step 4] - 이것은 필수가 아니다.
OnVScroll() , OnHScroll() 메시지 함수를 구현함. 구현하지 않아도 기본적으로 SetScrollSizes()함수에서 지정한 공간만큼의 동작을 행한다. 특별하게 다른 처리를 하고 싶다면 재지정한다.
void AView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
switch(nSBCode)
{
case SB_LINEUP:
case SB_LINEDOWN:
case SB_PAGEUP:
case SB_PAGEDOWN:
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
break;
}

CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
}
void AView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
switch(nSBCode)
{
case SB_LINEUP:
case SB_LINEDOWN:
case SB_PAGEUP:
case SB_PAGEDOWN:
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
break;
}


CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
}

위와 같은 기본적인 세팅이 완료되고 컴파일->실행 하게 되면 스크롤바가 붙어있는 윈도우가 생성되며 올바르게 동작한다.
Posted by pkss
,