본문 바로가기
프로그래밍/Windows API

레지스트리를 이용해서 직전종료시의 윈도우 크기복구하기 WIN32/MFC

by 베리베리 2008. 7. 10.

레지스트리를 이용해서 직전종료시의 윈도우 크기복구하기 WIN32/MFC 
2008/06/27 21:35

 http://blog.naver.com/aquayo/80053376982
이 포스트를 보낸곳 ()

 
간단히 설명드리면 윈도우가 만들어질때 레지스트리에서 저장된 값을 읽어와 윈도우를
그 값대로 배치하고 윈도우가 OnDestroy될때 그때의 윈도우의 위치를 레지스트리에
저장시키는 것이지요. 레지스트리에 불러오는 함수로 CWinApp의 GetProfileInt가 있습니다.
CWinApp::GetProfileInt
UINT GetProfileInt( LPCTSTR lpszSection, LPCTSTR lpszEntry, int nDefault );
윈도우의 위치는 Integer형이니까 GetProfileInt이지 만약 문자를 불러온다면
GetProfileString를 쓰셔야 합니다. 그럼 기록하는 것은?? WriteProfileInt가 있지요...
둘다 3개의 인자를 필요로 하는데 첫번째인자는 레지스트리에 생성될 폴더이름이며
2번째인자는 저장될 이름값 3번째는 값이 없을때 리턴해주는 default값입니다.
이제 한번 해볼까요? 일단 메인프레임의 헤더에 다음처럼 변수를 하나 만들어봐요.
const CString m_Section;
왜 이걸 해주냐구요? 우리가 만들 레지스트리의 폴더이름을 미리주고 시작할라구요.
Const로 지정해놓았으니  메인프레임의 생성자에서 그값을 정해줍니다.
우리는 알기쉽게 이름을 '윈도우의 크기'라고 하지요.
CMainFrame::CMainFrame():m_Section("윈도우의크기")
{
    // TODO: add member initialization code here
}
이렇게 생성자에서 세팅을 합니다.
그리고는 윈도우가 OnCreate()될때 그 값을 불러와야 겠지요?
물론 불러오는 내용을 OnCreate()함수내에 다 코딩해도 되지만 워낙 OnCreate()함수
내에는 코딩이 많으니까 우리는 레지스트리에서 윈도우의 위치를 읽어오는 것을 따로
하나 만들도록 합시다. 이름은 뭐가 좋을까?   SizeReadRegistry()가 어때요?
제가 한 영어가 되지요...크하하  그럼 함수를 하나 만들어봐요.
클래스 뷰에 가서 CMainFrame에서 오른쪽 버튼 클릭하고 Add Member Function에서
만들어 주셔도 되고 아니면 직접 만들어 주셔도 됩니다.  직접 하실라면 헤더에
Void ReadSizeRegistry(); 라고 써주시고 구현파일에서 코딩하세요..

void CMainFrame::SizeReadRegestry()
{
    CWorkApp* pApp = (CWorkApp*)AfxGetApp();
    CRect rect;
    GetWindowRect(rect);
    rect.left = pApp->GetProfileInt(m_Section,"left",rect.left);
    rect.top = pApp->GetProfileInt(m_Section,"top",rect.top);
    rect.right = pApp->GetProfileInt(m_Section,"right",rect.right);
    rect.bottom = pApp->GetProfileInt(m_Section,"bottom",rect.bottom);
    MoveWindow(rect);
}
코딩에서 알수 있듯이 GetProfileInt는 CWinApp의 것이므로 포인터를 얻어와 접근을
했습니다.  rect의 상,하,좌,우 값을 다 얻어와 윈도우를 그 위치대로 이동시킵니다.
MoveWindow()함수를 써서요...
이렇게 함수만 만들어 놓으면 끝이 아니지요?
이 함수를 CMainFrame::OnCreate()함수내에서 호출을 해야지요??
자~ 그럼 됐습니다. 그럼 이제 윈도우가 소멸될때 저장을 시켜야지요?
CMainFrame::OnDestroy()함수내에서 코딩을 해줍니다.
void CMainFrame::OnDestroy()
{
    CFrameWnd::OnDestroy();
    // TODO: Add your message handler code here
    CWebWorkApp* pApp = (CWebWorkApp*)AfxGetApp();
    CRect rect;
    GetWindowRect(rect);
    pApp->WriteProfileInt(m_Section,"left",rect.left);
    pApp->WriteProfileInt(m_Section,"top",rect.top);
    pApp->WriteProfileInt(m_Section,"right",rect.right);
    pApp->WriteProfileInt(m_Section,"bottom",rect.bottom);
}
위와 거의 같지요?? 설명이 필요없을듯 합니다. 자 이제 돌려보세요.
뭐 기능은 아무것도 없지만 윈도우의 위치가 내가 끝날때 놔둔대로 되지요?
이제 레지스트리를 열어서 확인을 해봅시다.
이런 부분을 자세하게 그림으로 보여드릴 필요가 없음에도 워낙 글만 있는 걸 싫어하는
저로서는 어거지로 그림을 넣어 마치 제가 대단히 친절한 녀석인양 뽐내려 합니다.
양해바래용~~  아래의 그림처럼 레지스트리 편집기를 실행시킵니다.
 
 

 
 
해서 찾아가 보는 거지요.. 그냥 열심히 하는 거지..뭐.
HKEY_CURRENT_USERSoftwareLocal AppWizard-Generated Applications에
가보시면 현재 우리가 하고 있는 프로젝트의 이름을 보실수가 있을거예요..
다 거기있죠?? 그럼 현재 우리가 하고있는 프로젝트명의 폴더로 들어가보세요..
저의 경우 폴더이름은  WORK입니다. 그럼
HKEY_CURRENT_USERSoftwareLocal AppWizard-Generated Applications
WORK 안에 '윈도우의 크기'라는 폴더가 하나 있지요?
바로 그겁니다. 우리가 응용프로그램을 실행하고 나자마자 생겨버린 것이지요.
그 안에 우리가 저장한 내용들이 보일겁니다.
 

 
 
CWorkApp 와 CWebWorkApp 는 현재 작업중인 프로젝트의 App 클래스명으로 바꿔주세요~!

출처 : http://www.devpia.com/Forum/BoardView.aspx?no=421&ref=277&page=1&forumname=VC_LEC&stype=&KeyW=GetProfileInt&KeyR=titlecontent
  witten by 김준영 / junyoung 수정 : 알콜카리스마
[출처] 레지스트리를 이용해서 직전종료시의 윈도우 크기복구하기 |작성자 오크

댓글