第 30 章
成员函数,可用来查询和设置编辑框组件。
表5-14 针对编辑框组件的CComboBox 成员函数
成员函数名 对应的CEdit 成员函数 与CEdit 成员函数的不同之处
CWnd::GetWindowText CWnd::GetWindowText 无
CWnd::SetWindowText CWnd::SetWindowText 无
CWnd::GetWindowTextLength CWnd::GetWindowTextLength 无
GetEditSel GetSel 仅函数名不同
SetEditSel SetSel 函数名不同,且无bNoScroll 参数
Clear Clear 无
枫叶文学网www.fywxw.com
第5 章 常用控件
·125·
续表
成员函数名 对应的CEdit 成员函数 与CEdit 成员函数的不同之处
Copy Copy 无
Cut Cut 无
Paste Paste 无
与CListBox 的成员函数类似,针对列表框组件的CComboBox 成员函数也可以分为3 类。
表5-15 列出了用于chā入和删除列表项的成员函数,表5-16 列出了用于搜索、查询和设置列
表框的成员函数,与列表项的选择有关的成员函数如表5-17 所示。需要指出的是,如果这些
函数出错,则返回CB_ERR,而不是LB_ERR。另外,排序的组合框具有的是CBS_SORT 风
格,而不是LBS_SORT。
表5-15 用于chā入和删除列表项的CComboBox 成员函数
成员函数名 对应的CListBox 成员函数 与CEdit 成员函数的不同之处
AddString AddString 无
InsertString InsertString 无
DeleteString DeleteString 无
ResetContent ResetContent 无
Dir Dir 无
表5-16 用于搜索、查询和设置列表框的CComboBox 成员函数
成员函数名 对应的CListBox 成员函数 与CEdit 成员函数的不同之处
GetCount GetCount 无
FindString FindString 无
GetLBText GetText 仅函数名不同
GetLBTextLen GetTextLen 仅函数名不同
GetItemData GetItemData 无
SetItemData SetItemData 无
GetTopIndex GetTopIndex 无
SetTopIndex SetTopIndex 无
表5-17 与列表项的选择有关的CComboBox 成员函数
成员函数名 对应的CListBox 成员函数 与CEdit 成员函数的不同之处
GetCurSel GetCurSel 无
SetCurSel SetCurSel
新选的列表项的内容会被拷贝到
编辑框组件中
SelectString SelectString
新选的列表项的内容会被拷贝到
编辑框组件中
5.7 图片(Picture)控件
图片(Picture)控件实际上是一种静态文本(CStatic)控件,可以通过在创建静态文本
控件时加入特定的标志来得到图片控件,这些方面的内容,具体可以参见5.1 节。这里主要
介绍一下如何在资源编辑器中快捷方便地使用图片控件。
选中图片控件后拖放到对话框上,可以通过图片控件属xìng对话框来对图片控件进行基本
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·126·
设置,图片对话框如图5-5 所示。
图5-5 Picture Properties 对话框
图片控件所支持的格式如表5-18 所示。
表5-18 Picture 控件支持的格式
格式 含义
Frcom 显示一个无填充的矩形框,边框颜色可以通过Color 下拉列表设定
Rectangle 显示一个填充的矩形框,矩形颜色可通过Color 下拉列表设定
Icon 显示一个图标(Icon),图标通过Image 下拉列表来设置图标资源ID
Bitmap 显示一个位图(Bitmap),位图通过Image 下拉列表来设置位图资源ID
Enhanced Metafile 显示一个加强的元数据文件(Metafile)
由于图片控件在具体使用方法上和静态文本控件没有什么差别,因此在这里就不详细叙
述了。
实例5-3:美化对话框应用程序实例。源代码在光盘中“\05\实例5-3\New_RMB”目录下。
下面为数字转换一例中的截面定制漂亮的界面和按钮,通过此例程读者将学习到如何美
化对话框应用程序的界面。
定制“外衣”的主要代码是使用WM_ERASEBKGND、WM_CTLCOLOR 消息重画用户
界面,利用CBitmapButton 实现位图按钮,主要代码如下:
HBRUSH CRMBDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
switch(nCtlColor) {
case CTLCOLOR_EDIT:
{
if (pWnd->GetDlgCtrlID() == IDC_EDIT_NUM)
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(200,10,200)); //改变字体的颜色
hbr = HBRUSH(GetStockObject(HOLLOW_BRUSH));
}
else if(pWnd->GetDlgCtrlID() == IDC_EDIT_CHA)
{
枫叶文学网www.fywxw.com
第5 章 常用控件
·127·
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(200,10,200)); //改变字体的颜色
hbr = HBRUSH(GetStockObject(HOLLOW_BRUSH));
}
else
{
hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}
break;
}
case CTLCOLOR_STATIC:
{
if(pWnd->GetDlgCtrlID() == IDC_SMALL_STATIC)
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(10,10,255));
hbr = (HBRUSH)GetStockObject(HOLLOW_BRUSH);
}
else if(pWnd->GetDlgCtrlID() == IDC_LARGE_STATIC)
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,10,10));
hbr = (HBRUSH)GetStockObject(HOLLOW_BRUSH);
}
else
{
hbr = CDialog::OnCtlColor(pDC,pWnd,nCtlColor);
}
}
break;
default:
break;
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
BOOL CRMBDlg::OnEraseBkgnd(CDC* pDC)
{
CBitmap bmp;
bmp.LoadBitmap(IDB_BG);
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·128·
CBrush brush(&bmp);
CRect rc;
GetClientRect(&rc);
pDC->FillRect(rc, &brush);
return true;
}
程序运行界面如图5-6 所示。
图5-6 定制外衣后对话框的用户界面
5.8 列表(List Ctrl)控件
5.8.1 Win32 新型控件概述
列表控件是一种Win32 控件,这和前面提到的传统控件在某些方面存在不同。Win32 控
件采用新的WM_NOTIFY 消息来实现新控件的消息通知机制。在该消息的wParam 中含有控
件的ID,lParam 中则有一个指针,这个指针指向一个结构。这个结构要么是NMHDR 结构,
要么是一个以NMHDR 结构作为第一个成员的扩充结构。通过NMHDR 结构及其扩充结构可
以传递附加数据。从理论上讲,可以通过扩充结构传送任意多的数据。需要指出的是,由于
NMHDR 结构是扩充结构的第一个成员,因此lParam 中的指针即可以认为是指向NMHDR
结构的,也可以认为是指向包含NMHDR 结构的扩充结构的。
1.NMHDR 结构
NMHDR 结构如下:
typedef struct tagNMHDR
{
HWND hwndFrom; //控件窗口的句柄
UINT idFrom; //控件的ID
UINT code; //控件的通知消息码
}NMHDR;
一个典型的扩充结构如下,该结构用于列表视图控件的LVN_KEYDOWN 通知消息。
typedef struct tagLV_KEYDOWN{
NMHDR hdr; //NMHDR 结构作为第一个成员
枫叶文学网www.fywxw.com
第5 章 常用控件
·129·
WORD wVKey;
UINT flags;
}LV_KEYDOWN;
2.WM_NOTIFY 消息处理
WM_NOTIFY 的消息映shè由宏ON_NOTIFY 负责,该消息映shè宏具有如下形式:
ON_NOTIFY(wNotifyCode,idcommberFxn)
参数wNotifyCode 说明了通知消息码,参数id 是控件的ID,第三个参数则是消息处理
函数名。消息处理函数应该按下面的形式声明,其中参数pNotifyStruct 指向NMHDR 及其扩
充结构,参数result 指向一个处理结果:
afx_msg voidcommberFxn(NMHDR* pNotifyStruct, LRESULT * result);
利用ClassWizard 可以很方便地加入WM_NOTIFY 消息映shè及其处理函数,一个典型的
WM_NOTIFY 消息映shè如下,其中LVN_KEYDOWN 是IDC_LIST1 列表视图控件发出的通
知消息:
ON_NOTIFY(LVN_KEYDOWN, IDC_LIST1,OnKeydownList1)
消息处理函数OnKeydownList1 的定义如下:
void CMyDlg::OnKeydownList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
// TODO: Add your control notification handler
// code here
*pResult = 0;
}
在函数中ClassWizard 自动把pNHHDR 指针强制转换成LV_KEYDOWN 型并赋给
pLVKeyDow 指针,这样,在函数中可通过这两个指针访问LV_KEYDOWN 扩充结构及其所
含的NMHDR 结构。另外,在函数返回时,ClassWizard 自动将处理结果赋0 值。
可以利用ON_NOTIFY_RANGE 宏把多个ID 连续的控件发出的相同消息映shè到同一个
处理函数上,具体形式如下:
ON_NOTIFY_RANGE(wNotifyCode, id, idLast,commberFxn)
其中参数id 和idLast 分别说明明了一组连续的控件ID 中的头一个和最后一个ID。
相应的消息处理函数应按下面的形式声明:
afx_msg voidcommberFxn(UINT id, NMHDR* pNotifyStruct,LRESULT * result);
与普通的WM_NOTIFY 消息处理函数相比,该函数多了一个参数id 用来说明发送通知
消息的控件ID。
ClassWizard 不支持ON_NOTIFY_RANGE 宏,所以需要手工建立消息映shè和消息处理函
数。
5.8.2 列表控件的使用
列表控件用来成列地显示数据。列表视图的表项通常包括图标(Icon)和标题(Label)
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·130·
两部分,它们分别提供了对数据的形象和抽象描述。列表视图控件是对传统的列表框的重大
改进,它能够以下列4 种格式显示数据。读者可以在资源管理器中的视图(View)菜单中切换
列表视图的显示格式,来看看4 种格式的不同之处。
? 大图标格式(Large Icons):可逐行显示多列表项,图标的大小可由应用程序指定,通
常是32×32 像素,在图标的下面显示标题。
? 小图标格式(Small Icons):可逐行显示多列表项,图标的大小可由应用程序指定,通
常是16×16 像素,在图标的右面显示标题。表项以行的方式组织。
? 列表格式(List)。与小图标格式类似。不同之处在于表项是逐列多列显示的。
? 报告格式(Report 或Details):每行仅显示一个表项,在标题的左边显示一个图标,
表项可以不显示图标而只显示标题。表项的右边可以附加若干列子项(Subitem),子
项只显示正文。在控件
松语文学免费小说阅读_www.16sy.com
表5-14 针对编辑框组件的CComboBox 成员函数
成员函数名 对应的CEdit 成员函数 与CEdit 成员函数的不同之处
CWnd::GetWindowText CWnd::GetWindowText 无
CWnd::SetWindowText CWnd::SetWindowText 无
CWnd::GetWindowTextLength CWnd::GetWindowTextLength 无
GetEditSel GetSel 仅函数名不同
SetEditSel SetSel 函数名不同,且无bNoScroll 参数
Clear Clear 无
枫叶文学网www.fywxw.com
第5 章 常用控件
·125·
续表
成员函数名 对应的CEdit 成员函数 与CEdit 成员函数的不同之处
Copy Copy 无
Cut Cut 无
Paste Paste 无
与CListBox 的成员函数类似,针对列表框组件的CComboBox 成员函数也可以分为3 类。
表5-15 列出了用于chā入和删除列表项的成员函数,表5-16 列出了用于搜索、查询和设置列
表框的成员函数,与列表项的选择有关的成员函数如表5-17 所示。需要指出的是,如果这些
函数出错,则返回CB_ERR,而不是LB_ERR。另外,排序的组合框具有的是CBS_SORT 风
格,而不是LBS_SORT。
表5-15 用于chā入和删除列表项的CComboBox 成员函数
成员函数名 对应的CListBox 成员函数 与CEdit 成员函数的不同之处
AddString AddString 无
InsertString InsertString 无
DeleteString DeleteString 无
ResetContent ResetContent 无
Dir Dir 无
表5-16 用于搜索、查询和设置列表框的CComboBox 成员函数
成员函数名 对应的CListBox 成员函数 与CEdit 成员函数的不同之处
GetCount GetCount 无
FindString FindString 无
GetLBText GetText 仅函数名不同
GetLBTextLen GetTextLen 仅函数名不同
GetItemData GetItemData 无
SetItemData SetItemData 无
GetTopIndex GetTopIndex 无
SetTopIndex SetTopIndex 无
表5-17 与列表项的选择有关的CComboBox 成员函数
成员函数名 对应的CListBox 成员函数 与CEdit 成员函数的不同之处
GetCurSel GetCurSel 无
SetCurSel SetCurSel
新选的列表项的内容会被拷贝到
编辑框组件中
SelectString SelectString
新选的列表项的内容会被拷贝到
编辑框组件中
5.7 图片(Picture)控件
图片(Picture)控件实际上是一种静态文本(CStatic)控件,可以通过在创建静态文本
控件时加入特定的标志来得到图片控件,这些方面的内容,具体可以参见5.1 节。这里主要
介绍一下如何在资源编辑器中快捷方便地使用图片控件。
选中图片控件后拖放到对话框上,可以通过图片控件属xìng对话框来对图片控件进行基本
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·126·
设置,图片对话框如图5-5 所示。
图5-5 Picture Properties 对话框
图片控件所支持的格式如表5-18 所示。
表5-18 Picture 控件支持的格式
格式 含义
Frcom 显示一个无填充的矩形框,边框颜色可以通过Color 下拉列表设定
Rectangle 显示一个填充的矩形框,矩形颜色可通过Color 下拉列表设定
Icon 显示一个图标(Icon),图标通过Image 下拉列表来设置图标资源ID
Bitmap 显示一个位图(Bitmap),位图通过Image 下拉列表来设置位图资源ID
Enhanced Metafile 显示一个加强的元数据文件(Metafile)
由于图片控件在具体使用方法上和静态文本控件没有什么差别,因此在这里就不详细叙
述了。
实例5-3:美化对话框应用程序实例。源代码在光盘中“\05\实例5-3\New_RMB”目录下。
下面为数字转换一例中的截面定制漂亮的界面和按钮,通过此例程读者将学习到如何美
化对话框应用程序的界面。
定制“外衣”的主要代码是使用WM_ERASEBKGND、WM_CTLCOLOR 消息重画用户
界面,利用CBitmapButton 实现位图按钮,主要代码如下:
HBRUSH CRMBDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
switch(nCtlColor) {
case CTLCOLOR_EDIT:
{
if (pWnd->GetDlgCtrlID() == IDC_EDIT_NUM)
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(200,10,200)); //改变字体的颜色
hbr = HBRUSH(GetStockObject(HOLLOW_BRUSH));
}
else if(pWnd->GetDlgCtrlID() == IDC_EDIT_CHA)
{
枫叶文学网www.fywxw.com
第5 章 常用控件
·127·
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(200,10,200)); //改变字体的颜色
hbr = HBRUSH(GetStockObject(HOLLOW_BRUSH));
}
else
{
hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}
break;
}
case CTLCOLOR_STATIC:
{
if(pWnd->GetDlgCtrlID() == IDC_SMALL_STATIC)
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(10,10,255));
hbr = (HBRUSH)GetStockObject(HOLLOW_BRUSH);
}
else if(pWnd->GetDlgCtrlID() == IDC_LARGE_STATIC)
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,10,10));
hbr = (HBRUSH)GetStockObject(HOLLOW_BRUSH);
}
else
{
hbr = CDialog::OnCtlColor(pDC,pWnd,nCtlColor);
}
}
break;
default:
break;
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
BOOL CRMBDlg::OnEraseBkgnd(CDC* pDC)
{
CBitmap bmp;
bmp.LoadBitmap(IDB_BG);
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·128·
CBrush brush(&bmp);
CRect rc;
GetClientRect(&rc);
pDC->FillRect(rc, &brush);
return true;
}
程序运行界面如图5-6 所示。
图5-6 定制外衣后对话框的用户界面
5.8 列表(List Ctrl)控件
5.8.1 Win32 新型控件概述
列表控件是一种Win32 控件,这和前面提到的传统控件在某些方面存在不同。Win32 控
件采用新的WM_NOTIFY 消息来实现新控件的消息通知机制。在该消息的wParam 中含有控
件的ID,lParam 中则有一个指针,这个指针指向一个结构。这个结构要么是NMHDR 结构,
要么是一个以NMHDR 结构作为第一个成员的扩充结构。通过NMHDR 结构及其扩充结构可
以传递附加数据。从理论上讲,可以通过扩充结构传送任意多的数据。需要指出的是,由于
NMHDR 结构是扩充结构的第一个成员,因此lParam 中的指针即可以认为是指向NMHDR
结构的,也可以认为是指向包含NMHDR 结构的扩充结构的。
1.NMHDR 结构
NMHDR 结构如下:
typedef struct tagNMHDR
{
HWND hwndFrom; //控件窗口的句柄
UINT idFrom; //控件的ID
UINT code; //控件的通知消息码
}NMHDR;
一个典型的扩充结构如下,该结构用于列表视图控件的LVN_KEYDOWN 通知消息。
typedef struct tagLV_KEYDOWN{
NMHDR hdr; //NMHDR 结构作为第一个成员
枫叶文学网www.fywxw.com
第5 章 常用控件
·129·
WORD wVKey;
UINT flags;
}LV_KEYDOWN;
2.WM_NOTIFY 消息处理
WM_NOTIFY 的消息映shè由宏ON_NOTIFY 负责,该消息映shè宏具有如下形式:
ON_NOTIFY(wNotifyCode,idcommberFxn)
参数wNotifyCode 说明了通知消息码,参数id 是控件的ID,第三个参数则是消息处理
函数名。消息处理函数应该按下面的形式声明,其中参数pNotifyStruct 指向NMHDR 及其扩
充结构,参数result 指向一个处理结果:
afx_msg voidcommberFxn(NMHDR* pNotifyStruct, LRESULT * result);
利用ClassWizard 可以很方便地加入WM_NOTIFY 消息映shè及其处理函数,一个典型的
WM_NOTIFY 消息映shè如下,其中LVN_KEYDOWN 是IDC_LIST1 列表视图控件发出的通
知消息:
ON_NOTIFY(LVN_KEYDOWN, IDC_LIST1,OnKeydownList1)
消息处理函数OnKeydownList1 的定义如下:
void CMyDlg::OnKeydownList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
// TODO: Add your control notification handler
// code here
*pResult = 0;
}
在函数中ClassWizard 自动把pNHHDR 指针强制转换成LV_KEYDOWN 型并赋给
pLVKeyDow 指针,这样,在函数中可通过这两个指针访问LV_KEYDOWN 扩充结构及其所
含的NMHDR 结构。另外,在函数返回时,ClassWizard 自动将处理结果赋0 值。
可以利用ON_NOTIFY_RANGE 宏把多个ID 连续的控件发出的相同消息映shè到同一个
处理函数上,具体形式如下:
ON_NOTIFY_RANGE(wNotifyCode, id, idLast,commberFxn)
其中参数id 和idLast 分别说明明了一组连续的控件ID 中的头一个和最后一个ID。
相应的消息处理函数应按下面的形式声明:
afx_msg voidcommberFxn(UINT id, NMHDR* pNotifyStruct,LRESULT * result);
与普通的WM_NOTIFY 消息处理函数相比,该函数多了一个参数id 用来说明发送通知
消息的控件ID。
ClassWizard 不支持ON_NOTIFY_RANGE 宏,所以需要手工建立消息映shè和消息处理函
数。
5.8.2 列表控件的使用
列表控件用来成列地显示数据。列表视图的表项通常包括图标(Icon)和标题(Label)
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·130·
两部分,它们分别提供了对数据的形象和抽象描述。列表视图控件是对传统的列表框的重大
改进,它能够以下列4 种格式显示数据。读者可以在资源管理器中的视图(View)菜单中切换
列表视图的显示格式,来看看4 种格式的不同之处。
? 大图标格式(Large Icons):可逐行显示多列表项,图标的大小可由应用程序指定,通
常是32×32 像素,在图标的下面显示标题。
? 小图标格式(Small Icons):可逐行显示多列表项,图标的大小可由应用程序指定,通
常是16×16 像素,在图标的右面显示标题。表项以行的方式组织。
? 列表格式(List)。与小图标格式类似。不同之处在于表项是逐列多列显示的。
? 报告格式(Report 或Details):每行仅显示一个表项,在标题的左边显示一个图标,
表项可以不显示图标而只显示标题。表项的右边可以附加若干列子项(Subitem),子
项只显示正文。在控件
松语文学免费小说阅读_www.16sy.com