2012-08-07 9 views
0

사용자 정의 제목 표시 줄을 그리려고하고 있는데, 창 클라이언트 영역 바깥 쪽을 페인트하기 위해 WndProc를 재정의하고 WM_NCPAINT 메시지를 처리해야한다고 읽었습니다. 현재, 나는 이렇게하고있다 :C++ .NET의 창 제목 표시 줄에 어떻게 그립니 까?

//WndProc override 
virtual void WndProc(Message% m) override 
{ 
    switch(m.Msg) 
    { 
     case 0x85: //WM_NCPAINT 
     case 0x0A: //WM_PAINT 
      //Call original 
      System::Windows::Forms::Form::WndProc(m); 

      //Now we'll do our painting 
      DrawTitleBar(m.HWnd); 

      break; 
     default: 
      System::Windows::Forms::Form::WndProc(m); 
      break; 
    } 
} 

나는 브레이크 포인트를 넣을 수 있기 때문에 효과가있다. 원본 호출을 제거하면 창 프레임이 그려지지 않습니다. DrawTitleBar은 다음과 같습니다

void DrawTitleBar(IntPtr hWnd) 
{ 
    IntPtr hDC; 
    Graphics^ g; 

    //Get the device context (DC) 
    hDC = GetWindowDC(hWnd); 
    //Get the graphics 
    g = Graphics::FromHdc(hDC); 

    //Draw 
    g->FillRectangle(Brushes::Blue, 0, 0, 100, 10); 

    //Cleanup 
    g->Flush(); 
    ReleaseDC(hWnd, hDC); 
} 

내가 먼저 윈도우 핸들에서 DC를 얻을. 그런 다음 Graphics::FromHdc을 사용하여 Graphics 개체를 얻습니다. 나는 ReleaseDC으로 DC를 발표한다. 또한

[DllImport("user32.dll")] 
extern IntPtr GetWindowDC(IntPtr hWnd); 
[DllImport("user32.dll")] 
extern int ReleaseDC(IntPtr hWnd, IntPtr hDC); 

: 여기에 문제가있다 넣다, 이것은 내가 네이티브 Win32 함수를 가져 어떻게 내가 다른 방법의 무리를 시도했습니다, 같은 결과를 모두. C# 및 VB 예제를 웹에서 찾을 수 있지만 C++ 예제는 없습니다. 또한 Windows Vista 호환성에 대해이 종류의 문제가 있음을 읽었습니다. 현재는 나중에 추가 할 것이므로 걱정하지 않습니다.

+1

FromHwnd와 같은 클라이언트 영역 만 반환하는 것이 아니라 GetDCEx() 또는 GetWindowDC()가 전체 창에 대한 드로잉 컨텍스트를 가져와야합니다. 다음 Graphics :: FromHdc(). 비주얼 스타일 (Visual Styles)은 이것이 올바르게 작동하는 것을 멈추고, 사용자 정의 위조 된 제목 표시 줄에 대한 경계선없는 윈도우만을 고려합니다. –

+0

@HansPassant 그래, 나는 GetWindowDC를 사용하기 위해 DrawTitleBar 메서드를 변경했다. 그러나, 나는 아직도 그려진 아무것도 얻지 않는다. 비주얼 스타일을 어떻게 비활성화 할 수 있습니까? 내'main' 메소드에서'Application :: EnableVisualStyles'에 대한 호출을 제거해야합니까? 이렇게하면 눈에 띄는 결과가 발생하지 않습니다. 또한 경계선없는 윈도우의 경우 FormBorderStyle 속성을 None으로 설정하면됩니까? – smoth190

+0

당신이 가지고있는 문제와 관련이 없지만 원하는 경우 GetWindowDC와 ReleaseDC 함수를'#include '로 얻을 수 있습니다. 많은 Win32 메서드를 사용하게되면 각각의 DllImport를 작성하는 것보다 쉬울 것입니다. –

답변

0

두 가지 간단한 사실. 1. DWM에서 GetWindowDC는 본질적으로 손상되었습니다. 2. 두 가지 해결 방법이 부분적으로 존재합니다. A. 호환 모드를 xp 또는 98 또는 95로 설정합니다. B. msdn social의 프로그램 예제가 있습니다. "GetWindowDC broken"을 검색 한 다음 길이가 긴 URL 인 샘플을 따르십시오. [꼬리표를 추가하여 깨진 URL을 수정하십시오.]]. 불행하게도, 창이 둥근 모서리로 표시됩니다. 내 상자 빌드 9200, 8.0, 업데이트 없음.

관련 문제