⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 控件字体和颜色的控制.htm

📁 VC的一些技巧性文档
💻 HTM
字号:
<html><style type="text/css"><!--.p9 {  font-family: "宋体"; font-size: 9pt}a        {text-transform: none; text-decoration: none;}a:hover {text-decoration: underline; color: #FF0000;}--></style><body background="di2001.jpg"><h3 align="center"><font COLOR="#AOAO99">控件字体和颜色的控制</font></h3><table width="100%"><tr><td><font color="0000FF"><a name="1">如何改变控件的字体 </a></font></td></tr><tr><td><p></Br>由于控件是也是窗口,用户可以调用CWnd: : SetFont指定新字体。该函数用一个Cfont指针,要保证在控件撤消之前不能撤消字体对象。下例将下压按钮的字体改为8点Arial字体:<Br></Br>//Declare font object in class declaration (.H file ).<Br></Br>private :<Br></Br>Cfont m_font ;<Br></Br>// Set font in class implementation (.Cpp file ). Note m_wndButton is a<Br></Br>//member variable added by ClassWizard.DDX routines hook the member<Br></Br>//variable to a dialog button contrlo.<Br></Br>BOOL CSampleDialog : : OnInitDialog ( )<Br></Br>{<Br></Br>…<Br></Br>//Create an 8-point Arial font<Br></Br>m_font . CreateFont (MulDiv (8 , -pDC—> GetDeviceCaps (LOGPIXELSY) , 72).<Br></Br>0 , 0 , 0 , FW_NORMAL , 0 , 0, 0, ANSI_CHARSER, OUT_STROKE_PRECIS ,<Br></Br>CLIP_STROKE _PRECIS , DRAFT _QUALITY<Br></Br>VARIABLE_PITCH |FF_SWISS, _T ("Arial") );<Br></Br>//Set font for push button .<Br></Br>m_wndButton . SetFont (&m _font );<Br></Br>…<Br></Br>}<Br></Br></p></td></tr><tr><td><font color="0000FF"><a name="2">如何限制编辑框中的准许字符 </a></font></td></tr><tr><td><p></Br>如果用户在编辑控件中只允许接收数字,可以使用一个标准的编辑控件并指定新的创建标志ES_NUMBERS,它是Windows 95新增加的标志,该标志限制 编辑控件只按收数字字符。如果用户需要复杂的编辑控件,可以使用Microsoft 的屏蔽编辑控件,它是一个很有用的OLE定制控件。<Br></Br>如果希望不使用OLE 定制控件自己处理字符,可以派生一个CEdit 类并处理WM_CHAR消息,然后从编辑控件中过滤出特定的字符。首先,使用ClassWizard 建立一个 CEdit的派生类,其次,在对话类中指定一个成员变量将编辑控件分类在OnInitdialog 中调用CWnd: : SubclassDlgItem .<Br></Br>//In your dialog class declaration (.H file )<Br></Br>private :<Br></Br>CMyEdit m_wndEdit ; // Instance of your new edit control .<Br></Br>//In you dialog class implementation (.CPP file )<Br></Br>BOOL CSampleDialog : : OnInitDialog ( )<Br></Br>{<Br></Br>…<Br></Br>//Subclass the edit lontrod .<Br></Br>m_wndEdit .SubclassDlgItem (IDC_EDIT,this );<Br></Br>…<Br></Br>}<Br></Br>使用ClassWizard处理WM_CHAR消息,计算nChar参量并决定所执行的操作,用户可以确定是否修改、传送字符。下例说明了如何显示字母字符,如果字符是字母字符,则调用CWnd ; OnChar,否则不调用OnChar.<Br></Br>//Only display alphabetic dharacters .<Br></Br>void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UITN nFlags )<Br></Br>{<Br></Br>//Determine if nChar is an alphabetic character .<Br></Br>if (: : IsCharAlpha ( ( TCHAR) nChar ) )<Br></Br>CEdit : : OnChar (nChar, nRepCnt , nFlags );<Br></Br>}<Br></Br>如果要修改字符,则不能仅仅简单地用修改过的nChar调用CEdit : : OnChar,然后CEdit: : OnChar调用CWnd: : Default获取原来的wParam 和lParam 的值 ,这样是不行的。要修改一个字符,需要首先修改nChar,然后用修改过的nChar调用CWnd: : DefWindowProc。下例说明了如何将字符转变为大写:<Br></Br>//Make all characters uppercase<Br></Br>void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UINT nFlags )<Br></Br>{<Br></Br>//Make sure character is uppercase .<Br></Br>if (: : IsCharAlpha ( .( TCHAR) nChar)<Br></Br>nChar=: : CharUpper (nChar ) ;<Br></Br>//Bypass default OnChar processing and directly call<Br></Br>//default window proc.<Br></Br>DefWindProc (WM_CHAR, nChar , MAKELPARAM (nRepCnt , nFlags )) ;<Br></Br>}<Br></Br></p></td></tr><tr><td><font color="0000FF"><a name="3">如何改变控件的颜色 </a></font></td></tr><tr><td><p></Br>有两种方法。其一,可以在父类中指定控件的颜色,或者利用MFC4.0新的消息反射在控件类中指定颜色。当控件需要重新着色时,工作框调用父窗口(通常是对话框)的CWnd: : OnCrtlColor,可以在父窗口类中重置该函数并指定控件的新的绘画属性。例如,下述代码将对话中的所有编辑控件文本颜色改为红色:<Br></Br>HBRUSH CAboutDig : : OnCtlColor (CDC * pDCM , CWnd * pWnd , UINT nCtlColor)<Br></Br>{<Br></Br>HBRUSH hbr = CDialog : : OnCtlColor (pDC, pWnd , nCtlColor );<Br></Br>//Draw red text for all edit controls .<Br></Br>if (nCtlColor= = CTLCOLOR_EDIT )<Br></Br>pDC —> SetTextColor (RGB (255 , 0 , 0 , ) ) ;<Br></Br>return hbr ;<Br></Br>}<Br></Br>然而,由于每个父窗口必须处理通知消息并指定每个控件的绘画属性,所以,这种方法不是完全的面向对象的方法。控件处理该消息并指定绘画属性更合情合理。消息反射允许用户这样做。通知消息首先发送给父窗口,如果父窗口没有处理则发送给控件。创建一个定制彩色列表框控件必须遵循下述步骤。<Br></Br>首先,使用ClassWizard 创建一个CListBox 的派生类并为该类添加下述数据成员。<Br></Br>class CMyListBox ; publilc CListBox<Br></Br>{<Br></Br>…<Br></Br>private;<Br></Br>COLORREF m_clrFor ; // foreground color<Br></Br>COLORREF m_clrBack ; //background color<Br></Br>Cbrush m_brush ; //background brush<Br></Br>…<Br></Br>} ;<Br></Br>其次,在类的构造函数中,初始化数据中。<Br></Br>CMyListBox : : CMyListBox ()<Br></Br>{<Br></Br>//Initialize data members .<Br></Br>m_clrFore =RGB (255 , 255 , 0) ; // yellow text<Br></Br>m_clrBack=RGB (0 , 0 , 255) ; // blue background<Br></Br>m_brush . CreateSolidBrush (m _clrBack );<Br></Br>}<Br></Br>最后,使用ClassWizard处理反射的WM_CTLCOLOR(=WM_CTLCOLOR)消息并指定新的绘画属性。<Br></Br>HBRUSH CMyListBox : : CtlColor (CDC* pDC, UINT nCtlColor )<Br></Br>{<Br></Br>pDC—>SetTextColor (m_clrFore);<Br></Br>pDC—>SetBkColor (m_clrBack);<Br></Br>return (HBRUSH) m_brush.GetSafeHandle ()<Br></Br>}<Br></Br>现在,控件可以自己决定如何绘画,与父窗口无关。<Br></Br></p></td></tr><tr><td><font color="0000FF"><a name="4">当向列表框中添加多个项时如何防止闪烁 </a></font></td></tr><tr><td><p></Br>调用CWnd::SetRedraw 清除重画标志可以禁止CListBox(或者窗口)重画。当向列表框添加几个项时,用户可以清除重画标志,然后添加项,最后恢复重画标志。为确保重画列表框的新项,调用SetRedraw (TRUE) 之后调用CWnd::Invalidate。<Br></Br>//Disable redrawing.<Br></Br>pListBox->SetRedraw (FALSE);<Br></Br>//Fill in the list box gere<Br></Br>//Enable drwing and make sure list box is redrawn.<Br></Br>pListBox->SetRedraw (TRUE);<Br></Br>pListBox->Invalidate ();<Br></Br></p></td></tr><tr><td><font color="0000FF"><a name="5">如何向编辑控件中添加文本 </a></font></td></tr><tr><td><p></Br>由于没有CEdit:: AppendText函数,用户只好自己做此项工作。调用CEdit:: SetSel移动到编辑控件末尾,然后调用CEdit:: ReplaceSel添加文本。下例是AppendText 的一种实现方法:<Br></Br>void CMyEdit:: AppendText (LPCSTR pText)<Br></Br>{<Br></Br>int nLen=GetWindowTextLength ();<Br></Br>SetFocus ();<Br></Br>SetSel (nLen, nLen);<Br></Br>ReplaceSel (pText);<Br></Br>}<Br></Br></p></td></tr><tr><td><font color="0000FF"><a name="6">如何更新翻转背景颜色的文本 </a></font></td></tr><tr><td><p></Br>调用CDC:: SetBkmode并传送OPAQUE用当前的背景颜色填充背景,或者调用CDC::SetBkMode并传送TRANSPAARENT使背景保持不变,这两种方法都可以设置背景模式。下例设置背景模式为TRANSPARENT,可以两次更新串,用花色带黑阴影更新文本。黑色串在红色串之后,但由于设置了背景模式仍然可见。<Br></Br>void CSampleView:: OnDraw (CDC* pDC)<Br></Br>{<Br></Br>//Determint size of view.<Br></Br>CRect rcView;<Br></Br>GetClientRect (rcVieew);<Br></Br>//Create sample string to display.<Br></Br>CString str (_T ("Awesome Shadow Text..."));<Br></Br>//Set the background mode to transparent.<Br></Br>pDC->SetBKMode (TRANSPARENT);<Br></Br>//Draw black shadow text.<Br></Br>rcView.OffsetRect (1, 1);<Br></Br>pDc->SetTextColor (RGB (0, 0, 0));<Br></Br>pDC->DrawText (str, str.GetLength (), rcView,<Br></Br>DT_SINGLELINE | DT_CENTER | DT_VCENTER);<Br></Br>//Draw red text.<Br></Br>rcView.OffsetRect (-1,-1);<Br></Br>pDc->SetTextColor (RGB (255, 0, 0));<Br></Br>pDC->DrawText (str, str.GetLength (), rcView,<Br></Br>DT_SINGLELINE | DT_CENTER | DT_VCENTER);<Br></Br>}<Br></Br></p></td></tr><tr><td><font color="0000FF"><a name="7">如何创建一个具有特定点大小的字体 </a></font></td></tr><tr><td><p></Br>可以指定字体逻辑单位的大小,但有时指定字体的点的大小可能会更方便一些。可以如下将字体的点转换为字体的高度:<Br></Br>int nHeigth=mulDiv (nPointSize, -dc.GetDeviceCaps (LOGPIXELSY), 72);<Br></Br>下例创建了一个8点的Apial字体:<Br></Br>CClientDC dc (AqfxGetMainWnd ());<Br></Br>m_font. CreateFont (MulDiv (8, -dc.GetDeviceCaps (LOGPIXELSY),<Br></Br>72),0,0,0,FW_NORMAL,0,0,0,ANSI_CHARSET,<Br></Br>OUT_STROKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY,<Br></Br>VARIABLE_PITCH | FF-SWISS,_T ("Arial"));<Br></Br></p></td></tr><tr><td><font color="0000FF"><a name="8">如何改变对话或窗体视窗的背景颜色 </a></font></td></tr><tr><td><p></Br>调用CWinApp : : SetDialogBkColor可以改变所有应用程序的背景颜色。第一个参数指定了背景颜色,第二个参数指定了文本颜色。下例将应用程序对话设置为蓝色背景和黄色文本。<Br></Br>BOOL CSampleApp : : InitInstance ( )<Br></Br>{<Br></Br>…<Br></Br>//use blue dialog with yellow text .<Br></Br>SetDialogBkColor (RGB (0, 0, 255 ), RGB ( 255 , 255 , 0 ) ) ;<Br></Br>…<Br></Br>}<Br></Br>需要重画对话(或对话的子控件)时,Windows向对话发送消息WM_CTLCOLOR,通常用户可以让Windows选择绘画背景的刷子,也可重置该消息指定刷子。下例说明了创建一个红色背景对话的步骤。<Br></Br>首先,给对话基类增加一人成员变量CBursh :<Br></Br>class CMyFormView : public CFormView<Br></Br>{<Br></Br>…<Br></Br>private :<Br></Br>CBrush m_ brush ; // background brush<Br></Br>…<Br></Br>} ;<Br></Br>其次, 在类的构造函数中将刷子初始化为所需要的背景颜色。<Br></Br>CMyFormView : : CMyFormView ( )<Br></Br>{<Br></Br>// Initialize background brush .<Br></Br>m_brush .CreateSolidBrush (RGB ( 0, 0, 255 ) )<Br></Br>}<Br></Br>最后,使用ClassWizard处理WM_CTLCOLOR消息并返回一个用来绘画对话背景的刷子句柄。注意:由于当重画对话控件时也要调用该函数,所以要检测nCtlColor参量。<Br></Br>HBRUSH CMyFormView : : OnCtlColor (CDC* pDC , CWnd*pWnd , UINT nCtlColor )<Br></Br>{<Br></Br>// Determine if drawing a dialog box . If we are , return +handle to<Br></Br>//our own background brush . Otherwise let windows handle it .<Br></Br>if (nCtlColor = = CTLCOLOR _ DLG )<Br></Br>return (HBRUSH) m_brush .GetSafeHandle ( ) ;<Br></Br>return CFormView : : OnCtlColor (pDC, pWnd , nCtlColor );<Br></Br>}<Br></p></td></tr></table><p align="center"><img src="/logo.gif" align="center"><a href="/co/index.htm">北京美达美科技有限公司</a> 版权所有: 1998-1999</a></p></body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -