2010-08-11 34 views
17

Tôi không sử dụng một hộp thoại, im sử dụng lớp tùy chỉnh của riêng tôi mà tôi đã đăng ký và sau đó sử dụng các cuộc gọi CreateWindow để tạo ra nó, tôi đã cài sẵn màu nền sang màu đỏ khi đăng ký:Cách đặt màu nền của cửa sổ sau khi tôi đã đăng ký?

WNDCLASSEX wc; 
wc.hbrBackground = CreateSolidBrush(RGB(255, 0, 0)); 

nhưng bây giờ tôi muốn thay đổi màu nền khi chạy, ví dụ: nhấp vào nút để thay đổi thành màu xanh lam.

Tôi đã cố gắng sử dụng SetBkColor() gọi trong WM_PAINT và cố gắng trả lại bàn chải từ tin nhắn WM_CTLCOLORDLG, chúng không hoạt động.

trợ giúp nào?

Trả lời

17

Từ Window Background nói:

... Hệ thống vẽ nền cho một cửa sổ hoặc cung cấp cho các cửa sổ cơ hội để làm điều đó bằng gửi thông báo WM_ERASEBKGND khi cuộc gọi ứng dụng BeginPaint. Nếu một ứng dụng không xử lý thông điệp nhưng vượt qua nó để hàm DefWindowProc, hệ thống xóa nền bằng cách điền vào nó với mô hình trong bàn chải nền theo quy định của lớp của cửa sổ .....

.. .... Một ứng dụng có thể xử lý thông báo WM_ERASEBKGND mặc dù bàn chải nền lớp học được xác định. Điều này là điển hình trong các ứng dụng mà cho phép người dùng thay đổi cửa sổ màu hoặc mẫu nền cho một cửa sổ được chỉ định mà không ảnh hưởng đến các cửa sổ khác trong lớp học. Trong các trường hợp như vậy, ứng dụng không được vượt qua thông báo tới DefWindowProc. .....

Vì vậy, hãy sử dụng w_aram của WM_ERASEBKGND để lấy DC và vẽ nền.

+0

Tôi sẽ thử điều này, cảm ơn – Kaije

+0

vâng, nó hoạt động. tôi xử lý tin nhắn này và sử dụng FillRect() gọi để vẽ nền của tôi – Kaije

+0

Tôi là một chút mới cho windows C++. Bạn có ý gì bởi 'DC' ở đây? –

10

Bạn có thể thử như sau:

HBRUSH brush = CreateSolidBrush(RGB(0, 0, 255)); 
    SetClassLongPtr(hwnd, GCLP_HBRBACKGROUND, (LONG)brush); 
+0

Điều đó thay đổi nó cho tất cả các phiên bản của lớp đó. Bạn cũng sẽ cần phải vô hiệu hóa cửa sổ để làm cho nó xóa và sơn lại. –

+0

vâng, điều này làm việc, nhưng tôi có lớp bọc của riêng tôi và lý do tôi muốn đặt nó sau khi đăng ký là vì tôi muốn các cửa sổ từ cùng một lớp có màu nền khác nhau – Kaije

+0

hoạt động như một nét duyên dáng trong WTL! – sailfish009

4

Câu trả lời ngắn gọn: Xử lý WM_ERASEBKGND. câu trả lời

dài:

Khi bạn đăng ký WNDCLASS, bạn đang cung cấp thông tin về tất cả các cửa sổ của lớp đó. Vì vậy, nếu bạn muốn thay đổi màu sắc của chỉ một trường hợp của cửa sổ, bạn sẽ cần phải xử lý nó cho mình.

Khi đến lúc sơn lại cửa sổ của bạn, hệ thống sẽ gửi cho bạn thông báo WM_ERASEBKGND của bạn. Nếu bạn không xử lý nó, các DefWindowProc sẽ xóa khu vực khách hàng với màu sắc từ lớp cửa sổ. Nhưng bạn có thể xử lý tin nhắn trực tiếp, vẽ bất kỳ màu nào (hoặc mẫu nền) mà bạn thích.

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