新手求教大虾!

wt007 2000-07-28 02:23:00
1:我要在对话框中动态创建按钮控件,并在对话框销毁时销毁该控件。
我不用new操作符,也不用全局变量,而是在oninitdialog中定义一个局部变量,创建并显示该控件,在函数末尾用Detach()。但运行时却出错。
然而,非窗口控件却可以Detach()(菜单也可以)。
这是为什么?谁能告诉我Detach()的用法(具体场合,注意事项等)?
2:消息在windows中是怎样路由的?比如对话框中有一个button,它的点击事件消息是由windows直接传递给它,还是由其父窗口dispatch给它的?

...全文
184 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
haitian99 2000-08-07
  • 打赏
  • 举报
回复
To Wt007 :
首先, 你的理解中,关于C++ Object 和Win9x 的Handle 的这一部分是正确的.
但是, 关于 Stack 和 Heap, 我不知道你是怎么理解的.
(1) CButton mybtn;
mybtn.Create()
Create所建立的Button数据是存储在栈中的,当mybtn 的生命期结束时刻( OnInitDialog()结束 ),这些数据已经消失,虽然你用了Detach() ,但是Win9x 怎么能够访问销毁的数据?

(2) CButton* pmybtn;
pmybtn= new CButton;
pmybtn->Create()
Create所建立的Button数据是存储在堆中的,除非你用delete,该数据一直存在.所以这时,不管你是否Detach(),Win9x 总能使用这些数据.所以这时可以显示出button.

但是,当对话框结束后,刚才动态Create()的BUTTON是要delete的.如果 pmybtn 是在
OnInitDialog()中定义的一个自动变量,指向堆中数据的这个指针已经被销毁,如何delete
这块内存. 如果不销毁的话,就会产生所谓的内存泄漏.
所以要把 CButton* pmybtn 定义为类的成员变量.

(3) 动态创建的控件,要具有WS_VISIBLE 属性,否则要调用ShowWindow() 才能把他显示出来.

(4) 所以使用Detach(),还有使用 HANDLE, 就要保证HANDLE 指向的数据是有效的,在其生命器的.









wt007 2000-08-07
  • 打赏
  • 举报
回复
看来这里的高手们都不屑于回答这么“简单”的问题?!
zhangdl 2000-07-28
  • 打赏
  • 举报
回复
好像 Inside Visual C++ 上面讲了一些这方面的内容,我回去看看
wt007 2000-07-28
  • 打赏
  • 举报
回复
TO zzh:
你应该知道,c++对象和windows对象是不同的,两者通过句柄映射建立联系,detach()的作用正是取消这种联系,我的理解错了吗?
你的方法我也会,我只是想求教detach()的用法。
不过,谢谢你!
给鼓励分!
wt007 2000-07-28
  • 打赏
  • 举报
回复
TO Jackzhu:
在MSDN中说“Detach()用于断开C++对象和WINDOWS对象的连接(删除C++对象中的HANDLE),以避免局部变量的析构导致WINDOWS对象的销毁”。事实上,如果在我的对话框中有一个picture控件,我将一幅位图加载给它,而用于加载位图资源的是一个局部变量。在函数的末尾,如果不调用Detach(),则该变量的析构将使windows对象自动销毁,结果是,位图在刚被显示了几分之几秒后就被销毁了。但如果调用了Detach(),则位图仍然显示在picture中。我的意思是:为什么cbitmap对象可以调用detach(),而cbutton对象调用的时候就会出错呢?
无论如何,谢谢你的回答!
给分!
zzh 2000-07-28
  • 打赏
  • 举报
回复
如果不设置为该对话框类变量,你只在OnInitDialog中声明一个局站变量,当OninitDialog函数结束时,不就操作完成了吗,控件空件也被释放。
.h
CButton *m_pButton;
构造函数
m_pButton=NULL;
OnInitDialog;
m_pButton=new CButton();
m_pButton.Create();
加入自己想控制的风格。
在析构函数中删除。
Jackzhu 2000-07-28
  • 打赏
  • 举报
回复
你不new,他岂不自动析构了。应设为成员变量或new,再create.
消息直接传递给当前激活的窗口了,被该窗口函数捕获了。

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