2014-09-03 11 views
6

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 ...?

+3

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. –

Trả lời

5

Thêm một handler cho WM_NCACTIVATE:

case WM_NCACTIVATE: 
    // Paint the non-client area now, otherwise Windows will paint its own 
    RedrawWindow(hWnd, NULL, NULL, RDW_UPDATENOW); 
    break; 
+0

Nếu tôi xóa 'RedrawWindow' ở cuối' WM_NCPAINT' hơn khi tôi kích thước lại cửa sổ, vùng không phải của khách hàng được kích thước lại (đường viền mà con chuột đang giữ) biến mất - tôi không thấy mặc định cũng như khu vực không phải khách hàng tùy chỉnh. Khi tôi hoàn thành việc định cỡ lại (để cho con chuột đi), vùng không phải khách hàng tùy chỉnh sẽ trả về. Nếu tôi để lại 'RedrawWindow' ở cuối của' WM_NCPAINT' hơn vùng không phải khách hàng tùy chỉnh cũng được vẽ trong khi định lại kích thước. Tôi đã kiểm tra tác động trên CPU của việc có 'RedrawWindow' và không có nó và không tìm thấy một sự khác biệt đáng kể. – Gidi

+0

Đủ công bằng, tôi đã chỉnh sửa câu trả lời của mình. – arx

Các vấn đề liên quan