VC中编程,最大的障碍和问题就是消息机制和指针获取与操作。其实这些内容基本上是每本VC学习工具书上
必讲的内容,而且通过MSDN很多问题都能解决。下面文字主要是个人在编程中指针使用的一些体会,说的不当的地方请指正。一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,无论是多文档还是单文档,都存在指针获取和操作问题。
下面这节内容主要是一般的框架,然后再讲多线程中的指针使用。使用到的类需要包含响应的头文件。首先一般获得本类(视,文档,对话框都支持)实例指针this,用this的目的,主要可以通过类中的函数向其他类或者函数中发指针,以便于在非本类中操作和使用本类中的功能。
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);
(CMainFrame *)GetParent()->m_wndToolBar;
(CMainFrame *)GetParent()->m_wndStatusBar;
CMenu *pMenu=m_pMainWnd->GetMenu();
9) 在任何类中获得应用程序类
AfxGetInstanceHandle 得到句柄,AfxGetApp 得到指针
SDI AfxGetMainWnd() -> GetActiveView() -> GetDocument() 得到指针
MDI AfxGetMainWnd() -> MDIGetActive() -> GetActiveView() -> GetDocument() 得到指针
B3.如何在“框架类”中获得“文档类”句柄?
SDI GetActiveView() -> GetDocument() 得到指针,MDI MDIGetActive() -> GetActiveView() -> GetDocument() 从 CMainFrame 得到指针,GetActiveView() -> GetDocument() 从 CChildFrame 得到指针
B4.如何在“视图类”中获得“文档类”句柄?
GetDocument()
GetView(),调用 GetFirstViewPosition 和 GetNextView 函数得到指针。
C2.如何在自己的类和“应用程序类”中获得“视图类”句柄?
SDI GetActiveView 得到指针
MDI MDIGetActive() -> GetActiveView() 从 CMainFrame 得到指针,GetActiveView 从 CChildFrame 得到指针
最后提醒大家,在提取到各个句柄之后,因为初次提取的都是标准类句柄,所以,在使用时要注意将标准句柄转换成自己的类的句柄。如:
AfxGetApp();//得到的是WinApp类的句柄,
所以操作前记得转换成自己定义的类的句柄。
如:((CMyApp*)AfxGetApp())->XXXX();//这的xxxx()就是你定义的类中间的成员。
CWnd* pWnd=CWnd::FromHandle(hWnd); //a temporary CWnd object is created //and attached.
pWnd->Attach(hWnd); //Attaches a Windows window to a CWnd object
HWND hWnd=pWnd->GetSafeHandle();
hWnd=pWnd->m_hWnd;
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));
附注:获得窗口句柄三种方法
本文来自CSDN博客:http://blog.csdn.net/cy757/archive/2009/08/07/4423756.aspx
(1) 一般窗口对象都会有一个其对应的句柄变量,所以我们可以取此对象的m_hWnd属性来得到句柄。
(2)使用GetSafeHwnd函数取得程序所在窗口类的句柄
(3)使用FromHandle函数来通过句柄得到其想要的指针
其他的一些方法:
GetActiveWindow 取当前活动窗口句柄
AfxGetMainWnd 取主窗口句柄
GetForegroundWindow 取前台窗口句柄
FindWindow寻找参数指定的窗口
EnumWindow枚举窗口
(1)this->m_hDC
(2)CDC::GetSafeHdc
(3)可以使用FromHandle函数来通过句柄得到其想要的指针
(1)this->m_hObject
(2)CGdiObject::GetSafeHandle
(3)可以使用FromHandle函数来通过句柄得到其想要的指针
这其中的关键在于理解 m_pMainWnd, AfxGetApp(),AfxGetMainWnd() 的意义!
1) 在View中获得Doc指针
7) 如果框架中加入工具栏和状态栏变量还可以这样
8) 在Mainframe获得菜单指针
B1.如何在自己的类和“应用程序类”中获得“文档类”的句柄?
C1.如何在“文档类”中获得“视图类”句柄?
win32直接操作的是句柄HANDLE,每个句柄就对应windows窗口,而vc对HANDLE进行类封装,间接操作的都是HANDLE,现在句柄只是类的一个成员变量。
从句柄到指针
从指针到句柄
SDK编程中窗口ID,句柄,指针三者相互转换函数
1.HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)
HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName)
2.HWND WindowFromPoint(POINT& Point)//获得当前鼠标光标位置的窗口HWND
VC++中有关句柄和指针及其转换
1.MFC窗口的句柄和指针的转换
2. 上下文无关设备的句柄和指针的转换
3.Gdi对象的句柄和指针的转换
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();
本文来自CSDN博客:http://blog.csdn.net/lovegod12/archive/2009/04/19/4092249.aspx
在
窗口
程序
中
,很多时候需要调用其他
窗口
的函数,例如在其他
窗口
操作后需要在log信息
窗口
打印log信息。
这里采用全局
窗口
指针
以及postmessage的方法实现。
现希望从testDlg
窗口
的OnBnClickedButton2()调用CfiletestDlg
窗口
的OnBnClickedButton1()函数,即在testDlg
窗口
点击一个按钮后调用CfiletestDlg
窗口
的一个按钮的点击函数。
获取
窗口
指针
要想调用其他
窗口
的函数,首先要明确
窗口
也是一个类,界面上显示的
窗口
是这一个
窗口
类创建的一
MFC
在很多的
对话框
操作
中
,我们经常要用到在一个
对话框
中
调用另一个
对话框
的函数或变量.可以用如下方法来解决.
HWND hWnd=::FindWindow(NULL,_T("Sphere")); //得到
对话框
的
句柄
C***Dialog* pWnd= (C***Dialog*)C***Dialog::FromHandle(hWnd); //由
句柄
得到
对话框
的
对象
指针
pChild = pChild->GetWindow(GW_HWNDNEXT);
//筛选特殊类型
if(pChild && pChild->IsKindOf(RUNTIME_CLASS(CStatic)))
CString strName;
pChild->Ge
CVC_
MFC
_firstDlg dlg; //定义
对话框
对象
m_pMainWnd = &dlg; //这个定义的
对话框
dlg 成为主
窗口
应用程序
对象
成员变量m_pMainWnd是一个
窗口
指针
,即主
窗口
的
指针
。在初始化实例时,要给这个
指针
进行赋值。如果这个
指针
为空,则在默认的接下来的消息循环
中
,将不继续往下执行,也就是说,程序执行完初始化后,程序就退出了。只要这个
指针
的值非空且合法...
//直接获得
fun1.Format("%ld", AfxGetMainWnd()->m_hWnd);
fun1 = "AfxGetMainWnd()->m_hWnd方法
获取
句柄
号 = " + fun1;
dc.TextOut(20, 50, fun1);
//通过AfxGetApp()间接获得
fun1.Format("%ld", AfxGetApp()->GetMainWnd()->m_hWnd);
fun1 .
每个
窗口
类的CWnd *hwnd
指针
中
封装了该
窗口
的
句柄
m_hWnd,直接hwnd->m_hWnd即可得到该
窗口
的
句柄
。HWND是
句柄
,CWnd是
MFC
窗体类,CWnd
中
包含HWND
句柄
成员
对象
是m_hWnd。
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
TForm1 = class(TForm)
Button1: TButton;
Timer1: TT.
1.主
对话框
CTcpAsynSDlg *pMainDlg = (CTcpAsynSDlg*)AfxGetApp()->GetMainWnd();
pMainDlg->m_hWnd;就是指向主
对话框
的
句柄
。