VC++控件的汉字及颜色的编程控制 丁有和 孙健 摘 要 文章着重讨论如何用编程的方法控制对话框中常用控件的汉字文本的字体及颜色,并以VC++ 5.0[1]为例给出具体的操作方法及相关程序代码。 关键词 控件汉字,字体,颜色,编程 在Windows应用程序中,VC++ 5.0为编程人员提供了各种控件来实现直观、方便、快捷的交互界面,这些控件包括如静态控件、按钮、滚动条等六种在Windows系统中广泛应用的一般控件(如表1所示)和由Windows 95 及Windows NT (4.0以后)提供动态连接库Commctrl.dll及Comctl32.dll中的公共控件以及支持Internet的ActiveX控件共三大类。 表1 一般控件的类型[2] |
控件类型 | 窗口类名称 | 是否有文本 | 描述 |
静态控件 | STATIC | 有 | 用来向用户显示一些几乎固定不变的文字或图形描述 |
按钮 | BUTTON | 有 | 用来产生某些命令或改变某些选项设置 |
滚动条 | SCROLLBAR | 无 | 通过滚动块在滚动条上的移动来改变某些数值选项 |
列表框 | LISTBOX | 有 | 显示一个列表,让用户从中选取一个或多个项 |
编辑框 | EDIT | 有 | 可完成文字的输入输出双向操作,使用户能查看并编辑文字 |
组合框 | COMBOBOX | 有 | 它把列表框和编辑框有机地组合在一起,用户不仅能 选择列表中已有的项,还能编辑出新的项 |
1 控件的字体控制 控件的创建方式有两种。一种是在对话框模块中进行创建,通过对话框编辑器可以对控件进行添加、选取、删除、布局、定义、改变大小等操作。另一种方式是通过调用CreateWindow或CreateWindowEx函数来创建控件,这时必须指定控件的窗口类。在上述两种方式下,控件的字体、大小的改变方法是不一样的。由于第一种方式更具操作性,适合于大多数编程人员。 1 CWnd *pWnd=GetDlgItem(IDC_USER);//获取标识号为IDC—USER的控件的CWnd指针
2 CDC *pDC=pWnd->GetDC(); 3 CFont font; 4 LOGFONT stFont; 5 memset(&stFont,0,sizeof(LOGFONT)); 6 stFont.lfHeight=MulDiv(12,-pDC->GetDeviceCaps(LOGPIXELSY),72);//设置字体高度为12 7 stFont.lfWeight=FW—NORMAL; 8 stFont.lfCharSet=GB2312_CHARSET; 9 strcpy(stFont.lfFaceName,"黑体");//设置字样为黑体 10 font.CreateFontIndirect(&stFont); 11 CFont *oldfont=pDC->SelectObject(&font); 12 pWnd->SetFont(&font,TRUE); 13 font.DeleteObject(); 14 pDC->SelectObject(oldfont); 15 pWnd->ReleaseDC(pDC); 参见上面的代码将批pDC引入CTestingView.OnInitialUpdate()的中的关于CListCtrlStyled的部分,具体代码如下: 1
2 CWnd *pWnd=GetDlgItem(IDC_LIST2);//获取标识号为IDC—USER的控件的CWnd指针 3 CDC *pDC=pWnd->GetDC(); 4CFont font; 5 LOGFONT stFont; 6 memset(&stFont,0,sizeof(LOGFONT)); 7 stFont.lfHeight=MulDiv(16,pDC->GetDeviceCaps(LOGPIXELSY),72);//设置字体高度为12 8 stFont.lfWeight=FW_NORMAL; 9 stFont.lfCharSet=GB2312_CHARSET; 10 strcpy(stFont.lfFaceName,"黑体");//设置字样为黑体 11 font.CreateFontIndirect(&stFont); 12 13 pWnd->SetFont(&font,TRUE); 14 15 //m_ListCtrlStyled.SetFont(&font);//<===原来用此语句
2 控件文本颜色的控制[3] 在绘制控件前,Windows向该控件的父窗口发送一条WM—CTLCOLOR消息,目的是获得该控件的颜色。CWnd对象通过重置虚拟方法OnCtlColor处理WM—CTLCOLOR消息。如果返回一个HBRUSH,就会用它绘制控件的背景。在从OnCtlColor方法返回之前设置控件文本的前景和背景颜色,就可对控件文本颜色进行控制[1];另外,文字格式化的其他函数如SetBKMode、SetTextCharacterExtra、SetTextAlign等对控件文本同样有效。下面举例说明: |
对象ID | 函数 | 消息 |
CTestDlg | OnInitDialog | WM—INITDIALOG |
CTestDlg | OnCtlColor | WM—CTLCOLOR |
IDC—TBUTT | OnTbutt | BN—CLICKED |
切换到Class Wizard中的Member Varible标签,添加下述成员变量: |
控件ID | 类型 | 成员 |
IDC—TLIST | ClistBox | m—list |
IDC—TSTAT | Cstring | m—text |
4) 给类CTestDlg添加成员变量 用Add Variable对话框添加下述成员变量: |
类型 | 声明 | 访问 |
COLORREF | m—bkcolor | protected |
COLORREF | m—focolor | protected |
5) 编写上述的代码 void CTestDlg::OnTbutt() { m—bkcolor=RGB(0,255,0); m—focolor=RGB(255,0,0); m—list.Invalidate(); } BOOL CTestDlg::OnInitDialog() { CDialog::OnInitDialog(); m—bkcolor=GetSysColor(COLOR—WINDOW); m—focolor=GetSysColor(COLOR—WINDOWTEXT); TCHAR szpath[MAX—PATH]={"c:\\windows"}; DlgDirList(szpath,IDC—TLIST,IDC—TSTAT,DDL—READWRITE|DDL—READONLY| DDL—HIDDEN|DDL—SYSTEM|DDL—ARCHIVE);//将IDC—TLIST初始化成文件列表 return TRUE; } HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if (nCtlColor==CTLCOLOR—LISTBOX){ pDC->SetBkColor(m—bkcolor); pDC->SetTextColor(m—focolor); } return hbr; 上述OnCtlColor方法的代码中(nCtlColor== CTLCOLOR—LISTBOX),使列表框类的颜色得以改变;若同时有两个列表框,则两个列表框的颜色将同时改变,而不能单独改变其中某个列表框的颜色;除此之外,还有按钮(CTLCOLOR—BTN)、对话框(CTLCOLOR—DLG)、编辑框(CTLCOLOR—EDIT)、消息框(CTLCOLOR—MSGBOX)、滚动条(TLCOLOR—SCROLLBAR)、静态文本(CTLCOLOR—STATIC)等控件类有类似的现象。 至此,我们可以在程序中对控件文本的字体和颜色进行控制,使开发的用户界面更加美观、友好。 丁有和 硕士生。从事CAD、CAI的研究。 |