请问大家如何修改 编辑框在禁用和只读取状态下的字体颜色呢?
目前我能想到的就是使用SetSysColors修改全局字体颜色, 但是这个太暴力了, 不能使用.
然后就是使用hook api GetSysColor函数, 但这个也还是比较复杂.
然后就是完全重载编辑框, 自己绘制文字和光标,鼠标.. 但这个工作量怕是不小, 还不一定稳定.
所以在这里向各位朋友请教下, 还有其它方便易用的方法吗? MFC,WTL, win32 API的都可以
在OnCtlColor下加入
if (pWnd->GetDlgCtrlID()==IDC_NAME)
pDC->SetTextColor(RGB(255,0,0)); //设置字体颜色
这样不就行了
其实重载一下也很简单 没有你想的那么复杂的
可以继承MFC的CEdit类,重写自己的CMyEdit
其响应函数是CtlColor,而不是OnCtlColor,两者区别在于CtlColor是反射消息响应函数,它响应“=WM_CTLCOLOR”,而OnCtlColor响应“WM_CTLCOLOR”。当CEdit即将刷新时,将像父窗口发送WM_CTLCOLOR消息,如果父窗口没有对它的WM_CTLCOLOR消息做出处理,将发送给控件,由控件的CtlColor反射函数处理。
C/C++ code?更改对话框中控件的外观可以在其所在对话框中,响应WM_CTLCOLOR事件(表示控件即将刷新),然后在OnCtlColor中判断出需要改变的控件,然后更改其颜色或画刷。 为了更一般、更方便的改变CEdit的字体和颜色,则可以继承MFC的CEdit类,重写自己的CMyEdit,方便使用,代码如下: 注意:其中最重要的一点是其响应函数是CtlColor,而不是OnCtlColor,两者区别在于CtlColor是反射消息响应函数,它响应“=WM_CTLCOLOR”,而OnCtlColor响应“WM_CTLCOLOR”。当CEdit即将刷新时,将像父窗口发送WM_CTLCOLOR消息,如果父窗口没有对它的WM_CTLCOLOR消息做出处理,将发送给控件,由控件的CtlColor反射函数处理。 所以在控件的CtlColor可以自己决定自己如何绘画,与父窗口无关。 //-----------------以下为MyEdit.h--------------------------------------------- #pragma once // CMyEdit class CMyEdit : public CEdit { DECLARE_DYNAMIC(CMyEdit) public: CMyEdit(); virtual ~CMyEdit(); protected: DECLARE_MESSAGE_MAP() public: void SetBackColor(COLORREF rgb);//设置文本框背景色 void SetTextColor(COLORREF rgb);//设置文本框的字体颜色 void SetTextFont(const LOGFONT &lf);//设置字体 COLORREF GetBackColor(void){return m_crBackGnd;}//获取当前背景色 COLORREF GetTextColor(void){return m_crText;}//获取当前文本色 BOOL GetTextFont(LOGFONT &lf);//获取当前字体 private: COLORREF m_crText;//字体的颜色 COLORREF m_crBackGnd;//字体的背景颜色 CFont m_font;//字体 CBrush m_brBackGnd;//整个文本区的画刷 //控件自己的消息反射函数CtlColor,绘制控件之前调用 afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor); }; //---------------以下为MyEdit.cpp------------------------------------------- #include "stdafx.h" #include "MyEdit.h" // CMyEdit IMPLEMENT_DYNAMIC(CMyEdit, CEdit) CMyEdit::CMyEdit() { //初始化为系统字体和窗口颜色 m_crText = GetSysColor(COLOR_WINDOWTEXT); m_crBackGnd = GetSysColor(COLOR_WINDOW); m_font.CreatePointFont(90,"宋体"); m_brBackGnd.CreateSolidBrush(GetSysColor(COLOR_WINDOW)); } CMyEdit::~CMyEdit() { } BEGIN_MESSAGE_MAP(CMyEdit, CEdit) //WM_CTLCOLOR的消息反射 ON_WM_CTLCOLOR_REFLECT() END_MESSAGE_MAP() // CMyEdit 消息处理程序 void CMyEdit::SetBackColor(COLORREF rgb) { //设置文字背景颜色 m_crBackGnd = rgb; //释放旧的画刷 if (m_brBackGnd.GetSafeHandle()) m_brBackGnd.DeleteObject(); //使用文字背景颜色创建新的画刷,使得文字框背景和文字背景一致 m_brBackGnd.CreateSolidBrush(rgb); //redraw Invalidate(TRUE); } void CMyEdit::SetTextColor(COLORREF rgb) { //设置文字颜色 m_crText = rgb; //redraw Invalidate(TRUE); } void CMyEdit::SetTextFont(const LOGFONT &lf) { //创建新的字体,并设置为CEDIT的字体 if(m_font.GetSafeHandle()) { m_font.DeleteObject(); } m_font.CreateFontIndirectA(&lf); CEdit::SetFont(&m_font); //redraw Invalidate(TRUE); } BOOL CMyEdit::GetTextFont(LOGFONT &lf) { if(m_font.GetLogFont(&lf)!=0) { return TRUE; } return FALSE; } HBRUSH CMyEdit::CtlColor(CDC* pDC, UINT nCtlColor) { //刷新前更改文本颜色 pDC->SetTextColor(m_crText); //刷新前更改文本背景 pDC->SetBkColor(m_crBackGnd); //返回画刷,用来绘制整个控件背景 return m_brBackGnd; }
WM_CTLCOLORSTATIC
A static control, or an edit control that is read-only or disabled, sends the WM_CTLCOLORSTATIC message to its parent window when the control is about to be drawn. By responding to this message, the parent window can use the specified device context handle to set the text and background colors of the static control.
WM_CTLCOLORSTATIC
hdcStatic = (HDC) wParam; // handle to display context
hwndStatic = (HWND) lParam; // handle to static control