CDialog::OnInitDialog() 及“试图执行系统不支持的操作”

来源:互联网 发布:网络下载速度很不稳定 编辑:程序博客网 时间:2024/06/05 04:28

BOOL CmapfileDlg::OnInitDialog()
{
CDialog::OnInitDialog();

。。。。。。。

}

作用:是响应WM_INITDIALOG消息的处理函数.
声明:OnInitDialog()说明:
这里主要说明一个它与构造函数的一些相同点和不同点.
相同点:
都可以进行初始化的工作.
不同点:
InitDialog是响应WM_INITDIALOG消息的函数.构造函数,是当你对一个对象实例话的时候,调用的函数. 在这里,构造函数早于InitDialog的调用。
构造函数:对话框还不存在,使用hwnd之类的东西会不管用
InitDialog:对话框已存在.而且如果你初始话时需要分配很大的内存,那么放在OnInitDialog()会更合适。
控件的初始化要放在OnInitDialog
普通成员变量的初始化可以放在构造函数中

但是它的return TRUE与return FALSE有什么区别呢?
MSDN上面:
Return Value
Specifies whether the application has set the input focus to one of the controls in the dialog box. If OnInitDialog returns nonzero, Windows sets the input focus to the first control in the dialog box. The application can return 0 only if it has explicitly set the input focus to one of the controls in the dialog box.
至于应用场合:假设这个Dialog上要求输入内容,如果dialog一弹出来就自动把输入焦点放在第一个编辑框上不就很方便嘛,可以直接输入内容了。这时候OnInitDialog()就需要返回TRUE。
个人总结是:当返回TRUE时表明Windows自动的将输入焦点置于序列上排第一的 某个空件上;而当返回FALSE时只是表明你将输入焦点人为的改变在其他的某个控件上。

问题:CDialog::OnInitDialog() 遇到错误 弹出 “试图执行系统不支持的操作“

有百分之八十的原因是你使用了一个资源,比如一个EDIT,同时你又在类中建了一个成员,如CEdit m_editTest;但是现在你把这个EDIT删除了,而m_editTest却没有删除。你只要在ClassWizard中找到这个定义,将其删除就一切OK了。

虽然屏蔽CDialog::OnInitDialog() 这一句话可以让程序通过编译,但是会导致一系列BUG

比如:

1.

((CTabCtrl*)GetDlgItem(IDC_TAB1))->InsertItem(0,"WMS本地");

// CTab.InsertItem(0,"WMS本地"); //屏蔽后,如此添加标签有错,必须如上所示方法使用
((CTabCtrl*)GetDlgItem(IDC_TAB1))->InsertItem(1,"WFS在线");

2.TABCTRL控件的切换

if(CTab.GetCurSel() == 0)
{
WMS_Page.ShowWindow(SW_SHOW);
WFS_Page.ShowWindow(SW_HIDE);
}
else if (CTab.GetCurSel() == 1)
{
WFS_Page.ShowWindow(SW_SHOW);
WMS_Page.ShowWindow(SW_HIDE);
}
//屏蔽会导致按标签切换时出错

CDialog::OnInitDialog() 初始化之后,一些定义的控件变量(即对象名如:CTab)可用。否则就必须像下面的用法

((CTabCtrl*)GetDlgItem(IDC_TAB1))->InsertItem(0,"WMS本地"); //((CTabCtrl*)的作用是告诉那种控件调用的GetItem()。返回该控件的句柄后,才能使用其相关函数(如:InsertItem())

AfxGetMainWnd()->m_hWnd,AfxGetMainWnd()是获得与线程相依附的主窗口,在回调函数中无法获得获得想要的主窗口