MFC在很多的对话框操作中,我们经常要用到在一个对话框中调用另一个对话框的函数或变量.可以用如下方法来解决.
HWNDhWnd=::FindWindow(NULL,_T("Sphere")); //得到对话框的句柄
C***Dialog* pWnd= (C***Dialog*)C***Dialog::FromHandle(hWnd);//由句柄得到对话框的对象指针
pWnd->xxx( ); //调用C***Dialog中的函数xxx();
以上参考:
http://www.cnblogs.com/del/archive/2008/02/28/1085432.html
。
通过窗口类函数:CWnd *GetWindow获得窗口指针,pWnd->m_hWnd(Thehandle of the Windows window attached to this CWnd)在::FromHandle(hWnd);
获取主窗口句柄: CWnd*wnd = AfxGetMainWnd();
HWNDhwnd = wnd->GetSafeHwnd();
设置控件为窗口焦点:GetDlgItem(IDC_TREE1)->SetFocus();
获取控件句柄:HWND hwndctrl =::GetDlgItem(mainHwnd, IDC_TREE1);//获取树形控件的句柄IDC_TREE IDC_COMBO1
获取当前最上层窗口的句柄: HWND mainHwnd= ::GetForegroundWindow();//获取当前topmost的窗口句柄
获取当前窗口的焦点句柄: HWND currentFocus= ::GetFocus();
(一)MFC中获得各个类的句柄总结
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() 得到指针,MDIMDIGetActive() -> GetActiveView() -> GetDocument() 从 CMainFrame 得到指针,GetActiveView() -> GetDocument()从 CChildFrame 得到指针
B4.如何在“视图类”中获得“文档类”句柄?
GetDocument()
C1.如何在“文档类”中获得“视图类”句柄?
GetView(),调用 GetFirstViewPosition 和 GetNextView 函数得到指针。
C2.如何在自己的类和“应用程序类”中获得“视图类”句柄?
SDI GetActiveView 得到指针
MDI MDIGetActive() -> GetActiveView() 从 CMainFrame 得到指针,GetActiveView 从 CChildFrame 得到指针
最后提醒大家,在提取到各个句柄之后,因为初次提取的都是标准类句柄,所以,在使用时要注意将标准句柄转换成自己的类的句柄。如:
AfxGetApp();//得到的是WinApp类的句柄,
所以操作前记得转换成自己定义的类的句柄。
如:((CMyApp*)AfxGetApp())->XXXX();//这的xxxx()就是你定义的类中间的成员。
(二)MFC中句柄、指针、ID之间的转换
win32直接操作的是句柄HANDLE,每个句柄就对应windows窗口,而vc对HANDLE进行类封装,间接操作的都是HANDLE,现在句柄只是类的一个成员变量。
从句柄到指针
CWnd* pWnd=CWnd::FromHandle(hWnd); //a temporary CWnd object iscreated //and attached.
pWnd->Attach(hWnd); //Attaches a Windows window to a CWndobject
从指针到句柄
HWND hWnd=pWnd->GetSafeHandle();
hWnd=pWnd->m_hWnd;
SDK编程中窗口ID,句柄,指针三者相互转换函数
ID--HANDLE--HWND三者之间的互相转换
id->句柄-----------hWnd= ::GetDlgItem(hParentWnd,id);
id->指针-----------CWnd::GetDlgItem();
句柄->id-----------id =GetWindowLong(hWnd,GWL_ID);
句柄->指针--------CWnd *pWnd=CWnd::FromHandle(hWnd);
指针->ID----------id= GetWindowLong(pWnd->GetSafeHwnd,GWL_ID);
GetDlgCtrlID();
指针->句柄--------hWnd=cWnd.GetSafeHandle()or mywnd->m_hWnd;
HICON->ID--------HICON hIcon =AfxGetApp()->LoadIcon(nIconID);
HICON hIcon = LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(nIconID));
附注:获得窗口句柄三种方法
1.HWND FindWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName)
HWND FindWindowEx(HWNDhwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName)
2.HWND WindowFromPoint(POINT& Point)//获得当前鼠标光标位置的窗口HWND
本文来自CSDN博客:
http://blog.csdn.net/cy757/archive/2009/08/07/4423756.aspx
VC++中有关句柄和指针及其转换
1.MFC窗口的句柄和指针的转换
(1) 一般窗口对象都会有一个其对应的句柄变量,所以我们可以取此对象的m_hWnd属性来得到句柄。
(2)使用GetSafeHwnd函数取得程序所在窗口类的句柄
(3)使用FromHandle函数来通过句柄得到其想要的指针
其他的一些方法:
GetActiveWindow 取当前活动窗口句柄
AfxGetMainWnd 取主窗口句柄
GetForegroundWindow 取前台窗口句柄
FindWindow寻找参数指定的窗口
EnumWindow枚举窗口
2. 上下文无关设备的句柄和指针的转换
(1)this->m_hDC
(2)CDC::GetSafeHdc
(3)可以使用FromHandle函数来通过句柄得到其想要的指针
3.Gdi对象的句柄和指针的转换
(1)this->m_hObject
(2)CGdiObject::GetSafeHandle
(3)可以使用FromHandle函数来通过句柄得到其想要的指针
4.窗口、控件的指针和句柄的相互转化
(1)指针转化为句柄
在MFC应用程序中首先要获得窗口的指针,然后将其转化为句柄
CWnd* pWnd;
HANDLE hWnd = pWnd->GetSafeHwnd();
(2)句柄转化为指针
在MFC应用程序中首先获得对话框控件的句柄,然后获得其指针
HANDLE hWnd;
GetDlgItem(IDC_xxx,&hWnd);
CWnd * pWnd = FromHandle(hWnd);
获得程序窗口指针的办法
(1)获得主框架窗口指针(任何时候都可以用,只要是MFC程序中)
CWnd* pWnd = AfxGetMainWnd();
(2)获得对话框中控件指针
CWnd* pWnd = GetDlgItem(IDC_xxx);
(3)获得对话框中某控件的句柄
HANDLE GetDlgItem(m_hDLG,m_nID_DlgItem);
(4)获得GDI对象的句柄
HANDLE m_hGDIObj = m_pGDIObj->GetSafeHanle();
MFC在很多的对话框操作中,我们经常要用到在一个对话框中调用另一个对话框的函数或变量.可以用如下方法来解决.HWNDhWnd=::FindWindow(NULL,_T("Sphere")); //得到对话框的句柄C***Dialog* pWnd= (C***Dialog*)C***Dialog::FromHandle(hWnd);//由句柄得到对话框的对象指针pWnd->xx...
本文主要介绍C++中的四个智能
指针
:auto_ptr、unique_ptr、shared_ptr、weak_ptr。其中auto_ptr已经被弃用,原因我们下面说。
为什么要使用智能
指针
?
首先看下面一段代码:
void func()
int *p=new int(1);
return 0;
在这段代码中,我们使用了new在堆上开辟一个空间,但是我们在函数结束的时候并没有用delet...
近日在论坛上发一帖子:
MFC
控件类
指针
、new和GetDlgItem ,该代码是我使用VC6新建的一个工程。因很多人使用VC6,特新建一个这样的工程。但尽管如此,我所提到的问题依然存在,没有变化。希望各位高手、大侠和热心人士可以帮忙解决!谢谢!
原帖:http://topic.csdn.net/u/20101014/15/7a4e8009-0176-4219-b070-1c6666e9d6f9.html
指向
对象
的
指针
在建立
对象
的时候,变异系统会给每一个
对象
分配一定的存储空间,以存放其成员。
对象
空间的起始地址就是
对象
的
指针
。可以定义一个
指针
变量,用来存放
对象
的
指针
。
一个简单的示例1.1:
#include<iostream>
using namespace std;
class Student
public:
int num;
int sco...
到目前为止,编写的程序中所使用的
对象
都有着严格定义的生存期。全局
对象
在程序启动时分配,在程序结束时销毁。对于局部自动
对象
,当我们进入其定义所在的程序块时被创建,在离开块时销毁。局部static
对象
在第一次使用前分配,在程序结束时销毁。
文章目录前言动态内存与智能
指针
shared_ptr 类make_shared函数shared_ptr 的拷贝和赋值shared_ptr自动销毁所管理的
对象
shared_ptr还会自动释放相关联的内存
除了自动和static
对象
外,C++还支持动态分配
对象
。动态分配的
在
窗口
程序中,很多时候需要调用其他
窗口
的函数,例如在其他
窗口
操作后需要在log信息
窗口
打印log信息。
这里采用全局
窗口
指针
以及postmessage的方法实现。
现希望从testDlg
窗口
的OnBnClickedButton2()调用CfiletestDlg
窗口
的OnBnClickedButton1()函数,即在testDlg
窗口
点击一个按钮后调用CfiletestDlg
窗口
的一个按钮的点击函数。
获取
窗口
指针
要想调用其他
窗口
的函数,首先要明确
窗口
也是一个类,界面上显示的
窗口
是这一个
窗口
类创建的一