控件属于子窗口,父窗口移动时,子窗口也移动。父窗口销毁时,子窗口也销毁。
控件类型 | WNDCLASS | MFC类 |
---|---|---|
按钮 | “BUTTON” | CButton |
列表框 | “LISTBOX” | CListBox |
编辑控件 | “EDIT” | CEdit |
组合框 | “COMBOBOX” | CComboBox |
编辑控件 | “SCROLLBAR” | CScrollBar |
编辑控件 | “STATIC” | CStatic |
控件以WM_COMMAND形式给父窗口发通知。
MFC提供的可处理控件消息的宏:
对按钮: ON_BN_XX
对编辑控件:ON_EN_XX
对列表控件:ON_LBN_XX
一般化形式:ON_CONTROL_XX可处理所有控件类型
控件给父窗口发送信息,父窗口也可给控件发信息。MFC中主要用在父窗口中调用控件类成员函数体现。
1.按钮
风格:
BS_PUSHBUTTON//1
BS_DEFPUSHBUTTON//2.1,2按下时发的WM_COMMAND含通知码BN_CLICKED
BS_CHECKBOX//3
BS_AUTOCHECKBOX//4
BS_3STATE//5
BS_AUTO3STATE//6.3,4,5,6按下时通知码为BN_CHECKED
BS_RADIOBUTTON//7
BS_AUTORADIOBUTTON//8。 7,8按下时通知码为BN_CLICKED
BS_GROUPBOX// 按下不发通知
文字对齐:
BS_LEFTTEXT
BS_RIGHT
BS_LEFT
BS_CENTER
BS_TOP
BS_VCENTER
BS_BOTTOM
BS_MULTILINE
其它样式:
BS_NOTIFY允许按钮发送BN_DOUBLECLICKED,BN_KILLFOCUS,BN_SETFOCUS
BS_OWNERDRAW自绘
使用BS_AUTORADIOBUTTON:
a.代码中顺序创建BS_AUTORADIOBUTTON风格按钮。
b.用WS_GROUP标记一组开始。一组后首个控件也加上WS_GROUP.
c.初始的设置一个为选中的
2.列表CListBox
CListBox已有键盘处理逻辑。
用 LBS_WANTKEYBOARDINPUT样式,且处理 WM_VKEYTOITEM,WM_CHARTOITEM可自定义键盘处理逻辑。
样式:
LBS_SORT
LBS_NOSEL
LBS_NOTIFY
LBS_DISABLENOSCROLL
LBS_MULTIPLESEL
LBS_EXTENDEDSEL// 支持用Ctrl按下来多选,支持按下Shift来范围选择
LBS_MULTICOLUMN
LBS_OWNERDRAWVARIABLE
LBS_OWNERDRAWFIXED
LBS_USETABSTOPS
LBS_NOREDRAW
LBS_HASSTRING 自绘列表,无此样式
LBS_WANTKEYBOARDINPUT键按下时,给父窗口发WM_VKEYTOITEM,WM_CHARTOITEM
LBS_NOINTEGRALHEIGHT允许列表框有任意高度
LBS_USETABSTOPS
遇到制表位自动前进到下一个制表位
m_wndListBox.SetTabStops(64);
int nTabStops[] =
{
32,
48,
64,
128
};
m_wndListBox.SetTabStops(4, nTabStops);// 从左开始将制表位设在32,48,64,128个对话框单位的地方
// 大量重绘没效率,可在最后重绘
m_wndListBox.SendMessage(WM_SETREDRAW, FALSE, 0);
...
m_wndListBox.SendMessage(WM_SETREDRAW, TRUE, 0);
SetColumnWidth
AddString//1
InsertString//2. 1,2返回基于0的索引号
GetCount
DeleteString// 返回剩余数目数量
ResetContent
SetItemDataPtr// 把项目和32位指针关联
SetItemData// 把项目和DWORD关联
GetItemDataPtr
GetItemData
GetText
GetCurSel//3
SetCurSel//4
GetSel
SelectString(int nStartFindPos, CString _strPre)//5. 3,4,5对多选列表框不适用
FindString
FindStringExact
GetText(int nIndex, CString &string)
GetTextLen
多选:
SetSel
SetSelRange// 选中或取消
GetSelCount
GetSelItems
SetCaretIndex//6
GetCaretIndex//7. 6,7移动和查询焦点矩形位置
列表框发给父窗口WM_COMMAND消息
有样式LBS_NOTIFY,才能发LBN_DBLCLK,LBN_SELCHANGE,LBN_SELCANCEL。
通知码 | 消息映射宏 |
---|---|
LBN_SETFOCUS | ON_LBN_SETFOCUS |
LBN_KILLFOCUS | ON_LBN_KILLFOCUS |
LBN_ERRSPACE | ON_LBN_ERRSPACE |
LBN_DBLCLK | ON_LBN_DBLCLK |
LBN_SELCHANGE | ON_LBN_SELCHANGE |
LBN_SELCANCEL | ON_LBN_SELCANCEL |
LBN_CLICKED | ON_LBN_CLICKED |
3.静态框CStatic
风格:
SS_LEFT:
SS_LEFTNOWORDWRAP
SS_CENTER
SS_RIGHT
SS_SUNKEN
// 画矩形
SS_BLACKFRAME
SS_WHITERECT
…
// 显示图像
SS_BITMAP// 其后用SetBitmap
SS_ENHMETAFILE// 其后用SetEnhMetaFile
SS_ICON// 其后用SetIcon
SS_CENTERIMAGE 把图像放中间
默认下,静态控件不给父窗口发通知。有 SS_NOTIFY风格后,可发。
通知码 | 消息宏 |
---|---|
STN_CLICKED | ON_STN_CLICKED |
STN_DBLCLK | ON_STN_DBLCLK |
STN_DISABLE | ON_STN_DISABLE |
STN_ENABLE | ON_STN_ENABLE |
// 字体枚举
CClientDC dc(this);
::EnumFontFamilies((HDC)dc, NULL, (FONTENUMPROC)EnumFontFamProc, (LPARAM)this);
int CALLBACK EnumFontFamProc(ENUMLOGFONT *lpelf, NEWTEXTMETRIC *lpntm, int nFontType, LPARAM lParam);
4.CEdit类
CEdit只能输入60KB文本,超过时可以考虑CRichEdit。
SetRect
SetRectNP
SetMargins – 像素单位的左右边宽度
LimitText
SetLimitText
风格:
ES_LEFT
ES_CENTER
ES_RIGHT
ES_AUTOHSCROLL
ES_AUTOVSCROLL
ES_MULTILINE
ES_LOWERCASE
ES_UPPERCASE
ES_PASSWORD
ES_READONLY
ES_NOHIDESEL
ES_WANTRETURN 多行编辑控件中用回车插入换行符
SetWindowText
GetWindowText
ReplaceSel
FmtLines(BOOL) // 为TRUE时,每行以两个回车符+一个换行符结束。
用户按下回车键,产生 一个回车符+一个换行符
实际存入缓冲区字节数 GetLine(从0开始的索引号,缓冲区地址,字节数)
LineLength
GetLineCount// 没有文本时也返回1
Clear
Cut
Copy
Paste
Undo
CanUndo
EmptyUndoBuffer
GetSel
SetSel(nStart, nEnd, BOOL)// 区间是[nStart, nEnd)
LineIndex 接收基于0的行号,返回改行首个字符的索引号
LineFromChar 基于字符索引号,计算行号
编辑控件通知码 | 消息宏 | 说明 |
---|---|---|
EN_UPDATE | ON_EN_UPDATE | 控件文本将被修改 |
EN_CHANGE | ON_EN_CHANGE | |
EN_KILLFOCUS | ON_EN_KILLFOCUS | |
EN_SETFOCUS | ON_EN_SETFOCUS | |
EN_HSCROLL | ON_EN_HSCROLL | |
EN_VSCROLL | ON_EN_VSCROLL | |
EN_MAXTEXT | ON_EN_MAXTEXT | 输入字符数已到达设置的最大容量或插入符位于格式化矩形最右最低面 |
EN_ERRSPACE | ON_EN_ERRSPACE | 内存错误 |
5.组合框CComboBox
类型:
CBS_SIMPLE
CBS_DROPDOWN
CBS_DROPDOWNLIST
CBS_AUTOHSCROLL
CBS_DISABLENOSCROLL
CBS_HASSTRINGS
CBS_LOWERCASE
CBS_UPPERCASE
CBS_NOINTEGRALHEIGHT 避免组合框高度为项目高度的整数倍
CBS_OWNERDRAWFIXED
CBS_OWNERDRAWVARIABLE
CBS_SORT
AddString
InsertString
LimitText
GetWindowText
SetWindowText
GetLBText // 用从0开始的索引号检索对应的文本
GetLBTextLen // 返回项目字符长
ShowDropDown // 隐藏显示下拉列表
GetDroppedState // 下拉列表是否被显示
通知码 | 消息宏 | 说明 |
---|---|---|
CBN_DROPDOWN | ON_CBN_DROPDOWN | 下拉列表显示时 |
CBN_CLOSEUP | ON_CBN_CLOSEUP | 下拉列表关闭时 |
CBN_DBLCLK | ON_CBN_DBLCLK | 项被双击时 |
CBN_SELCHANGE | ON_CBN_SELCHANGE | 选项被修改时 |
CBN_SELENDOK | ON_CBN_SELENDOK | 选中时 |
CBN_SELENDCANCEL | ON_CBN_SELENDCANCEL | 取消时 |
CBN_EDITUPDATE | ON_CBN_EDITUPDATE | 编辑控件中文本要更改时 |
CBN_EDITCHANGE | ON_CBN_EDITCHANGE | 编辑控件中文本已更改时 |
CBN_KILLFOCUS | ON_CBN_KILLFOCUS | |
CBN_SETFOCUS | ON_CBN_SETFOCUS | |
CBN_ERRSPACE | ON_CBN_ERRSPACE |
6.滚动条CScrollBar
SBS_VERT
SBS_HORZ
::GetSystemMetrics // SM_CXVSCROLL , SM_CYHSCROLL
SBS_LEFTALIGN
SBS_RIGHTALIGN
SBS_TOPALIGN
SBS_BOTTOMALIGN
不同于其它传统控件,滚动条不发送WM_COMMAND,而发送WM_VSCROLL,WM_HSCROLL.
GetScrollPos
SetScrollPos
GetScrollRange
SetScrollRange
SetScrollInfo
GetScrollInfo
7.控件进阶
1.用基础控件做基类,实现定制化
2.自绘列表
3.
CCheckListBox
CDragListBox
CBitmapButton
4.
WM_CTLCOLOR–>OnCtlColor 控件给父窗口发送,用来设置控件文本色,背景色。
5.消息反射:目的消息的处理在控件派生类中处理
class CColorStatic : public CStatic
{
public:
CColorStatic();
protected:
CBrush m_brRedBrush;
afx_msg HBRUSH CtlColor(CDC *pDc, UINT nCtlColor);
DECLARE_MESSAGE_MAP()
};
///////////////////
BEGIN_MESSAGE_MAP(CColorStatic, CStatic)
ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()
CColorStatic::CColorStatic()
{
//
}
HBRUSH CColorStatic::CtlColor(...)
{
//
}
消息反射提供了一种可以在派生控件内自身来处理原本需要有父窗口处理事项的 机制。
消息反射宏 |
---|
ON_CONTROL_REFLECT |
ON_NOTIFY_REFLECT |
ON_UPDATE_COMMAND_UI_REFLECT |
ON_CTLCOLOR_REFLECT |
ON_DRAWITEM_REFLECT |
ON_MEASUREITEM_REFLECT |
ON_COMPAREITEM_REFLECT |
ON_DELETEITEM_REFLECT |
ON_CHARTOITEM_REFLECT |
ON_VKEYTOITEM_REFLECT |
ON_HSCROLL_REFLECT |
ON_VSCROLL_REFLECT |
ON_PARENTNOTIFY_REFLECT |