1. 程式人生 > >MFC中獲取各個視窗之間的控制代碼或者指標物件的方法

MFC中獲取各個視窗之間的控制代碼或者指標物件的方法

轉載:https://www.cnblogs.com/gavanwanggw/p/6743774.html
MFC中獲取各個視窗之間的控制代碼或者指標物件的方法
MFC在非常多的對話方塊操作中,我們常常要用到在一個對話方塊中呼叫還有一個對話方塊的函式或變數.能夠用例如以下方法來解決.
HWND hWnd=::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(The handle of the Windows window attached to this CWnd)在::FromHandle(hWnd);

獲取主窗體控制代碼: CWnd *wnd = AfxGetMainWnd();
HWND hwnd = 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() 得到指標。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類的控制代碼。
所以操作前記得轉換成自定義的類的控制代碼。
如:((CMyApp*)AfxGetApp())->XXXX()。//這的xxxx()就是你定義的類中間的成員。

(二)MFC中控制代碼、指標、ID之間的轉換

win32直接操作的是控制代碼HANDLE。每一個控制代碼就相應windows窗體,而vc對HANDLE進行類封裝,間接操作的都是HANDLE,如今控制代碼僅僅是類的一個成員變數。

從控制代碼到指標
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;

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(HWND hwndParent, 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列舉窗體

  1. 上下文無關裝置的控制代碼和指標的轉換
    (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();