综述
控件类型 | WNDCLASS | MFC类 | |
---|---|---|---|
Animation | “SysAnimate32” | CAnimateCtrl | ANIMATE_CLASS |
ComboBoxEx | “ComboBoxEx32” | CComboBoxEx | WC_COMBOBOXEX |
Data-Time | “SysDateTimePick32” | CDataTimeCtrl | DATETIMEPICK_CLASS |
Header | “SysHeader32” | CHeaderCtrl | WC_HEADER |
Hotkey | “msctls-hotkey32” | CHotkeyCtrl | HOTKEY_CLASS |
Image List | N/A | CImageList | N/A |
Ip Address | “SysIpAddress32” | CIpAddressCtrl | WC_IPADDRESS |
List-View | “SysListView32” | CListCtrl | WC_LISTVIEW |
Month Calendar | “SysMonthCal32” | CMonthCalCtrl | MONTHCAL_CLASS |
Progress | “msctls_Progress32” | CProgressCtrl | PROGRESS_CLASS |
Property Sheet | N/A | CPropertySheet | N/A |
Rebar | “ReBarWindow32” | CReBarCtrl | REBARCLASSNAME |
Rich edit | “RichEdit20A” “RichEdit20W” | CRichEditCtrl | RICHEDIT_CLASS |
Slider | “msctls_trackbar32” | CSliderCtrl | TRACKBAR_CLASS |
Spin Button | “msctls_updown32” | CSpinButtonCtrl | UPDOWN_CLASS |
Status bar | “msctls_statusbar32” | CStatusBarCtrl | STATUSCLASSNAME |
Tab | “SysTabControl32” | CTabCtrl | WC_TABCONTROL |
Tool bar | “ToolbarWindow32” | CToolBarCtrl | TOOLBARCLASSNAME |
ToolTip | “tooltips_class32” | CToolTipCtrl | TOOLTIPS_CLASS |
TreeView | “SysTreeView32” | CTreeCtrl | WC_TREEVIEW |
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
创建公用控件
- 1
- 2
- 3
- 4
- 5
…
- 1
- 2
- 3
公用控件公有得一些样式:
CCS_TOP
CCS_BOTTOM
CCS_LEFT
CCS_RIGHT
CCS_VERT
CCS_NOMOVEX 父窗口大小变化时,禁止控件随之调整大小和位置。X方向。
CCS_NOMOVEY 父窗口大小变化时,禁止控件随之调整大小和位置。Y方向。
CCS_NORESIZE 禁止控件随父窗口尺寸变化调整大小
CCS_NOPARENTALIGN
CCS_NODIVIDER 清除工具栏控件顶部得分隔栏
CCS_ADJUSTABLE
SDK风格应用中用公用控件,需调用 ::InitCommonControls/::InitCommonControlsEx加载Comctl32.dll,并注册控件得WNDCLASS。
在应用程序中多次调用::InitCommonControls/::InitCommonControlsEx无不良影响。
处理WM_NOTIFY:
公用控件把通知封装在WM_NOTIFY中。
WM_NOTIFY:
wParam:子窗口ID
lParam:NMHDR*
- 1
- 2
- 3
- 4
- 5
- 6
所有通用控件都传送的一些通知:
NM_CLICK
NM_DBLCLK
NM_RCLICK
NM_RDBLCLK
NM_RETURN 控件有焦点时,按下Enter发送。
NM_KILLFOCUS
NM_SETFOCUS
NM_OUTOFMEMORY
大部分公用控件有属于其自身特别的通知码。
例:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
封装在WM_NOTIFY消息中的通知通过ON_NOTIFY,ON_NOTIFY_RANGE宏,映射到类的成员函数。
ON_NOTIFY_REFLECT将其反射回控件。
传给ON_NOTIFY处理程序的参数pnmh就是WM_NOTIFY的lParam。参数 pResult传递函数返回值,意义需依靠特定控件特定消息确定。
滑杆控件
样式:
TBS_HORZ 水平放置
TBS_VERT 竖直放置
TBS_LEFT 刻度线画在竖直滑杆左
TBS_RIGHT 刻度线画在竖直滑杆右
TBS_TOP 刻度线画在水平滑杆上
TBS_BOTTOM 刻度线画在水平滑杆下
TBS_BOTH
TBS_NOTICKS 无刻度线
TBS_AUTOTICKS 每个停止位一个刻度线
TBS_FIXEDLENGTH
TBS_NOTHUMB
TBS_ENABLESELRANGE
TBS_TOOLTIPS
SliderCtrl:
SetRange/GetRange
SetPos/GetPos
SetTicFreq //设置刻度线间距离
SetSelection
- 1
- 2
- 3
- 4
- 5
UI自定义:
从CSilderCtrl派生一个类,添加消息处理。改变对按键和鼠标的响应。
移动滑块时,滑杆向其父窗口发WM_HSCROLL,WM_VSCROLL。
滑杆控件的OnHScroll,OnVScroll接收三个参数:
1.通知码
2.滑块位置
3.CScrollBar*
滑杆通知:
TB_TOP 滑杆有输入焦点 + 按下Home
TB_BOTTOM 滑杆有输入焦点 + 按下End
TB_LINEDOWN 滑杆有输入焦点 + 按下向下/右
TB_LINEUP 滑杆有输入焦点 + 按下向上/左
TB_PAGEDOWN 滑杆有输入焦点 + 按下PageDown,单击滑块右/下 单击区间不含滑块。
TB_PAGEUP
TB_THUMBTRACK 鼠标把滑块拖动到新位置
TB_THUMBPOSITION 鼠标拖后,释放
TB_ENDTRACK
CSilderCtrl:
SetPageSize
GetTic
GetTicPos
GetTicArray
GetNumTicks
ClearSel
微调按钮控件
样式:
UDS_HORZ 箭头是水平的。
UDS_WRAP 如前进后退,超过边界值,位置按环式结构确定
UDS_ARROWKEYS 添加键盘接口
UDS_NOTHOUSANDS 消除千位分隔符
UDS_SETBUDDYINT 位置变化时,更新伙伴控件的文本
UDS_AUTOBUDDY 按Z向顺序选以前的控件做微调按钮的伙伴
UDS_ALIGNRIGHT
UDS_ALIGNLEFT
选择按钮控件和它的伙伴控件
- 1
- 2
- 3
- 4
- 5
- 6
- 7
CSpinButtonCtrl::SetBase // 设置以什么进制来显示数值
微调按钮控件中每单击一次箭头,位置会前进或后退一个。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
位置变化前,微调按钮控件向其父窗口发WM_NOTIFY消息。
通知码:UDN_DELTAPOS
lParam:NM_UPDOWN*
处理程序把*pResult设为FALSE,表允许变化发生。
跟在UDN_DELTAPOS通知后的是WM_HSCROLL或WM_VSCROLL。
工具提示控件
CToolTipCtrl
CToolTipCtrl::Create // 创建一个工具提示控件
m_ctlTT.Create(this);
创立后,下一步是在其中添加工具,
工具可以是另外一个窗口,也可是窗口的一个矩形区域。
一个工具提示控件可连接任意个工具。
- 1
- 2
MFC的工具提示控件具备子类划分能力。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
动态工具提示:
如在调用AddTool,AddWindowTool,AddRectTool时,给工具提示文本指定了 LPSTRTEXTCALLBACK,工具提示控件会在显示工具提示前给其父窗口发一些通知。
WM_NOTIFY
通知码:TTN_NEEDTEXT
lParam:TOOLTIPTEXT*
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
ToolTip控件的父窗口可用三种方式响应TTN_NEEDTEXT通知:
1.把文本字符串的地址复制到TOOLTIPTEXT结构的lpszText中。
2.把文本复制到szText。
3.把字符串资源ID给lpszText。把应用实例句柄给hinst。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
CToolTipCtrl::
GetText
UpdateTipText
SetDelayTime
图像列表和ComboBoxEx控件
CImageList:
为其它控件提供图像,在位图上制造特殊效果。
MFC用三种方式创建图像列表:
1.先创建空的,再用Add在其中添加图像。
2.用含图像数组的位图创建初始化了的图像列表。
3.合并现有图像列表的图像创建初始化了的。
- 1
- 2
CImageList::SetBkColor // 让背景色画不出来。
// 在指定DC上显示il中图片
il.Draw(pDC, 2, point, ILD_NORMAL);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
cbei.iIndent // 指定项目空格数,用于缩进显示。
COMBOBOXEXITEM:
DeleteItem
GetItem
SetItem
CComboBoxEx : public CComboBox
CComboBoxEx还支持几种扩展样式。需用CComboBoxEx::SetExtendedStyle实现。
CComBoBoxEx发给父窗口的CBN通知和传统组合框一样。
还支持自己特有的通知。
CComboBoxEx通知
CBEN_BEGINEDIT 显示下拉列表/单击编辑控件
CBEN_ENDEDIT 在控件列表里选中或编辑控件的文本
CBEN_DRAGBEGIN 在控件中拖动某项
CBEN_INSERTITEM 某项被插入控件
CBEN_DELETEITEM 某项被删除
CBEN_GETDISPINFO
NM_SETCURSOR
进度/动画
CProgressCtrl
- 1
- 2
- 3
- 4
- 5
CAnimateCtrl
Open
Play
Stop
Close
样式:
ACS_AUTOPLAY
ACS_CENTER
ACS_TRANSPARENT
ACS_TIMER
IP地址
CIpAddressCtrl
SetAddress
GetAddress
ClearAddress
IsBlank
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
m_wndIpAddress.SetFieldRange(0, 10, 100);
IP地址控件向其所有者,发四种通知:
WM_COMMAND:
EN_SETFOCUS
EN_KILLFOCUS
EN_CHANGE
WM_NOTIFY:
IDN_FIELDCHANGED