有人可以给我解析一下 GetDlgItem() 使用时,有什么要注意的?窗口指针CWnd* 与 窗口句柄HWND* 有什么分别?

strongerman 2003-04-07 07:22:44
GetDlgItem() 有以下原型:

CWnd::GetDlgItem

CWnd* GetDlgItem( int nID ) const;
void CWnd::GetDlgItem( int nID, HWND* phWnd ) const;

但是看不明白:窗口指针CWnd* 与 窗口句柄HWND* 有什么分别?
...全文
247 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
strongerman 2003-04-08
  • 打赏
  • 举报
回复
void CCtrltest1Ctrl::testadd()
{
AfxMessageBox("You are in Event - addtest ");
CWnd* pwnd=GetParentOwner();//这个是成功了,但不合要求,是顶层窗口指针
//CWnd* pwnd=GetOwner();//以下不知得到的是什么指针,编译器说不是一个window
//CWnd* pwnd=GetParent();
//CWnd* qwnd=pwnd->GetDlgItem(IDC_EDIT1);
//(pwnd->GetDlgItem(IDC_EDIT1))->EnableWindow(FALSE);
CString cs;
pwnd->GetWindowText(cs);
AfxMessageBox(cs);
//pwnd->EnableWindow(FALSE);
//pwnd->GetDlgItem(IDC_EDIT1);
//qwnd->EnableWindow(FALSE);
}


如果还不够清楚我还可以解释
webber84 2003-04-08
  • 打赏
  • 举报
回复
用GetParent会能不过编译?你怎么用的啊?
strongerman 2003-04-08
  • 打赏
  • 举报
回复

To: webber84(***闭关修炼中***)

那怎样得到 控件的父窗口的指针 急切想知道样板!
我用过:GetParent,GetOwner,GetParentOwner,FindWindow
结果只有GetParentOwner可以通过编译,但只是得到了最顶层的窗口的指针,我想要的是上一级窗口的指针?!?!?!?!?!
webber84 2003-04-07
  • 打赏
  • 举报
回复
先要得到控件的父窗口的指针,再用这个指针来调用GetDlgItem
strongerman 2003-04-07
  • 打赏
  • 举报
回复

Thank you In355Hz(好象一条狗),

我还有另一个问题:

我在 自制的 ActiveX 里 想获得ActiveX控件容器的其它常规控件的指针;如编辑框(IDC_EDIT1),从而操纵这些控件的行为。用GetDlgItem(IDC_XX)时老出现错误……

我是 在ActiveX控件类的内部调用GetDlgItem(IDC_XX),想得到控件外面的其它常规控件指针,这个想法有错吗?还是要先获得父窗口的指针,再去调用GetDlgItem(IDC_XX)呢?
In355Hz 2003-04-07
  • 打赏
  • 举报
回复
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。

KcSoft 2003-04-07
  • 打赏
  • 举报
回复
CWnd是封装了HWND。
CWnd* pDlg=GetDlgItem(IDC_XX);
一般检查一下pDlg是否为空,尽量不要直接使用。
比如:GetDlgItem(IDC_XX)->SetWinWindowText("text")是不安全的。
maoxianwang 2003-04-07
  • 打赏
  • 举报
回复
美个窗口都有一个32位的标识服

就是HWND类型大,CWnd类型我不知道是什么东西啦嘿嘿嘿

就是一个累呀哈哈,,我瞎说的,高人快舅命呀

16,473

社区成员

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

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

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