<현재 작업중인 목록을 만들려면>

 리스트 박스에 현재 작업중인 윈도우의 목록을 넣고 싶은데, 어떤 방법을 사용해야 하는지 감을 잡을 수 없습니다.  

작업 관리자(Task Manager)는 최상위 단계 윈도우 목록을 출력하므로 이를 이용하면
됩니다. 단, 이 목록에 포함되는 윈도우는 화면에서 직접 볼 수 있어야 하지만 다른 창에
소유돼서는 안된다는 것에 유의하기 바랍니다. 최상위 윈도우의 목록을 읽으려면
CWnd::GetWndow()를 호출한 후 윈도우가 목록에 포함될 수 있는지의 여부를 확인하려고
CWnd의 메쏘드인 IsWindowVisible(), GetWindowTextLength(), GetOwner()를 부릅니다.
그런 다음 작업 관리 윈도우의 캡션을 목록상자에 채우면 됩니다. 방법은 다음과 같습니다.

  void GetTaskList(CListBox& list)
  CString strCaption; // 윈도우 캡션
  list.ResetContent;   // 리스트박스를 지운다.
  //윈도우 목록에서 첫번째 윈도우를 구한다.
  CWnd* pWnd=AfxGetMainWnd()->GetWindow(GW_HWNDFIRST);
  //윈도우의 목록을 통해 확인한다.
    while(pWnd) {
       // 윈도우가 보이면 캡션을 갖지만 소유자를 갖지 않는지 확인한다.
       if(pWnd->IsWindowVisible()&&
       pWnd->GetWindowTextLength() && !pWnd->Getowner)) {
          // 윈도우 캡션을 리스트박스에 추가한다.
          pWnd->GetWindowText(strCaption);
          List.AddString(strCaption);
      }
      // 윈도우 목록에서 다음 윈도우를 구한다.
      pWnd = pWnd->GetWindow(GW_HWNDNEXT);
    }
  }

 <리스트박스 깜박임 멈추기>

 리스트 박스에 많은 항목을 추가하려고 하니 리스트 박스가 깜박입니다. 이러한 현상을 제거하고 싶은데 어떤 방법을 사용하면 되나요.  

 CListBox형의 컨트롤이나 윈도우의 재출력 플래그를 취소하면 해당 컨트롤이 다시 출력되지 않으므로 깜박이는 현상을 막을 수 있습니다. 먼저 이 플래그를 변경하려면
CWnd::SetRedraw 함수를 호출해줍니다. 그리고 리스트박스에 여러 개의 항목을 추가하는
코드에서 재출력 플래그를 취소한 후 항목을 추가해 이 플래그를 설정하면 됩니다.
마지막으로 리스트박스를 적절히 갱신해야하므로 CWnd::Invalidate 함수를 호출하면
리스트의 깜박임을 줄일 수 있습니다.

  //재출력을 방지한다.
  pListBox->SetRedraw(FALSE);
  //리스트박스를 나눈다.
  //재출력을 허용하고 리스트박스를 다시 출력한다.
  pListBos->SetRedraw(TRUE);
  pListBos->Invalidate();

 
<베이스 클래스를 변경하려면>

 클래스 위저드로 프로젝트를 작성하다가 베이스 클래스를 잘못 지정해 CScrollView를 선택해야 하는 걸 그만 CView를 선택했습니다. 베이스 클래스를 CScrollView로 변경하려면 어떻해야 합니까?

헤더 파일에서 'class CMyView : public CView'를 'class CMyView : public
CScrollView'로 바꾸면 간단히 해결할 수 있습니다. 단 스크롤 뷰는 시작시 맵핑 모드와
크기를 설정하므로 OnInitialUpdate()에서 SetScrollSizes()를 호출해야 합니다. 이렇게
변경한 사항을 저장한 후 프로젝트를 읽으면 베이스 클래스로 CScrollView()를 인식합니다.
 
<여러 가지 모양의 윈도우 만들기>

 일반적인 윈도우는 직사각형인데 가끔씩 특이한 모양의 윈도우를 지닌 프로그램을 볼 수 있습니다. 시계와 같은 둥근 윈도우를 만드는 방법을 알고 싶습니다.

 둥근 윈도우뿐만 아니라 방패, 낫, 화살표 이외에도 윈도우 모양을 가지각색으로 만들 수
