윈도우 프로그래밍 Visual C++ 2010 MFC Programming(김선우, 신화서 저) 3장 연습문제입니다.
저번에 이어 나머지 연습문제를 풀어봤습니다.
[3-9]
//뷰 윈도우에 가로와 세로 스크롤바가 나타나도록 Simple 예제를 수정하시오
BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
{
if (!CWnd::PreCreateWindow(cs))
return FALSE;
cs.dwExStyle |= WS_EX_CLIENTEDGE;
cs.style |= WS_HSCROLL | WS_VSCROLL; //스크롤바 추가
cs.style &= ~WS_BORDER;
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
::LoadCursor(NULL, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL);
return TRUE;
}
[3-10]
//폭이 800 너비가 600인 윈도우로 실행되도록 Simple 예제를 수정하시오
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: CREATESTRUCT cs를 수정하여 여기에서
// Window 클래스 또는 스타일을 수정합니다.
cs.cx = 800, cs.cy = 600; //크기 제어
cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE
| WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU;
cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
cs.lpszClass = AfxRegisterWndClass(0);
return TRUE;
}
[3-11]
//Simple 예제가 최상위 윈도우로 실행되도록 수정하시오
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: CREATESTRUCT cs를 수정하여 여기에서
// Window 클래스 또는 스타일을 수정합니다.
cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE
| WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU;
cs.dwExStyle = WS_EX_TOPMOST; //최상위 윈도우
cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
cs.lpszClass = AfxRegisterWndClass(0);
return TRUE;
}
[3-12]
//기존 윈도우 대신 타이틀바가 있는 팝업 윈도우를 생성하도록 Simple 예제를 수정하시오
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: CREATESTRUCT cs를 수정하여 여기에서
// Window 클래스 또는 스타일을 수정합니다.
cs.style = WS_POPUPWINDOW; //팝업 윈도우
cs.cx = 800, cs.cy = 600; //크기 지정
//cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU;
cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
cs.lpszClass = AfxRegisterWndClass(0);
return TRUE;
}
[3-13]
이 문제를 풀기 위해서는 우선 MainFrm.h에 가서 아래와 같이 수정해야합니다
class CMainFrame : public CFrameWnd
{
public:
CMainFrame();
protected:
//DECLARE_DYNAMIC(CMainFrame)
DECLARE_DYNCREATE(CMainFrame)
// 특성입니다.
그 다음에는 MainFrm.cpp에 가서 아래와 같이 수정합니다.
//IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd);
//CSimpleApp::InitInstance() 함수에서 CMainFrame 객체를 new 연산자가 아닌
//CRuntimeClass::CreateObject() 함수로 생성하도록 Simple 예제를 수정하시오
BOOL C연습문제313App::InitInstance()
{
CWinApp::InitInstance();
EnableTaskbarInteraction(FALSE);
// RichEdit 컨트롤을 사용하려면 AfxInitRichEdit2()가 있어야 합니다.
// AfxInitRichEdit2();
// 표준 초기화
// 이들 기능을 사용하지 않고 최종 실행 파일의 크기를 줄이려면
// 아래에서 필요 없는 특정 초기화
// 루틴을 제거해야 합니다.
// 해당 설정이 저장된 레지스트리 키를 변경하십시오.
// TODO: 이 문자열을 회사 또는 조직의 이름과 같은
// 적절한 내용으로 수정해야 합니다.
SetRegistryKey(_T("로컬 응용 프로그램 마법사에서 생성된 응용 프로그램"));
// 주 창을 만들기 위해 이 코드에서는 새 프레임 창 개체를
// 만든 다음 이를 응용 프로그램의 주 창 개체로 설정합니다.
//CMainFrame* pFrame = new CMainFrame;
CRuntimeClass *pClass = RUNTIME_CLASS(CMainFrame);
CMainFrame *pFrame = (CMainFrame*)pClass->CreateObject();
if (!pFrame)
return FALSE;
m_pMainWnd = pFrame;
// 프레임을 만들어 리소스와 함께 로드합니다.
pFrame->LoadFrame(IDR_MAINFRAME,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL,
NULL);
// 창 하나만 초기화되었으므로 이를 표시하고 업데이트합니다.
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();
return TRUE;
}
[3-14]
//윈도우 타이틀바 아이콘이 다음과 같이 윈도우에서 기본으로 제공하는 느낌표 아이콘
//으로 표시되도록 Simple 예제를 수정하시오
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: CREATESTRUCT cs를 수정하여 여기에서
// Window 클래스 또는 스타일을 수정합니다.
cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE
| WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU;
cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
cs.lpszClass = AfxRegisterWndClass(NULL, NULL, NULL, LoadIcon(NULL, IDI_EXCLAMATION)); //느낌표 아이콘
return TRUE;
}
[3-15]
// CChildView 메시지 처리기
//뷰 윈도우에 WM_LBUTTONDBLCLK 메시지가 발생하지 않게
//윈도우 클래스 특성을 변경하도록 Simple 예제를 수정하시오
BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
{
if (!CWnd::PreCreateWindow(cs))
return FALSE;
cs.dwExStyle |= WS_EX_CLIENTEDGE;
cs.style &= ~WS_BORDER;
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS|WM_LBUTTONDBLCLK,
::LoadCursor(NULL, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL); //WM_LBUTTONDBLCLK 추가
return TRUE;
}
[3-16]
//프로그램을 종료할 때 다음과 같은 메시지 상자를 띄우도록 Simple 예제를 수정하시오
int C연습문제316App::ExitInstance()
{
//TODO: 추가한 추가 리소스를 처리합니다.
MessageBox(NULL, _T("프로그램을 종료합니다."), _T("종료"), NULL);
return CWinApp::ExitInstance();
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'MFC > 윈도우 프로그래밍' 카테고리의 다른 글
MFC 윈도우 프로그래밍 4장 연습문제(1~8) (2) | 2018.03.24 |
---|---|
MFC 윈도우 프로그래밍 3장 심화문제 (4) | 2018.03.21 |
MFC 윈도우 프로그래밍 3장 연습문제(1~8) (0) | 2018.03.18 |
MFC 윈도우 프로그래밍 2장 심화문제 (2) | 2018.03.13 |
MFC 윈도우 프로그래밍 2장 연습문제(8~16) (0) | 2018.03.12 |