CFormView를 이용해 프로그램을 만들었는데 메인 프레임보다 뷰의 크기가 더 큰 경우 스크롤바가 생겨 프로그램이 보기 흉해집니다. 이런 경우 스크롤바를 없애주는 방법은 무엇입니까.
뷰가 보여지기 전에 호출되는 뷰의 멤버함수인 onInitialUpdate()에서 윈도우의 크기를 조정해 주거나 스크롤 크기를 조정하는 두 가지 방법이 있습니다.
첫번째 방법은 프레임 크기를 뷰 크기에 맞게 조정해 주는 것입니다. 하지만 이 경우 뷰의 크기가 프레임의 크기보다 크면 제대로 작동하지 않는 단점이 있습니다.
void CYourFormView::OnInitialUpdate() {
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit(/*FALSE*/);
}
두 번째 방법은 CFormView가 CScrollView로부터 상속받은 클래스이므로 SetScaleToFitSize(CSize) 를 이용해 스크롤 크기를 현재 뷰의 크기로 조정해 스크롤바를 없애는 것입니다.
void CYourFormView::OnInitialUpdate() {
CFormView::OnInitialUpdate();
CRect rcClient;
GetClientRect(&rcClient);
GetParentFrame()->RecalcLayout();
// 스크롤 크기를 뷰의 크기로 맞추어 줌.
SetScaleToFitSize(rcClient.Size());
}
윈도우 3.1에서 리스트 박스는 8192개의 리스트 아이템과 64KB 이상의 아이템 데이터를 저장할 수 없었습니다. 이러한 제한사항이 윈도우 95/NT에서도 똑같이 적용되는지 궁금합니다.
윈도우 95에서 리스트박스 아이템 데이터는 메모리 용량에 의해서만 제한받습니다. 그리고 리스트 아이템의 개수는 리스트 박스 메시지의 wParam값이 16비트이므로 32767개를 초과할 수 없습니다. 하지만 윈도우 NT에서는 이런 제한이 전혀 없습니다.
MFC를 이용해 프로그램을 만들면 MRU(Most Recently Used) 리스트가 자동으로 메뉴에 추가되는 것을 볼 수 있습니다. 클래스 위저드에서 설정하게끔 되어 있는데, 프로그램을 작성한 후에 MRU 리스트의 개수를 변경하거나 이 기능을 제거하는 방법은 없는지요.
CWinApp 클래스는 CRecentFileList 타입의 포인터 멤버 변수 m_pRecentFileList를 가지고 있습니다. 이 변수는 CWinApp::LoadStdProfileSettings()라는 함수가 호출되었을 때 메모리가 할당되고 초기화됩니다. 그리고 파일을 저장할 때마다 프레임웍은 그 파일 이름을 이 변수 리스트에 추가합니다.
CWinApp::LoadStdProfileSettings()은 CWinApp 클래스로부터 상속받은 클래스의 CYourApp::InitInstance()에서 호출됩니다. 이 함수의 원형은 다음과 같습니다.
void CWinApp::LoadStdProfileSettings(
UINT nMaxMRU = _AFX_MRU_COUNT);
여기서 nMaxMRU는 MRU 리스트의 개수를 의미하며 디폴트 매개변수인 _AFX_MRU_LIST 는 클래스 위저드에서 설정한 값으로 보통 4개입니다. 만약 nMaxMRU를 바꾸면 유지되는 MRU 리스트 개수도 바뀌게 됩니다. 따라서 nMaxMRU가 0이면 프레임웍은 MRU 리스트를 유지하지 않습니다. 만약 CYourApp::InitInstance() 이외의 곳에서 MRU 리스트의 개수를 바꿔주는 작업이 필요하다면, m_pRecentFileList 멤버에 할당된 메모리를 반드시 해제해야 합니다.
void CMyApp::OtherFunction()
{
if(m_pRecentFileList != NULL) {
delete m_pRecentFileList;
m_pRecentFileList = NULL;
}
// MRU 리스트의 개수를 6개로 설정한다.
LoadStdProfileSettings(6);
}
모달 프로퍼티시트(PropertySheet) 다이얼로그를 만들었습니다. 그런데 프로퍼티시트에 기본적으로 들어 있는 버튼 중 도움말과 적용 버튼은 필요하지 않아 없앴으면 좋겠는데 아무리 찾아봐도 이 버튼에 대한 언급이 없더군요. 어떻게 하면 이 두 개의 버튼을 없앨 수 있을까요.
다음 코드를 삽입해주면 간단히 모달 프로퍼티시트 다이얼로그 버튼을 제거할 수 있습니다.
(GetDlgItem(ID_HELP))->ShowWindow(SW_HIDE);
(GetDlgItem(ID_APPLY_NOW))->ShowWindow(SW_HIDE);
- The end of this article -
ARTICLEMFC에서 제공하는 CFileDialog를 이용해 프로그래밍을 하다보면 윈도우 95가 새롭게 제공하는 스타일의 공통 다이얼로그가 뜨는데, 이전 형식(윈도우 3.1)의 공통 다이얼로그를 윈도우 95에서 구현하는 방법이 없는지요.
물론 가능합니다. CFileDialog를 이용해 열기나 저장 다이얼로그를 구현하면 윈도우 95 스타일의 파일다이얼로그가 생성됩니다. 윈도우 95의 경우 CFileDialog의 생성자에서 강제로 OFN_EXPLORER라는 플래그를 넣어주기 때문입니다. 다음은 CFileDialog의 생성자 코드입니다.
CFileDialog::CFileDialog(BOOL bOpenFile Dialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName, DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd).CCommonDialog(pParentWnd)
{
// 생략...
if(afxData.bWin4) // 윈도우 95이면
{
m_ofn.Flags |= OFN_EXPLORER;
m_ofn.hInstance = AfxGetResourceHandle();
}
// 생략...
}
그러므로 이전 스타일(윈도우 3.1 스타일)의 파일다이얼로그를 생성하고 싶으면 다음과 같은 코드를 추가해 주면 됩니다.
CFileDialog fd(TRUE);
fd.m_ofn.Flags &= ~OFN_EXPLORER;
fd.DoModal();
MFC를 이용한 MDI 프로그램에서 프레임 메뉴가 동적으로 변하는 것을 볼 수 있습니다. 구체적으로 어떻게 하면 동적인 메뉴를 만들 수 있을까요.
생각보다 간단합니다. 먼저 리소스 탭에서 메뉴를 생성합니다. 그리고 다음과 같은 코드를 추가해서 메인 프레임의 메뉴를 바꾸어 주면 됩니다. 여기서 IDR_MENU1은 새로 생성한 메뉴 리소스의 ID입니다.
CMenu newMenu;
newMenu.LoadMenu(IDR_MENU1);
AfxGetMainWnd()->SetMenu( &newMenu );
// 메뉴바를 다시 그려준다.
AfxGetMainWnd()->DrawMenuBar();
newMenu.Detach();
[↓ Click! 스크롤바를 없애려면 / 윈도우 95/NT에서 아이템 개수 제한 여부 /
프로그램 작성 후 MRU 기능 삭제 및 변경 / 모달 프로퍼티시트 다이얼로그에서 버튼 제거]
'IT_Programming > MFC · API' 카테고리의 다른 글
다이얼로그에 프린트 기능 넣기 / 체크 리스트박스를 템플릿에 올리기 (0) | 2007.12.25 |
---|---|
툴바 숨기기/보이기 옵션 주기 / 클라이언트 영역을 클릭해 윈도우를 이동 (0) | 2007.12.25 |
다른 프로젝트로부터 리소스 복사 / 바탕 화면에 그림 그리기 (0) | 2007.12.25 |
CListCtrl에 컬럼 넣기 / 다이얼로그에서 뷰 포인터 액세스 (0) | 2007.12.25 |
응용 프로그램을 최소 크기 만들기 / 에디트 박스에서 엔터키 확인 방법 (0) | 2007.12.25 |