MFC Windows程序设计学习笔记--控件

控件属于子窗口,父窗口移动时,子窗口也移动。父窗口销毁时,子窗口也销毁。

控件类型WNDCLASSMFC类
按钮“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);// 从左开始将制表位设在324864128个对话框单位的地方

// 大量重绘没效率,可在最后重绘
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_SETFOCUSON_LBN_SETFOCUS
LBN_KILLFOCUSON_LBN_KILLFOCUS
LBN_ERRSPACEON_LBN_ERRSPACE
LBN_DBLCLKON_LBN_DBLCLK
LBN_SELCHANGEON_LBN_SELCHANGE
LBN_SELCANCELON_LBN_SELCANCEL
LBN_CLICKEDON_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_CLICKEDON_STN_CLICKED
STN_DBLCLKON_STN_DBLCLK
STN_DISABLEON_STN_DISABLE
STN_ENABLEON_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_UPDATEON_EN_UPDATE控件文本将被修改
EN_CHANGEON_EN_CHANGE
EN_KILLFOCUSON_EN_KILLFOCUS
EN_SETFOCUSON_EN_SETFOCUS
EN_HSCROLLON_EN_HSCROLL
EN_VSCROLLON_EN_VSCROLL
EN_MAXTEXTON_EN_MAXTEXT输入字符数已到达设置的最大容量或插入符位于格式化矩形最右最低面
EN_ERRSPACEON_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_DROPDOWNON_CBN_DROPDOWN下拉列表显示时
CBN_CLOSEUPON_CBN_CLOSEUP下拉列表关闭时
CBN_DBLCLKON_CBN_DBLCLK项被双击时
CBN_SELCHANGEON_CBN_SELCHANGE选项被修改时
CBN_SELENDOKON_CBN_SELENDOK选中时
CBN_SELENDCANCELON_CBN_SELENDCANCEL取消时
CBN_EDITUPDATEON_CBN_EDITUPDATE编辑控件中文本要更改时
CBN_EDITCHANGEON_CBN_EDITCHANGE编辑控件中文本已更改时
CBN_KILLFOCUSON_CBN_KILLFOCUS
CBN_SETFOCUSON_CBN_SETFOCUS
CBN_ERRSPACEON_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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

raindayinrain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值