首页 > 编程知识 正文

mfc选择文件夹对话框(mfc窗口创建过程)

时间:2023-05-05 08:31:59 阅读:64172 作者:2163

使用GetDlgItem函数访问对话框中的控件。

1 )函数原型(cwnd * cwnd :3360 getdlgitem (int NID ) const;

2 )指定访问参数的控件的ID可以返回该控件的指针,但注意返回的是CWnd*类型的指针,是所有窗口类型的父类。

安全地使用GetDlgItem返回的指针访问控件:

1 )如果想访问的是CWnd上的功能,则什么都不用做就可以直接访问。 示例:

cwnd*pwnd=getdlgitem(IDC_check ); 启用pwnd-enable窗口(true; 启用控件(或窗口)的函数EnableWindow直接从CWnd继承,因此无需任何处理即可放心使用;

2 )拙劣、危险的使用方法——强的类型转换:

I .如果要访问控件特定的功能,请尝试将GetDlgItem返回值强制转换为与控件对应的类型。 示例:

clistbox*plistbox=(clistbox* ) getdlgitem(IDC_list ); plistbox-addstring(_t('one ) ); ii .上面的代码之所以能够执行,是因为MFC特别支持类似CListBox的控件。 更改为其他东西(例如CComboBox )将无效。

iii .绝对不建议通过这种方法访问控件的特有功能。 因为MFC不太支持这种用法,在某些情况下会发生严重错误,在某些情况下没有任何效果。

3 )使用——控件类型的Attach函数绑定对话框中的控件,该函数临时访问本地范围内的控件:

I .假设:通过在对话框中的类中将空控件类型的对象定义为数据成员,然后使用这些对象的Attach函数绑定空对象和对话框中的控件资源,可以实现此目的

ii .例如:

CListBox m_wndListBox; m _ wnd listbox.attach (getdlgitem (IDC _ list )-m_hWnd ); m_wndlistbox.addstring(_t ) ' one ); m_wndListBox.Detach (; 注:如果在本地函数中定义了这样的对象,则必须在使用后解除绑定。 否则,控件资源将与对象一起释放,对话框中的控件将突然消失。

! Attach和Detach都是从CWnd继承的。 请注意,Attach的参数是HWND类型,因此将控件的m_hWnd作为参数传递。

! 这种方法仍然不是最优先推荐的。 因为本地函数中临时访问控件的次数最多,所以Attach始终带有Detach。 如果绑定对象主体是窗口的数据成员,则Attach必须放在对话框的构造函数中使用,而Detach必须放在对话框的构造函数中使用。 这有问题。 这只是一个库,在其他人不知道的情况下用某个本地函数再次Attach,也就是说,如果重复绑定,就会导致运行时错误(不能重复绑定和解除绑定),因此该方法在本地函数中使用控制器

! 所以,上面的构想不好!

4 )控件编程对话框中数据成员的完整解决方案——DDX_Control :

I .为实现上述构想,MFC提供了完善的解决方案,上述构想中定义的空空间类成员m_wndXXX在DoDataExchange中通过DDX_Control和相应的对话框控件资源完美安全地联系在一起

ii .函数原型: voidafxapiddx _ control (CDATA exchange * pdx,int nID,CWnd rControl );

iii .使用案例:

//对话框派生类中相应的控件类对象class cmy dialog :公共cdialog { . clistbox m _ wnd listbox; //然后,在DoDataExchange函数中使用DDX_Control将对象和控制资源绑定到voidcmydialog 3360: dodataexchange (CDATA exchange * pdx 5 )添加DDX_Control功能:

如果要在对话框中使用自己的控件(例如,使用CListBox派生具有自己功能的列表框并将其添加到对话框中),则在资源脚本. rc文件中存在一些无法定义的重要问题。 rc只能定义MFC预定义的控件。

ii.DDX_Control现在可以完美地解决这个问题。 rc以相同的方式定义常规类型的基本控件,对话框以相同的方式定义自定义控件类型的对象(例如CMyListBox m_wndMyListBox ),最后使用ddx_control

iii .这是DDX_Control的附加功能,可以将资源脚本中定义的常规控件向下扩展到自定义类型的派生类对象。 这不仅是类型的向下扩展,而且在功能上也是彻底向下扩展

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。