2008-09-19 10 views

답변

12

찰리가 답변에 WM_NCPAINT으로 나타났습니다. MFC를 사용하는 경우 코드는 다음과 같습니다.

// in the message map 
ON_WM_NCPAINT() 

// ... 

void CMainFrame::OnNcPaint() 
{ 
    // still want the menu to be drawn, so trigger default handler first 
    Default(); 

    // get menu bar bounds 
    MENUBARINFO menuInfo = {sizeof(MENUBARINFO)}; 
    if (GetMenuBarInfo(OBJID_MENU, 0, &menuInfo)) 
    { 
     CRect windowBounds; 
     GetWindowRect(&windowBounds); 
     CRect menuBounds(menuInfo.rcBar); 
     menuBounds.OffsetRect(-windowBounds.TopLeft()); 

     // horrible, horrible icon-drawing code. Don't use this. Seriously. 
     CWindowDC dc(this); 
     HICON appIcon = (HICON)::LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); 
     ::DrawIconEx(dc, menuBounds.right-18, menuBounds.top+2, appIcon, 0,0, 0, NULL, DI_NORMAL); 
     ::DestroyIcon(appIcon); 
    } 
} 
3

비 클라이언트 영역을 그리려면 "클라이언트"DC가 아닌 "창"DC를 가져와 "창"DC를 그려야합니다.

3

메뉴 막대에 무언가를 원한다면, 오른쪽 정렬 메뉴 항목으로 추가하는 것이 더 쉽고/더 쉬울 수도 있습니다. 이 방법은 다른 Windows 테마 등에서도 작동합니다.

4

WM_NCPAINT를 사용해보십시오. 이는 일반적인 WM_PAINT 메시지와 비슷하지만 클라이언트 영역이 아닌 전체 창을 처리합니다. 이 코드는 canonically 큰 '스위치'문을 사용하여 구성되어 당신의 applicaton의 메시지 루프에 사용하기위한 것입니다

case WM_NCPAINT: 
{ 
HDC hdc; 
hdc = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN); 
// Paint into this DC 
ReleaseDC(hwnd, hdc); 
} 

: WM_NCPAINT의 MSDN 문서는 다음과 같은 샘플 코드를 제공합니다.

Shog의 MFC 예제에서 언급했듯이이 예제에서는 DefWindowProc를 호출하는 기본 버전을 호출해야합니다.

관련 문제