윈도우 프로그래밍 Visual C++ 2010 MFC Programming(김선우, 신화서 저) 3장 심화문제입니다.
[3-1]
// MainFrm.cpp: CMainFrame 클래스의 구현
//
#include "stdafx.h"
#include "심화문제 3-1.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CMainFrame
IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWndEx)
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx)
ON_WM_DESTROY()
ON_WM_CREATE()
END_MESSAGE_MAP()
// CMainFrame 생성/소멸
CMainFrame::CMainFrame()
{
// TODO: 여기에 멤버 초기화 코드를 추가합니다.
}
CMainFrame::~CMainFrame()
{
}
//프로그램을 종료할 때 윈도우 크기와 위치를 보관해 두었다가 다시 실행할 때 그 크기와 위치가
//복원되도록 Simple 예제를 수정하시오. 단, 정보는 레지스트리에 보관한다
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CMDIFrameWndEx::PreCreateWindow(cs) )
return FALSE;
// TODO: CREATESTRUCT cs를 수정하여 여기에서
// Window 클래스 또는 스타일을 수정합니다.
CWinApp *pApp = AfxGetApp();
//초기 윈도우의 크기를 불러옴, 마지막 인자는 레지스트리가 비어있을 경우 디폴트 값
cs.x = pApp->GetProfileIntW(_T("윈도우크기"), _T("Left"), 30);
cs.y = pApp->GetProfileIntW(_T("윈도우크기"), _T("Top"), 40);
cs.cx = pApp->GetProfileIntW(_T("윈도우크기"), _T("Width"), 100);
cs.cy = pApp->GetProfileIntW(_T("윈도우크기"), _T("Height"), 200);
cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE
| WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU | WS_SIZEBOX; //WS_SIZEBOX 추가
return TRUE;
}
// CMainFrame 진단
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CMDIFrameWndEx::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CMDIFrameWndEx::Dump(dc);
}
#endif //_DEBUG
// CMainFrame 메시지 처리기
//윈도우 위치 불러옴
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWndEx::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 여기에 특수화된 작성 코드를 추가합니다.
CRect rect;
GetWindowRect(&rect);
CWinApp *pApp = AfxGetApp();
//초기 윈도우의 위치를 불러옴, 마지막 인자는 레지스트리가 비어있을 경우 디폴트 값
rect.left = pApp->GetProfileIntW(_T("윈도우위치"), _T("Left"), rect.left);
rect.top = pApp->GetProfileIntW(_T("윈도우위치"), _T("Top"), rect.top);
rect.right = pApp->GetProfileIntW(_T("윈도우위치"), _T("Right"), rect.right);
rect.bottom = pApp->GetProfileIntW(_T("윈도우위치"), _T("Bottom"), rect.bottom);
MoveWindow(rect);
return 0;
}
void CMainFrame::OnDestroy()
{
CRect rect, rect2;
GetWindowRect(&rect);
CWinApp *pApp = AfxGetApp();
//좌상단 꼭지점 정보
pApp->WriteProfileInt(_T("윈도우크기"), _T("Left"), rect.left);
pApp->WriteProfileInt(_T("윈도우크기"), _T("Top"), rect.top);
//가로 세로
pApp->WriteProfileInt(_T("윈도우크기"), _T("Width"), rect.Width());
pApp->WriteProfileInt(_T("윈도우크기"), _T("Height"), rect.Height());;
//위치(좌상단, 우하단)
pApp->WriteProfileInt(_T("윈도우위치"), _T("Left"), rect.left);
pApp->WriteProfileInt(_T("윈도우위치"), _T("Top"), rect.top);
pApp->WriteProfileInt(_T("윈도우위치"), _T("Right"), rect.right);
pApp->WriteProfileInt(_T("윈도우위치"), _T("Bottom"), rect.bottom);
CMDIFrameWndEx::OnDestroy();
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
}
[3-2]
CMainFrame class에 CChildView m_wndView2; 추가
//Simple 예제를 다음과 같이 수정하시오
//CChildView m_wndView2 멤버 변수를 추가하고 CMainFrame::OnCreate() 함수를 수정하여
//뷰 윈도우 위에 다른 뷰 윈도우를 생성한다.
//단, (5, 5) 좌표에 가로와 세로 크기가 100이고 m_wndView를 부모 윈도우로 처리한다
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// 프레임의 클라이언트 영역을 차지하는 뷰를 만듭니다.
if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
{
TRACE0("뷰 창을 만들지 못했습니다.\n");
return -1;
}
//추가
if (!m_wndView2.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
CRect(5, 5, 5 + 100, 5 + 100), &m_wndView, AFX_IDW_PANE_FIRST + 1))
{
TRACE0("뷰 창을 만들지 못했습니다.\n");
return -1;
}
return 0;
}
[3-3]
//Simple 예제를 다음과 같이 수정하시오
//CSimpleApp::InitInstance() 함수에서 텍스트 파일을 읽어 파일 내 문자열을 CString 클래스 객체로 보관한다
//그리고 해당 문자열을 CChildView::OnPaint() 함수에서 화면에 출력한다.
BOOL C심화문제33App::InitInstance()
{
CWinApp::InitInstance();
EnableTaskbarInteraction(FALSE);
// RichEdit 컨트롤을 사용하려면 AfxInitRichEdit2()가 있어야 합니다.
// AfxInitRichEdit2();
// 표준 초기화
// 이들 기능을 사용하지 않고 최종 실행 파일의 크기를 줄이려면
// 아래에서 필요 없는 특정 초기화
// 루틴을 제거해야 합니다.
// 해당 설정이 저장된 레지스트리 키를 변경하십시오.
// TODO: 이 문자열을 회사 또는 조직의 이름과 같은
// 적절한 내용으로 수정해야 합니다.
SetRegistryKey(_T("로컬 응용 프로그램 마법사에서 생성된 응용 프로그램"));
FILE *ft = fopen("뻐꾸기.txt", "r");
if (ft == NULL)
{
MessageBox(NULL, _T("파일 없음"), NULL, NULL);
return -1;
}
char buf[80];
fgets(buf, 80, ft);
text = buf;
// 주 창을 만들기 위해 이 코드에서는 새 프레임 창 개체를
// 만든 다음 이를 응용 프로그램의 주 창 개체로 설정합니다.
CMainFrame* pFrame = new CMainFrame;
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;
}
void CChildView::OnPaint()
{
CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트입니다.
CString str = ((C심화문제33App*)AfxGetApp())->text;
MessageBox(str, NULL, NULL);
dc.TextOut(50, 50, str);
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
// 그리기 메시지에 대해서는 CWnd::OnPaint()를 호출하지 마십시오.
}
[3-4]
이 문제는 풀지 못했습니다... 답을 아시는 분 힌트라도 주시면 감사하겠습니다!
//CFrameWnd::RecalcLayOut() 함수를 재정의하여 뷰의 가로와 세로 크기가
//프레임 윈도우의 절반이 되도록 Simple 예제를 수정하시오
void CMainFrame::RecalcLayout(BOOL bNotify)
{
CFrameWnd::RecalcLayout(bNotify);
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
if (m_wndView.GetSafeHwnd() != NULL)
{
CRect rectFrame;
CRect rectView;
GetWindowRect(&rectFrame);
GetClientRect(&rectView);
//이후에 어떻게 해야 뷰 사이즈가 반이 될까
}
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'MFC > 윈도우 프로그래밍' 카테고리의 다른 글
MFC 윈도우 프로그래밍 4장 연습문제(9~16) (3) | 2018.03.25 |
---|---|
MFC 윈도우 프로그래밍 4장 연습문제(1~8) (2) | 2018.03.24 |
MFC 윈도우 프로그래밍 3장 연습문제(9~16) (0) | 2018.03.18 |
MFC 윈도우 프로그래밍 3장 연습문제(1~8) (0) | 2018.03.18 |
MFC 윈도우 프로그래밍 2장 심화문제 (2) | 2018.03.13 |