있습니다. 바로 SetWindowRgn()가 있기 때문에 가능한 겁니다.
 이 함수의 도움말을 참조하면 알겠지만, 영역(Rigion)에 대한 약간의 지식이 필요합니다.
HRGN에 대한 개괄적인 설명을 본 후 원하는 모양을 Rgn으로 만들어 이것을
SetWindowRgn() 에 보내면 원하는 작업을 할 수 있습니다. 자세한 내용은 도움말을 참조하면 어렵지 않을 것입니다. 단 한 가지 MFC의 CRgn 클래스를 이용한다면 반드시 Detach()를 이용해 HRGN 영역 핸들을 제거한 다음 사용해야 합니다(CRgn 클래스는 파괴될 때 핸들까지 삭제하기 때문입니다).

 

<입력 컨트롤에 텍스트를 추가하려면>  

MFC 4.0 사용자입니다. 입력 컨트롤에 텍스트를 추가하는 루틴을 넣고 싶은데, CEdit 클래스에서 이를 지원하는 멤버함수를 찾을 수 없습니다.

 당연합니다. CEdit::AppendText()라는 함수는 없으므로 직접 함수를 작성해야 합니다.
CEdit::SetSel()을 호출해 선택 항목을 입력 컨트롤의 마지막으로 이동시킨 후
CEdot::ReplaceSel()을 호출해 텍스트를 추가하면 간단하게 추가할 수 있습니다. 새로
만들어야할 AppendText 함수는 다음과 같습니다.

  void AppendText(CEdit& edit, LPCSTR pText){
    int nLen=edit.GetWindowTextLength();
    edit.SetFocus();
    edit.SetSel(nLen, nLen)
    edit.ReplaceSel(pText);
  }

 

 <윈도우에 전달된 마지막 메시지 얻기>

 MFC 4.0으로 프로그램을 작성하던 중 현재 윈도우에 전달된 마지막 메시지를 다른 함수로 넘겨야 하는데 방법을 모릅니다.

 현재 처리중인 MSG 구조체 포인터를 얻으려면 CWnd::GetCurrentMessage를 호출하면 됩니다. 클래스 위저드를 사용해 하나의 공동 함수에 여러 메뉴 항목의 처리 함수를 연결한 다음 GetCurrentMessage() 를 호출해 선택된 메뉴항목을 확인하면 쉽게 해결할 수 있습니다. 다음 코드를 참고하세요.

void CMainFrame::OnCommonMenuHandler() {
   // 선택된 메뉴항목을 디버그 창에 출력한다.
   TRACE("Menu item %u was selected.",
      GetCurrentMessage()->wParam);
}

<애플리케이션 위저드로 생성한 창의 기본 스타일을 변경하려면>

 MFC 애플리케이션 위저드를 이용해 기본적인 MDI 프레임 창을 생성했습니다. 이를 변경해 창의 위치와 폭을 조정하고 싶은데 어떻게 해야 하나요?

 애플리케이션의 4번째 단계에 'Advanced' 라는 단추를 누르면 응용 프로그램과 MDI 프레임 창을 제어하는 고급 창 항목을 선택해주는 대화상자를 볼 수 있습니다. 프로그램 생성 전이라면 이 방법을 사용하는 게 가장 좋겠지만, 윈도우를 생성했다면 CWnd::PreCreateWindow를 오버라이딩하고 CREATESTRUCT 파라미터의 스타일 멤버를 변경해 윈도우 스타일을 바꾸면 됩니다. 그리고 CREATESTRUCT의 다른 멤버로 윈도우의 위치와 폭을 지정하면 원하는 스타일의 윈도우를 만들 수 있습니다. 다음 코드를 참조하세요.

// 윈도우 생성시 파라미터를 변경한다.
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT &cs) {
   // 윈도우에서 최대화 단추 스타일을 제거한다.
   cs.style &= WS_MAXIMIZEBOX;
   // 창의 위치를 좌측상단 구석으로 설정한다.
   cs.cx = GetSystemMetrics(SM_CXSCREEN);
   cs.cy = GetSystemMetrics(SM_SYSCREEN)/2;
   return CMDIFrameWnd::PreCreateWindow(cs);
}