본문 바로가기
C & C++/MFC 컨트롤

프로그램 시작시 About박스를 표시하려면 등...

by izen8 2011. 11. 8.
반응형


+ 시스템 메뉴를 없애려면 

타이틀바에 있는 시스템 메뉴를 없애려면 CFrameWnd 클래스에서 상속받은
CMainFrame에 있는 PreCreateWindow()에 다음과 같이 한 줄을 추가하면
간단히 제거할 수 있습니다.

cs.style &= ~WS_SYSMENU;

보통 윈도우 스타일인 WS_OVERLAPPEDWINDOW에는 시스템 메뉴와 여러
윈도우 스타일이 정의돼 있기 때문에 기본값에서 시스템 메뉴를 없애면 되는
거죠.



+ 메임프레임이 차지하는 행의 수를 찾으려면 

뺄셈과 나눗셈만으로 이 문제를 간단히 해결할 수 있습니다. 먼저
메임프레임과 클라이언트 영역의 높이를 계산합니다. 그 다음 프레임의
높이에서 클라이언트 영역의 높이, 프레임의 테두리, 캡션을 뺀 후 마지막으로
메뉴바의 높이로 나누면 됩니다.

int CMainFrame::GetMenuRows() const {
CRect rcFrame, rcClient;
GetWindowRect(rcFrame);
GetClientRect(rcClient);

return(rcFrame.Height() - rcClient.Height() -
     ::GetSystemMetrics(SM_CYCAPTION) -
     (::GetSystemMetrics(SM_CYFRAME)*2))/
     ::GetSystemMetrics(SM_CYMENU);


+ 프로그램 시작시 About박스를 표시하려면 

About박스의 알고리즘을 살펴보면 생각보다 쉽습니다. 먼저 About박스를 생성하려면 다이얼로그를
모들리스(modeless)로 만들어야 합니다. 이렇게 만들어진 About박스는 윈도우가 띄기 전에 자동으로
나타납니다. 이때 사용자가 마우스 클릭하거나 키를 입력하면 프로그램 오브젝트의
PreTranslateMessage 메쏘드가 호출되는데, 이 메쏘드는 윈도우가 About를 제공하는지 체크하고
사용자의 입력이 있으면 About박스를 소멸시킵니다.

만약 사용자가 5초간 기다리면 OnIdle 메쏘드가 호출되고, 윈도우를 소멸시킬 시간이 경과했는지
체크합니다. 이런 식으로 흐름을 잡으면 됩니다. 다음을 참고하세요.

BOOL CSampleApp::PreTranslateMessage(MSG* pMsg){
     BOOL bResult = CWinApp::PreTranslateMessage(pMsg);
     if (m_splash.m_hwnd != NULL &&
     (pMsg->message ==WM_KEYDOWN ||
     pMsg->message == WM_SYSKEYDOWN ||    
     pMsg->message == WM_LBUTTONDOWN ||
     pMsg->message == WM__RBUTTONDOWN ||
     pMsg->message == WM__MBUTTONDOWN ||
     pMsg->message == WM__NCLBUTTONDOWN ||
     pMsg->message == WM__NCRBUTTONDOWN ||
     pMsg->message == WM__NCMBUTTONDOWN)){
         m_splash.DestoryWindow();
         m_pMainWnd->UpdateWindow();
     }
     return bResult;
반응형

댓글