MFC某个对话框的ID为DID_DIALOG1,创建多个对话框,GetDlgItem获取的句柄指向谁呢

如题所述

您好,VC中编程,最大的障碍和问题就是消息机制和指针获取与操作。其实这些内容基本上是每本VC学习工具书上。
必讲的内容,而且通过MSDN很多问题都能解决。
下面文字主要是个人在编程中指针使用的一些体会,说的不当的地方请指正。
一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,无论是多文档还是单文档,都存在指针获取和操作问题。
下面这节内容主要是一般的框架,然后再讲多线程中的指针使用。使用到的类需要包含响应的头文件。首先一般获得本类(视,文档,对话框都支持)实例指针this,用this的目的,主要可以通过类中的函数向其他类或者函数中发指针,以便于在非本类中操作和使用本类中的功能。
这其中的关键在于理解 m_pMainWnd, AfxGetApp(),AfxGetMainWnd() 的意义!
1) 在View中获得Doc指针
CYouSDIDoc *pDoc=GetDocument();一个视只能有一个文档。
2) 在App中获得MainFrame指针
CWinApp 中的 m_pMainWnd变量就是MainFrame的指针,也可以: CMainFrame *pMain =(CMainFrame *)AfxGetMainWnd();
3) 在View中获得MainFrame指针
CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;
4) 获得View(已建立)指针
CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;
CyouView *pView=(CyouView *)pMain->GetActiveView();
5) 获得当前文档指针
CDocument * pCurrentDoc =(CFrameWnd *)m_pMainWnd->GetActiveDocument();
6) 获得状态栏与工具栏指针
CStatusBar * pStatusBar=(CStatusBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);
CToolBar * pToolBar=(CtoolBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);
7) 如果框架中加入工具栏和状态栏变量还可以这样
(CMainFrame *)GetParent()->m_wndToolBar;
(CMainFrame *)GetParent()->m_wndStatusBar;
8) 在Mainframe获得菜单指针
CMenu *pMenu=m_pMainWnd->GetMenu();
9) 在任何类中获得应用程序类
AfxGetInstanceHandle 得到句柄,AfxGetApp 得到指针
B1.如何在自己的类和“应用程序类”中获得“文档类”的句柄?
SDI AfxGetMainWnd() -> GetActiveView() -> GetDocument() 得到指针
MDI AfxGetMainWnd() -> MDIGetActive() -> GetActiveView() -> GetDocument() 得到指针
B3.如何在“框架类”中获得“文档类”句柄?
SDI GetActiveView() -> GetDocument() 得到指针,MDI MDIGetActive() -> GetActiveView() -> GetDocument() 从 CMainFrame 得到指针,GetActiveView() -> GetDocument() 从 CChildFrame 得到指针
B4.如何在“视图类”中获得“文档类”句柄?
GetDocument()
C1.如何在“文档类”中获得“视图类”句柄?
GetView(),调用 GetFirstViewPosition 和 GetNextView 函数得到指针。
C2.如何在自己的类和“应用程序类”中获得“视图类”句柄?
SDI GetActiveView 得到指针
MDI MDIGetActive() -> GetActiveView() 从 CMainFrame 得到指针,GetActiveView 从 CChildFrame 得到指针

最后提醒大家,在提取到各个句柄之后,因为初次提取的都是标准类句柄,所以,在使用时要注意将标准句柄转换成自己的类的句柄。
如:
AfxGetApp();//得到的是WinApp类的句柄,
所以操作前记得转换成自己定义的类的句柄。
温馨提示:内容为网友见解,仅供参考
无其他回答

MFC某个对话框的ID为DID_DIALOG1,创建多个对话框,GetDlgItem获取的句柄...
9) 在任何类中获得应用程序类 AfxGetInstanceHandle 得到句柄,AfxGetApp 得到指针 B1.如何在自己的类和“应用程序类”中获得“文档类”的句柄?SDI AfxGetMainWnd() -> GetActiveView() -> GetDocument() 得到指针 MDI AfxGetMainWnd() -> MDIGetActive() -> GetActiveView() -> GetDocument() 得到...

在MFC中,我创建了2个对话框,ID:IDD_MY_DIALOG1;IDD_MY_DIALOG2;
GetDlgItem使用来获得一个对话框上空间的句柄1 所以建议还是DOMODAL吧,否则出了编译错误就是运行报错

MFC中怎样获取指定窗口的句柄
获取窗口中 控件的句柄,用 GetDlgItem语法为:GetDlgItem(IDC_COMBO3)->m_hWnd :参数为 该控件的ID,返回值为:CWnd* 类型,但它是CWnd类内的函数,因此要先获取控件所在窗口的指针,如:CString str(_T("dd"));::SendMessage(AfxGetMainWnd()->GetDlgItem(IDC_COMBO3)->m_hWnd, WM_SETTEXT ,...

GetDlgItem的用法
GetDlgItem函数用于获取对话框中控件的句柄。它允许程序员通过控件的标识符(ID)来访问和操作该控件。这个函数是在Windows编程中常用的,特别是在使用C++和WinAPI进行桌面应用程序开发时。在使用GetDlgItem之前,你需要有一个有效的对话框句柄。对话框句柄通常是通过调用CreateDialog或CreateDialogParam等函数来创...

MFC中关于句柄的问题
你的错误不在句柄,而是GetDlgItem函数使用错误。这个函数只能获取对话框内的控件指针,不能获取另一个对话框指针。至于你如何从CDlg2获取对话框1的指针,没有窗口关系无法给出合理解答。你必须通过合理的窗口关系,获取实际对话框指针。

怎么获得任一窗口的指针?
你创建的IDD_Dialog1对话框,调用的实例如果是dlg 就用dlg.GetDlgItem(控件ID)如果实例是指针,就用dlg->GetDlgItem(控件ID)还有一个更加万能的方法,就是从桌面开始一层一层的找你要找的窗口句柄,提供一段代码供参考:hWnd= ::GetWindow( ::GetDesktopWindow(), GW_CHILD );while ( hWnd != ...

请问MFC中子对话框怎么控制父对话框中的控件?
你在创建子窗口的时候可以通过构造函数把父窗口的指针传给子窗口,比如:CDlg m_Dlg(this);也可以在子对话框中用GetParent函数即时获取父窗口的指针或者窗口句柄;通过获取到的指针或者窗体句柄就可以控制父窗口的控件了。但通常的做法是获取父窗口的指针\/句柄后给父窗口发个消息,让其在消息响应函数中做...

HWND hwnd1 = GetDlgItem(IDD_DIALOG1)->m_hWnd;返回句柄为空
必须得先建立对话框资源与自己的对话框派生类的关联,该函数通过遍历关联关系的链来返回与ID相应Cwnd指针

MFC关于Radio Button控件的问题 高分悬赏!!敬请指点
首先每一个控件都必须有特定的ID号,所有控件都是,包括静态文本控件,所有ID号都不能一样 在对话框类的OnInitDialog函数中添加如下代码:CButton* pButton=(CButton*)GetDlgItem(IDC_RADIO1); \/\/假设按钮TypeA的ID为IDC_RADIO1 pButton->SetCheck(1);以上两句是得到单选按钮TypeA的句柄,然后用...

getdlgitem的用法
1. 确保对话框已经创建并且处于激活状态,否则无法正确获取控件句柄。2. 确保提供的控件ID是有效的,否则函数会返回NULL。3. 在使用完控件句柄后,要注意释放资源,避免内存泄漏。四、应用场景 GetDlgItem在创建自定义对话框时非常有用,特别是在需要与用户进行复杂交互的场合。通过GetDlgItem获取控件句柄,...

相似回答