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

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()是获得与线程相依附的主窗口,在回调函数中无法获得获得想要的主窗口

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值