对话框基础复习一 2011.4.21
对话框有两种:
一种是模态对话框(Modal['məudl]),其中模态对话框显示时候,程序的其他的在对话框之外都不可操作,只有关闭了模态对话框才可以继续操作,例如文本工具的“打开对话框”。
一种是非模态对话框(Modeless),非模态对话框跟用户对程序其他操作没有影响,例如文本工具的“查找对话框”。
MFC中对资源的操作都是通过一个与资源相关的类来完成的。
模态对话框用DoModal来显示,非模态对话框用Create来生成,用ShowWindow来显示。
指针是在堆上分配内存的,和程序的整个生命周期一致(假设你不主动注销)。
void CEasyDialogView::OnDialog()
{
// TODO: Add your command handler code here
CTestDlg *pTestDlg = new CTestDlg();
pTestDlg->Create(IDD_DIALOG1, this);
pTestDlg->ShowWindow(SW_SHOW);
}
这样是可以显示出Modaless对话框的,但是,这个函数的生命周期结束之后,pTestDlg销毁了,你就找不到刚才分配出来的内存空间了。
查MSDN可知道,在Modaless对话框的“OK”按钮并不会销毁窗口,要重写OnOK函数在其中加入DestroyWindow才能使得窗口销毁。
其中IDC_STATIC 这个ID号是规定了用来标识一些静态的做标识的文本的,所以在ClassWizard中看不到它,所以要操作的话就要改成其他的ID号。想要静态文本响应鼠标的消息,就要在属性对话框中选中Notify选中。
逗号表达式:用逗号来隔开多个表达式,整个逗号表达式的值就是最后一个表达式的值。
获取一个Item里的文本或数据的信息的函数有如下:
GetDlgItem()->GetWindowText();
GetDlgItemText()
GetDlgItemInt()
可以用 关联控件值(value)变量 来对进行特定的操作,如文本输入框的文本。
直接操作关联的控件值变量是没有效果的,因为没有进行控件的updata操作。
所以要在头尾加上UpdateData(TURE)和UpdateData(FALSE)函数。
UpdateData(TURE)表明当前函数正在获取控件的数据。
UpdateData(FALSE)表名当前函数已经在初始化控件的数据了。
关联控件控制(control)变量 是对控件本身的对象的关联,操作这个变量就是操作了控件的本身,所以不用Update也行。
mfc提供了 DDX - Dialog Data Exchange 对话框数据交换
DDX - Dialog Data Validation 对话框数据校验
这些函数是一DDX_ DDV_作前缀的。
可以用消息来对控件来进行操作。例如:文本框的操作
WM_GETTEXT, WM_SETTEXT
设置文本框的复选部分:EM_GETSEL, EM_SETSEL
①::SendMessage()
②用本身关联的空间控制变量来使用如:m_edit.SendMessage();
③SendDlgItemMessage()直接向Item发送消息
SendMessage 与 PostMessage的区别
PostMessage只负责将消息放到消息队列中,不确定何时及是否处理
SendMessage要等到受到消息处理的返回码(DWord类型)后才继续
PostMessage执行后马上返回
SendMessage必须等到消息被处理后才会返回。
GetWindowRect 是用来获取窗口的矩形区域。
IsRectNull 判断区域是否为空
SetWindowPos/DeferWindowPos 设置窗口的位置
BingWindowToTop 把窗口置于顶层
SetForegroudWindow 设置前台窗口
SetWindowLong 可以用来设置窗口的属性
LONG SetWindowLong(
HWND hWnd, // handle to window
int nIndex, // offset of value to set
LONG dwNewLong // new value
);
当 nIndex 为 GWL_WNDPROC就可以重设一个窗口过程,返回先前的窗口过程,设置一个窗口过程,就可以响应一些别的消息
SetFocus 设置窗口的焦点
GetNextWindow 可以获取下一个窗口的句柄
GetWindow 获取特定关系的窗口句柄,包含上面的
GetNextDlgTabItem 获取下一个 可获取tab键转移的 Item
在控件属性页里 有个 Tab Stop 可以选,转中后就可以转移到这个按键
在 Layout菜单 中的TabOrder 选项选中,就可以设置tab的顺序了,很方便。
编辑框 不选中 多行 MultiLine 是不会响应回车消息的。
在MFC生成的对话框程序里,默认OK 按钮,默认回车按钮的ID就是IDOK(指没有设置DefaultButton的时候)。