1. 静态控件的作用以及创建:
1) 静态控件一般只用来标记其它控件,有文本、矩形和图像三大类;
2) 创建静态控件还是使用Create函数;
3) 不管哪种类型的控件,Create的时候WS_CHILD和WS_VISIBLE都不可少;
2. 文本静态控件:
1) 其可选的dwStyle样式有:都以SS_开头,即Static Style的缩写
SS_LEFT:左对齐
SS_RIGHT:右对齐
SS_CENTER:水平居中
!!以上是三个都会在文本过长一行放不下的时候换行
SS_LEFTNOWORDWRAP:如果文本太长一行放不下则不会换行
!在垂直方向上,默认情况是上边对齐
SS_CENTERIMAGE:垂直居中
SS_SUNKEN:画一个下陷边缘
2) 文本内容:
i. 在Create的时候,第一个参数lpszText就可以初始化文本内容了;
ii. 也可以使用CWnd的SetWindowText函数来修改:void CWnd::SetWindowText(LPCTSTR lpszString);
iii. 也可以使用CWnd的GetWindowText函数来获取文本内容:有两个版本,一个是C串,一个是CString
a. int CWnd::GetWindowText(LPTSTR lpszStringBuf, int nMaxCount);
!nMaxCount表示最多接收多少个字符,返回值表示实际介绍的字符数量;
b. void CWind::GetWindowText(CString& rString) const; // 简单,直接传引用
!!SetWindowText和GetWindowText操作的对象都是窗口的标题,可以见得控件的文本就直接是子窗口控件的标题了!!
iv. 当空间自身的函数不够用的时候就尝试看一下基类的函数,说不定会有你想要的!!
3. 矩形:
1) 指定为矩形控件后就只能显示矩形,即使使用SetWindowText或在Create指定文本也不会显示;
2) 其可选的dwStyle:
三色矩形:其中XXX可以是BLACK、WHITE、GRAY
SS_XXXFRAME:用系统色画空心矩形框
SS_XXXRECT:用系统色画实心矩形
蚀刻效果:
SS_ETCHEDHORZ:顶边和底边蚀刻的空心矩形
SS_ETCHEDVERT:左右边蚀刻的空心矩形
4. 图像:
1) 首先需要确定图像的类型:dwStyle中指定
SS_BITMAP:位图
SS_ENHMETAFILE:ENH元文件
SS_ICON:图标或光标
!!和矩形类似,既然不是用来显示文字的,可以给lpszText传_T(""),即使传了文字也不会显示,除非你想留一点说明给开发者看;
2) 创建好后,就将相应的图像传给控件,使用SetBitmap、SetEnhMetaFile、SetIcon、SetCursor函数即可;
3) 图像的位置和大小:
i. 默认情况下图像位于控件左上角;
ii. 默认情况下如果图像大于控件尺寸则控件会自动扩大以适应图像;
iii. 如果希望图像居中显示,则在dwStyle中添加SS_CENTERIMAGE,但是该标记会取消控件自动缩放以适应图像大小的功能,在这种方式下就一定要确保控件尺寸足够大以适应图像;
iv. 对于SS_ENHMETAFILE类型的元文件,控件放缩不是问题,因为元文件可以自动放缩自己来适应控件大小;
v. 可能会经常使用SS_SUKEN来为图像添加一个下陷边框;
5. 通知消息:
1) 静态控件最多的用途就是为其它控件作标记,但是有时也希望它能像其它控件一样相应消息;
2) 要使静态控件相应消息必须在dwStyle添加SS_NOTIFY样式使之可以产生通知;
3) 通知主要有四种类型:以STN_打头,即Static Nofity的缩写
STN_CLICKED:控件单击
STN_DBLCLK:控件双击
STN_DISABLE:失效
STN_ENABLE:有效
4) 示例:
m_wndStatic.Create(_T("Click me to destroy!"), WS_CHILD | WS_VISIBLE | SS_CENTER | SS_CENTERIMAGE | SS_NOTIFY | SS_SUNKEN, rect, this, IDC_STATIC); void CMainWindow::OnClickedStatic() { m_wndStatic.PostMessage(WM_CLOSE, 0, 0); }!这里创建了一个水平、垂直居中的文本静态控件,并且可以产生通知,具有下陷边框;
!当点击它的时候它会自动向自己发出关闭消息(控件也是一种窗口),将自己销毁,从而在父窗口中小时,最直接的视觉变化就是文本被抹掉了;
!控件的击中测试:控件的击中测试基本都属于非客户区击中测试WM_NCHITTEST,像静态控件、按钮等,因为它里面的文本本身就属于窗口标题,窗口标题不属于客户区,这些控件基本也没有客户区;
!因此击中测试完成后,如果没有定义通知响应则会将击中测试的消息传递给父窗口来处理了;