1. 程式人生 > >控制代碼、指標的轉換和獲取

控制代碼、指標的轉換和獲取

VC中控制代碼、指標、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

MFC中獲得各個類的指標/控制代碼的總結

一般我們使用的框架是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()就是你定義的類中間的成員。


另外,附上 MSDN 關於應用程式資訊和管理的各個函式:

When you write an application, you create a single CWinApp-derived object. At times, you may want to get information about this object from outside the CWinApp-derived object.

The Microsoft Foundation Class Library provides the following global functions to help you accomplish these tasks:

Application Information and Management Functions

AfxFreeLibrary
Decrements the reference count of the loaded dynamic-link library (DLL) module; when the reference count reaches zero, the module is unmapped.

AfxGetApp
Returns a pointer to the application's single CWinApp object.

AfxGetAppName
Returns a string containing the application's name.

AfxGetInstanceHandle
Returns an HINSTANCE representing this instance of the application.

AfxGetMainWnd
Returns a pointer to the current "main" window of a non-OLE application, or the in-place frame window of a server application.

AfxGetResourceHandle
Returns an HINSTANCE to the source of the application's default resources. Use this to access the application's resources directly.

AfxInitRichEdit
Initializes the version 1.0 rich edit control for the application.

AfxInitRichEdit2
Initializes the version 2.0 and later rich edit control for the application.

AfxLoadLibrary
Maps a DLL module and returns a handle that can be used to get the address of a DLL function.

AfxRegisterWndClass
Registers a Windows window class to supplement those registered automatically by MFC.

AfxSocketInit
Called in a CWinApp::InitInstance override to initialize Windows Sockets.

AfxSetResourceHandle
Sets the HINSTANCE handle where the default resources of the application are loaded.

AfxRegisterClass
Registers a window class in a DLL that uses MFC.

AfxBeginThread
Creates a new thread.

AfxEndThread
Terminates the current thread.

AfxGetThread
Retrieves a pointer to the current CWinThread object.

AfxWinInit
Called by the MFC-supplied WinMain function, as part of the CWinApp initialization of a GUI-based application, to initialize MFC. Must be called directly for console applications using MFC.