Bạn cần tạo một bàn chải và theo dõi nó. Sau đó, bạn quay lại bàn chải này thay vì return 0
trong đoạn mã của bạn. Khi không còn cần bàn chải nữa, bạn phải xóa nó đi. Việc này thường được thực hiện để đáp ứng với thông báo WM_DESTROY
.
Trong trường hợp của bạn, bạn có thể né tránh dấu đầu dòng bằng cách sử dụng cọ vẽ cổ phiếu, đó là những gì tôi muốn giới thiệu.
Khi ở chế độ chỉ đọc, chỉnh sửa điều khiển đáp ứng với WM_CTLCOLORSTATIC
thay vì WM_CTLCOLOREDIT
, vì vậy bạn phải xử lý đúng đắn thông điệp này:
case WM_CTLCOLORSTATIC:
{
if((HWND)lParam == GetDlgItem(hwnd, IDC_EDIT_IN))
{
SetBkMode((HDC)wParam, TRANSPARENT);
SetTextColor(hdc, RGB(255, 255, 255));
return (LRESULT)((HBRUSH)GetStockObject(BLACK_BRUSH));
// if edit control is in dialog procedure change LRESULT to INT_PTR
}
else // this is some other static control, do not touch it!!
return DefWindowProc(hwnd, message, wParam, lParam);
}
Khi sơn sửa/Kiểm soát tĩnh, bạn có 3 bộ phận có sẵn cho bức tranh:
- màu chữ
- nền văn bản
- kiểm soát của ba ckground
Để sơn toàn bộ quyền kiểm soát thành màu mong muốn bạn phải trở lại bàn chải với màu sắc mong muốn (return (LRESULT)someBrush
cho thủ tục cửa sổ, hoặc return (INT_PTR)someBrush
hộp thoại cho).
Cuộc gọi của bạn để SetBkColor
bộ màu sắc của văn bản nền, đó là khác nhau từ màu nền điều khiển. Đó là lý do tại sao chúng tôi gọi SetBkMode
với thông số TRANSPARENT
, để "nói" rằng chúng tôi muốn nền văn bản phù hợp với nền của kiểm soát.
Trong trường hợp của bạn, tôi đã sử dụng cọ vẽ cổ phiếu, vì bạn không cần phải theo dõi nó, cũng không cần phải xóa nó sau khi nó không cần thiết nữa.
Tuy nhiên, có thể có trường hợp khi bạn muốn một số màu khác. Trong trường hợp đó đây là những gì bạn sẽ phải làm:
- Tạo toàn cầu
HBRUSH
biến hoặc static HBRUSH
biến trong cửa sổ/thủ tục thoại của bạn.
- Khởi tạo biến này theo trả lời
WM_CREATE
nếu trong quy trình cửa sổ. Nếu trong thủ tục hộp thoại khởi tạo cọ vẽ theo số WM_INITDIALOG
. Một cái gì đó như someBrush = CreateSolidBrush(RGB(255, 0, 255));
Xem documentation để biết thêm thông tin và ví dụ.
- trả lại bàn chải này, như tôi đã chỉ cho bạn ví dụ ở trên (
return (LRESULT)someBrush
để biết quy trình cửa sổ hoặc return (INT_PTR)someBrush
cho hộp thoại).
- Xóa bàn chải khi không còn cần thiết nữa. Việc này thường được thực hiện trong
WM_DESTROY
với cuộc gọi DeleteObject(someBrush);
.
Tôi khuyên bạn làm việc xóa để đáp ứng với WM_DESTROY
thay vì WM_CLOSE
vì đây là cửa sổ tin nhắn của bạn sẽ luôn nhận được, trong khi WM_CLOSE
đôi khi có thể bị bỏ qua (tìm kiếm trên Internet để tìm các ví dụ cho trường hợp này).
Hy vọng điều này sẽ hữu ích, nếu bạn có thêm câu hỏi để lại nhận xét và tôi sẽ cố gắng trợ giúp. Trân trọng.
Tôi khuyên bạn nên xem 'WM_CTLCOLORSTATIC' –
Đọc bài viết MSDN, nó sẽ cho bạn trả lại một bút vẽ. –