사용자 정의 제목 표시 줄을 그리려고하고 있는데, 창 클라이언트 영역 바깥 쪽을 페인트하기 위해 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 호환성에 대해이 종류의 문제가 있음을 읽었습니다. 현재는 나중에 추가 할 것이므로 걱정하지 않습니다.
FromHwnd와 같은 클라이언트 영역 만 반환하는 것이 아니라 GetDCEx() 또는 GetWindowDC()가 전체 창에 대한 드로잉 컨텍스트를 가져와야합니다. 다음 Graphics :: FromHdc(). 비주얼 스타일 (Visual Styles)은 이것이 올바르게 작동하는 것을 멈추고, 사용자 정의 위조 된 제목 표시 줄에 대한 경계선없는 윈도우만을 고려합니다. –
@HansPassant 그래, 나는 GetWindowDC를 사용하기 위해 DrawTitleBar 메서드를 변경했다. 그러나, 나는 아직도 그려진 아무것도 얻지 않는다. 비주얼 스타일을 어떻게 비활성화 할 수 있습니까? 내'main' 메소드에서'Application :: EnableVisualStyles'에 대한 호출을 제거해야합니까? 이렇게하면 눈에 띄는 결과가 발생하지 않습니다. 또한 경계선없는 윈도우의 경우 FormBorderStyle 속성을 None으로 설정하면됩니까? – smoth190
당신이 가지고있는 문제와 관련이 없지만 원하는 경우 GetWindowDC와 ReleaseDC 함수를'#include'로 얻을 수 있습니다. 많은 Win32 메서드를 사용하게되면 각각의 DllImport를 작성하는 것보다 쉬울 것입니다. –