MFC 修改字体的颜色

MFC 修改字体的颜色

          • 这是在学习过程中的笔记,所有不一定是完全正确的,有待以后慢慢修正与补充。文中借鉴了多篇文章加上自己的总结。
    • 一、使用OnCtlColor修改
      • 1、添加方法
        • (1)、类向导--->消息--->添加WM_CTLCOLOR消息。
        • (2)、手动添加。
          • A、.h文件中添加句柄刷子的声明
          • B、.cpp添加OnCtlColor()消息映射
          • C、在.cpp文件添加函数的实现
      • 2、CWnd::OnCtlColor描述
        • (1)、函数原型
        • afx_msg HBRUSH OnCtlColor(
        • CDC* pDC,
        • CWnd* pWnd,
        • UINT nCtlColor );
        • 参数含义:
          • pDC:包含指向子窗口的显示上下文的指针。可能是暂时的。
          • pWnd:包含一个指向请求颜色的控件的指针。可能是暂时的。
          • nCtlColor:包含以下值之一,指定控件的类型:
          • CTLCOLOR_BTN-----Button control(按钮控件)
          • CTLCOLOR_DLG-----Dialog box(窗口)
          • CTLCOLOR_EDIT-----Edit control
          • CTLCOLOR_LISTBOX-----List-box control
          • CTLCOLOR_MSGBOX -----Message box
          • CTLCOLOR_SCROLLBAR -----Scroll-bar control
          • CTLCOLOR_STATIC -----Static control
          • 之前遇到修改EDIT控件,但是OnCtlColor()没有调用的情况,找了好多解决方法,要不是太复杂就是效果不好(会闪烁)。
          • OnCtlColor()一般在窗口需要更新的时候被调用。比如最小化后最大化、窗口被遮盖后重新显示,或调用窗口的invalidate 函数使窗口无效、或在程序刚启动的时候。
          • 基于以上,因为SetWindowTextW( )会调用OnCtlColor(),所以可以用下面这个笨方法解决。

这是在学习过程中的笔记,所有不一定是完全正确的,有待以后慢慢修正与补充。文中借鉴了多篇文章加上自己的总结。

一、使用OnCtlColor修改

1、添加方法

(1)、类向导—>消息—>添加WM_CTLCOLOR消息。

(2)、手动添加。

A、.h文件中添加句柄刷子的声明
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
B、.cpp添加OnCtlColor()消息映射
BEGIN_MESSAGE_MAP(CDialogTab1, CDialog)
	…………
	ON_WM_CTLCOLOR()//
	…………
END_MESSAGE_MAP()
C、在.cpp文件添加函数的实现
enum {Red,Black}EditTextColor
EditTextColor = Red;
HBRUSH CDialogTab1::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

	// TODO:  在此更改 DC 的任何特性
//设置Edit控件
	if(nCtlColor == CTLCOLOR_EDIT) //EDIT控件
	{
			if(pWnd->GetDlgCtrlID() == CPublic::g_EditCStartID+i-1)//某个ID的控件
			{
				switch( EditTextColor )
				{
					case Red:    //红色
						pDC->SetTextColor( RGB(255,0,0) );
						break;
					case Black:    //黑色
						pDC->SetTextColor( RGB(0,0,0) );
						break;
				}
			}
	}
	// TODO:  如果默认的不是所需画笔,则返回另一个画笔
	return hbr;
}

2、CWnd::OnCtlColor描述

(1)、函数原型

afx_msg HBRUSH OnCtlColor(

CDC* pDC,

CWnd* pWnd,

UINT nCtlColor );

参数含义:

pDC:包含指向子窗口的显示上下文的指针。可能是暂时的。
pWnd:包含一个指向请求颜色的控件的指针。可能是暂时的。
nCtlColor:包含以下值之一,指定控件的类型:
CTLCOLOR_BTN-----Button control(按钮控件)
CTLCOLOR_DLG-----Dialog box(窗口)
CTLCOLOR_EDIT-----Edit control
CTLCOLOR_LISTBOX-----List-box control
CTLCOLOR_MSGBOX -----Message box
CTLCOLOR_SCROLLBAR -----Scroll-bar control
CTLCOLOR_STATIC -----Static control
之前遇到修改EDIT控件,但是OnCtlColor()没有调用的情况,找了好多解决方法,要不是太复杂就是效果不好(会闪烁)。
OnCtlColor()一般在窗口需要更新的时候被调用。比如最小化后最大化、窗口被遮盖后重新显示,或调用窗口的invalidate 函数使窗口无效、或在程序刚启动的时候。
基于以上,因为SetWindowTextW( )会调用OnCtlColor(),所以可以用下面这个笨方法解决。
	//用于调用OnCtlColor更新字体的颜色,取当前的内容与光标位置
		CString EditStr;
		int EditStartChar,EditEndChar;
		((CEdit*)GetDlgItem(CPublic::g_EditCStartID+i-1))->GetSel(EditStartChar,EditEndChar);
		((CEdit*)GetDlgItem(CPublic::g_EditCStartID+i-1))->GetWindowTextW(EditStr);
		((CEdit*)GetDlgItem(CPublic::g_EditCStartID+i-1))->SetWindowTextW(EditStr);
		((CEdit*)GetDlgItem( CPublic::g_EditCStartID+i-1 ))->SetSel(EditStartChar,EditEndChar,false);

你可能感兴趣的:(MFC,C++)