| 发表于:2007-03-19 14:00:03 楼主 |
cwnd*和hwnd差别很大 hwnd是sdk定义的类型,是一个无确切意义的32-bit值,在调用api时用于指代窗体。 cwnd*是一个有确切意义的指针,指向一个mfc窗体类cwnd的实例。因为mfc对sdk做了封装,大部分调用都可以用cwnd*作为参数,所以很容易混淆。从一个cwnd*获取句柄的方法是pwnd-> getsafehwnd(),他比 pwnd-> m_hwnd安全,因为前者在pwnd == null的时候返回null而后者出现access violation 从hwnd转换到 cwnd* 一个可以使用的方法是cwnd::fromhandle cwnd *ptempwnd = cwnd::fromhandle(hwnd); // 如果 hwnd 存在对应的 cwnd*,则返回其指针,否则,创建一个 mfc 临时窗体并返回其指针。 注意这个函数会返回临时窗体的指针,如果需要更安全,调用cwnd::fromhandlepermanent,他在不存在对应的cwnd*时返回null。 我写了一个类从cwnd派生,名为cmywnd,这里面有我的自定义消息处理函数,我希望能用sendmessage发送消息给cmywnd类对象。如:sendmessage(m_powner-> m_hwnd, wm_comm_rxchar, (wparam) rxbuff, (lparam) port-> m_nportnr); 但是cmywnd对象创建后,其成员m_hwnd句柄为null,这样的话就不能sendmessage了,这样的话我应该怎么办。 我在cmywnd构造函数中强制让类对象指针跟句柄相关联:如: cmywnd::cmywnd() { //create() attach((hwnd)0x1001ffce); m_hwnd = (hwnd)0x1001ffce; } 但是这样也不行. 最后上msdn才把问题解决了,因为在创建对像后,还要用create产生窗口,才使句柄有效。然后你就可以在 m_hwnd 中控制它了。 最后就加了一句: m_mywnd.create(null, "aa ",ws_child,crect(0,0,0,0),this,1,null);就可以了。 chinaunix blog |
|
|
|
|