2015-01-01 25 views
5

enter image description here Tôi đã cố gắng tìm một giải pháp đơn giản để thay đổi màu của điều khiển chỉnh sửa có cờ ES_READONLY. Mã tôi có (loại) hoạt động khi điều khiển chỉnh sửa có thể chỉnh sửa được, tuy nhiên không có hiệu lực đối với điều khiển chỉnh sửa của tôi có cờ chỉ đọc.Có thể thay đổi màu nền của điều khiển chỉ đọc chỉnh sửa

case WM_CTLCOLOREDIT: 
{ 
    HDC hdc = (HDC)wParam; 
    //if (GetDlgItem(hwnd, IDC_EDIT_IN) == (HWND)lParam) 
    //{ 
     SetTextColor(hdc, RGB(255, 255, 255)); // Set text color to white 
     SetBkColor(hdc, RGB(255, 255, 255)); // Set background color to black 
    //} 
    return 0; 
} 
break; 

Tôi có nhận xét ở đó chỉ để kiểm tra xem mã của tôi có hoạt động hay không và trên kiểm soát chỉnh sửa không chỉ đọc. Nếu tôi lấy ES_READONLY trên điều khiển chỉnh sửa khác của tôi, nó sẽ hoạt động trên nó. Tôi đang tạo một chương trình trò chuyện và không muốn người dùng có thể nhập vào khu vực hộp trò chuyện. Và khi chỉ đọc của nó, nó làm cho nó một màu xám-ish, nhưng tôi muốn có một màu trắng. Có một cách khác để làm điều này? Ngoài ra, màu sắc chỉ màu sắc vùng văn bản, không phải toàn bộ chiều cao của điều khiển chỉnh sửa. Tôi đang làm gì sai?

+2

Tôi khuyên bạn nên xem 'WM_CTLCOLORSTATIC' –

+2

Đọc bài viết MSDN, nó sẽ cho bạn trả lại một bút vẽ. –

Trả lời

5

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.

+0

Trích dẫn từ MSDN: "Nó không phải là cần thiết (nhưng nó không phải là có hại) để xóa các đối tượng chứng khoán bằng cách gọi' DeleteObject' ". – 0xC0000022L

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