Tôi có một ghi đè khu vực phi-client của cửa sổ của tôi, trong hàm callback của cửa sổ, như sau:Tại sao vùng không phải khách hàng bị ghi đè hiển thị mặc định khi cửa sổ mất tiêu điểm trên win32?
case WM_NCPAINT:
{
HDC hdc;
RECT rect;
HPEN pen;
hdc=GetDCEx(hWnd,(HRGN)wParam,DCX_WINDOW|DCX_CACHE|DCX_INTERSECTRGN|DCX_LOCKWINDOWUPDATE);
GetWindowRect(hWnd,&rect);
pen=CreatePen(PS_SOLID, 10, RGB(255, 0, 0));//red pen 10 pixels in size
SelectObject(hdc,pen);
Rectangle(hdc,0,0,(rect.right-rect.left),(rect.bottom-rect.top));
DeleteObject(pen);
ReleaseDC(hWnd,hdc);
RedrawWindow(hWnd,&rect,(HRGN)wParam,RDW_UPDATENOW)
}break;
Đó hiện các trick và trong trường hợp trên vẽ một hình chữ nhật màu đỏ xung quanh cửa sổ của tôi. Tuy nhiên, nếu cửa sổ bị mất tiêu điểm, thì khu vực phi khách hàng mặc định sẽ được vẽ và bản vẽ khu vực phi khách hàng tùy chỉnh của tôi sẽ biến mất.
Tôi đã thử bắt tin nhắn WM_KILLFOCUS trong chức năng gọi lại của cửa sổ và thực hiện tương tự với WM_NCPAINT nhưng không làm gì cả (mặc dù tôi thấy tôi nhận được thông báo này khi tôi nhấn vào cửa sổ khác và mất tập trung cửa sổ).
Tôi đang thiếu gì ở đây ...?
NC sơn không phải là quá đơn giản, theming đã làm cho nó không thực tế. Rất nhiều vấn đề. Cuộc gọi DeleteObject() của bạn không * xóa * đối tượng. Nó được chọn trong bối cảnh thiết bị. Bạn * phải * khôi phục DC. Lưu giá trị trả về từ SelectObject() và gọi lại SelectObject sau khi vẽ để khôi phục lại cây bút cũ. Tuy nhiên, mã của bạn phải ghi 100% lõi, RedrawWindow khiến WM_NCPAINT được tạo lại. Đừng giúp quá nhiều, WM_PAINT hoàn thành công việc. –