C++ MFC常用函數(轉)

來源:互聯網
上載者:User

標籤:

WinExec()

ExitWindowsEx()

GlobalMemoryStatus()

GetSystemInfo()

GetSystemDirectory()

GetWindowsDirectory()

GetTaskmanWindow() //user32.dll中 擷取工作列視窗控制代碼

OpenProcessToken()開啟一個進程的存取權杖

GetCurrentProcess()擷取本進程控制代碼

LookupPrivilegeValue()修改進程許可權

AdjustTokenProvileges()通知WindowsNT修改本進程權利

CreateRectRgn()

CreateEllipticRgnIndirect()

PtInRegion()

CommandToIndex()ID號轉換為索引值

菜單類:

DrawMenuBar()重畫菜單

SetDefaultItem()設定預設功能表項目

CheckMenuItem()設定功能表項目Check狀態

CreatePopupMenu()建立快顯功能表

視窗類別:

MoveWindow()

Invalidate()使視窗無效,視窗無效時會進行視窗重繪

GetParent()獲得視窗的父視窗控制代碼

BringWindowToTop()把視窗放到頂部

SetWindowPos()

DeferWindowPos()

SetActiveWindow()啟用頂層視窗

Set/GetForegroundWindow()設定/擷取前台視窗,返回控制代碼

Set/GetWindowLong()改變視窗屬性

GetNextWindow()擷取下一個視窗控制代碼

GetWindow()擷取視窗控制代碼

FromHandle()通過控制代碼擷取指標

AfxGetInstanceHandle()擷取程式當前執行個體控制代碼

AfxRegisterWndClass()

Set/GetClassLong()

Set/GetWindowLong()

GetWindowRect()擷取視窗在螢幕中的Rect

對話方塊:

GetDlgItem()

Set/GetDlgItemText()

Set/GetDlgItemInt()

Set/GetDlgItem()

SendDlgItemMessage()

SetFocus()文本編輯框Edit控制項若要響應斷行符號按鍵訊息,必須設定為多行類型

GetNextDlgTabItem()擷取下一個有TABStop屬性的控制項控制代碼

OnCtlColor()WM_CTLCOLOR視窗繪製訊息響應函數

GetDlgCtrlID()

SetButtonText()設定按鈕文本CreateRectRgn

GetStartPosition()

GetNextPathName()

SetHorizontalExtent()

SHBrowseForFolder()

屬性工作表單:

SetWizardMode()

SetWizardButtons()

OnSetActive()

工具列:

RecalcLayout()

ShowControlBar()

狀態列:

CommandToIndex()根據ID號擷取索引值

SetMessageText()

GetMessageBar()

GetDescendantWindow()

圖形類

OnEraseBkgnd()

CButton::DrawItem()

SetBkMode()設定文字背景

SetTextColor()

SetBkColor()

SetROP2()

SetClipRtn()

DrawText()

BeginPath()

EndPath()

BeginPaint()

EndPaint()

GetTextExtend()

SetWorldTransform()

GetDeviceCaps()

Set/GetViewportOrg()

Set/GetWindowOrg()

DPtoLP()將裝置座標點轉換為邏輯座標點

LPtoDP()將邏輯座標點轉換為裝置座標點

DeleteMetaFile()

CopyMetaFile()

GetMetaFile()

GetEnhMetaFile()

void CView::OnPaint()

{

CPaintDC dc(this);

OnPrepareDC(&dc);

OnDraw(&dc);

}

檔案操作:

EncryptFile()

CreateFile()

ReadFile()

WriteFile()

SetFilePointer()

::WriteProfileString()向win.ini寫入相關資訊

::GetProfileString()從win.ini擷取相關資訊

CWinApp::WriteProfileString()向註冊表中寫入相關資訊

CWinApp::GetProfileString()從註冊表中擷取相關資訊

::WritePrivateProfileString()

RegCreateKeyEx()建立登錄機碼

RegCloseKey()關閉登錄機碼

RegOpenKeyEx()開啟登錄機碼

RegSetValueEx()寫入登錄機碼

RegQueryValueEx()讀取登錄機碼

RegEnumKeyEx()

RegDeleteKey()

文檔視圖:

鉤子:

SetWindowsHookEx()

CallNextHookEx()

UnhookWindowsHookEx()

GetCurrentThreadID()

GetModuleHandle()

動態庫:

#pragma data_seg()

#pragma comment(linker,"/section:XXX,RWS") R可讀W可寫S共用

SEGMENTS

XXX READ WRITE SHARED

MAKEINTRESOURCE()

GetProcAddress()擷取函數地址

LoadLibrary()載入Dll

FreeLibrary()減少Dll的引用計數

多線程:

CreateThread()

CloseHandle()

互斥:

CreateMutex()

ReleaseMutex()

WaitForSingleObject()

事件:

CreateEvent()

SetEvent()設定有訊號狀態

ResetEvent()設定無訊號狀態

臨界區:

EnterCriticalSection()

InitializeCriticalSection()

LeaveCriticalSection()

DeleteCriticalSection()

非同步通訊端:

WSAAsyncSelect()為一個通訊端請求網路訊息通知

WSAEnumProtocols()檢索可用的網路通訊協定

WSASocket()

剪貼簿:

OpenClipboard()開啟剪貼簿

CloseClipboard()關閉剪貼簿

EmptyClipboard()清空剪貼簿

SetClipboardData()

GetClipboardData()

GlobalAlloc()

GlobalLock()

GlobalUnlock()

IsClipboardFormatAvailable()

匿名管道:

CreatePipe()

CreateProcess()

CreateFile()

ReadFile()

WriteFile()

具名管道:

CreateNamedPipe()

ConnectNamedPipe()

WaitNamedPipe()

CreateFile()

ReadFile()

WriteFile()

郵槽:

CreateMailslot()

多媒體:

mciSendCommand()<mmsystem.h>

視窗、控制項的指標和控制代碼的相互轉化

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();

1. 如何擷取應用程式的 執行個體控制代碼? AfxGetInstanceHandle()

應用程式的 執行個體控制代碼儲存在CWinAppIm_hInstance 中,可以這麼調用 AfxGetInstancdHandle獲得控制代碼.

       Example: HANDLE hInstance=AfxGetInstanceHandle();

2. 如何通過代碼獲得應用程式主視窗的 指標? AfxGetMainWnd   GetSafeHwnd() AfxGetAppName()   AfxGetThread

主視窗的 指標儲存在CWinThread::m_pMainWnd中,調用 AfxGetMainWnd實現。

【例】    AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED); //使程式最大化. 

【例】此例的主視窗是對話方塊,下面的代碼是在另外一個CFileTreeCtrl 類(子窗)中相關函數實現在主對話方塊(主窗)中的幾個 靜態文字框(子窗)中顯示路徑:

             CWnd* m_pCWnd= AfxGetMainWnd(); //得到主視窗指標,通過主窗指標訪問其他子窗資源

             //方法一

             m_pCWnd->SetDlgItemText(IDC_STATIC_path,"CWnd* "+m_sCurPath); //在主窗中的子窗(ID:IDC_STATIC_path)中顯示字串

             m_pCWnd->SetDlgItemText(IDC_STATIC_who,"路徑顯示由FileTreeCtrl類完成:");

             //方法二

             m_pCWnd->SendMessage(STN_CLICKED); //向主視窗發送一個訊息,顯示任務由主窗完成。

                                                //在主窗的.cpp中有:ON_MESSAGE(STN_CLICKED, OnSTATICpath3)相關描述

            //有的函數必須通過視窗的 控制代碼 來訪問,我們可以使用下面的方法三

            //CWnd::GetSafeHwnd 

            //Returns the window handle for a window

            //HWND GetSafeHwnd( ) const;

            HWND m_hWnd_tree =GetSafeHwnd();//【注】此處得到的只是當前視窗(FileTree類)的控制代碼

            HWND m_hWnd = m_pCWnd->GetSafeHwnd();// 這裡才是主視窗的控制代碼(由主窗指標得到主窗的控制代碼)

            //BOOL SetWindowText( HWND hWnd, LPCTSTR lpString )

            ::SetWindowText(m_hWnd,"ok2222");//修改主視窗標題

            ::SetDlgItemText(m_hWnd,IDC_STATIC_path2,"HWND: "+m_sCurPath); 

【另】AfxGetThread

       CWinThread* AfxGetThread( );

       Return Value:Pointer to the currently executing thread. 

3. 如何在程式中獲得其他程式的 表徵圖? AfxGetInstanceHandle() 

   HINSTANCE AfxGetInstanceHandle( );

    Return Value

      An HINSTANCE to the current instance of the application. If called from within a DLL linked with the USRDLL version of MFC, an HINSTANCE to the DLL is returned.

    Remarks

      This function allows you to retrieve the instance handle of the current application. AfxGetInstanceHandle always returns the HINSTANCE of your executable file (.EXE) unless it is called from within a DLL linked with the USRDLL version of MFC. In this case, it returns an HINSTANCE to the DLL.

兩種方法:

         (1) SDK函數 SHGetFileInfo 或使用 ExtractIcon獲得表徵圖資源的 handle(控制代碼),

         (2) SDK函數 SHGetFileInfo獲得有關檔案的 很多資訊,如大小表徵圖,屬性,類型等.

           Example(1): 在程式視窗左上方顯示 NotePad表徵圖.

            void CSampleView: OnDraw(CDC * pDC)

              {

                 if( :: SHGetFileInfo(_T("c:\\pwin95\\notepad.exe"),0,

                      &stFileInfo,sizeof(stFileInfo),SHGFI_ICON))

                    {

                      pDC ->DrawIcon(10,10,stFileInfo.hIcon);

                    }

               }

          Example(2):同樣功能,Use ExtractIcon Function

           void CSampleView:: OnDraw(CDC *pDC)

               {

                 HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T

                  ("NotePad.exe"),0);

                 if (hIcon &&hIcon!=(HICON)-1)

                    pDC->DrawIcon(10,10,hIcon);

               }

【說明】關於如何得到系統檔案的正確路徑,象win.ini system32.ini等的路徑,各種系統中具體的路徑是不一樣的。如:

獲得notepad.exe的路徑正規上來說用GetWindowsDirectory 函數得到;

如果是調用 win95下的畫筆,應該用訪問註冊表的方法獲得其路徑;

要作成一個比較考究的程式,考慮應該全面點.

【另】

                 HINSTANCE AfxGetResourceHandle( );

                 Return Value:An HINSTANCE handle where the default resources of the application are loaded. 

4.    有關取得案頭控制代碼 GetDesktopWindow() 

MSDN中的例子:

// 靜態函數CWnd:: GetDesktopWindow 返回桌面視窗的指標。下例說明了MFC

void CFrameWnd::BeginModalState ()

{

   //first count all windows that need to be disabled

   UINT nCount=0;

   HWND hWnd=:: GetWindow (:: GetDesktopWindow (), GW_CHILD);

   while (hWnd!=NULL)

   {

     if (:: IsWindowEnabled (hwnd) &&

         CWnd::FromHandlePermanent (hWnd)!=NULL &&

         AfxIsDescendant (pParent->m_hWnd, hWnd) &&

         :: SendMessage (hWnd, WM_DISABLEMODAL, 0, 0) == 0)

     {

        ++nCount;

     }

     hWnd=:: GetWindow (hWnd, GW_HWNDNEXT);

   }

//使用者的問題:下面程式取的不是同一程式的控制代碼,但是GetModuleFileName返回的結果一樣請問為什莫

HWND ChWnd;//子視窗控制代碼

HWND hwDesktop=::GetDesktopWindow();//取得案頭控制代碼

ChWnd=::GetWindow(hwDesktop,GW_CHILD);//取得案頭子控制代碼

CString csTitle,csClass,csTm,mLookstring; 

char szBuffer[255]; 

while(ChWnd!=NULL)//迴圈取子控制代碼的同級控制代碼

     if(::IsWindowVisible(ChWnd))//判斷是否為可顯示視窗

     { 

          ::GetWindowText(ChWnd,csTitle.GetBuffer(255),254); 

          ::GetClassName(ChWnd,csClass.GetBuffer(255),254); 

          csTitle.ReleaseBuffer();//標題

          csClass.ReleaseBuffer();//類名

          csTm.Format("%08X:",ChWnd); 

          if(csTitle=="") 

          { 

                mLookstring=csTm+csClass; 

          }else 

          { 

                mLookstring=csTm+csTitle; 

          } 

          //這裡的視窗控制代碼不是同一個程式吧?(問題所在!)可是為什莫結果一樣

          HINSTANCE hInstance = (HINSTANCE)::GetWindowLong(ChWnd,DWL_USER); 

          ::GetModuleFileName(hInstance, szBuffer, sizeof(szBuffer)); 

          MessageBox(szBuffer,mLookstring); 

     } 

     ChWnd=::GetWindow(ChWnd,GW_HWNDNEXT); 

回答: 

問題在於Win32下GetWindowLong(ChWnd,DWL_USER)總是返回當前程式啟動並執行hInstance,所以你得到的檔案名稱總是一個。所以你要用枚舉所有"進程的程式名"來獲得程式名。

=== 再談控制代碼於指標的區別

許多開始學習VC的朋友,最多聽說的兩個詞莫過於指標和控制代碼了。

但是,確經常搞不清他們之間的區別。

首先,控制代碼是一個視窗的標誌,也就是所有從CWND類繼承下來的,多有控制代碼這個成員。

他能做的,也就是唯一代表一個案頭上的視窗罷了。而指標是一個地址,如果它指向了一個記憶體中的對象,那麼就可以對它進行任意操作了,當然,並不局限於自己的應用程式,你如果能夠獲得別的應用程式的某個對象的指標,也可以進行操作。然而,如果要獲得指標,首先,必須找到那個視窗的控制代碼,然後用函數FromHandle就可以得到他的指標了。

===   問題1: 

如何在自訂的訊息中發送一個字串?例如: 

SendMessage(MyWnd,WM_USERDEFINED, 0,0) 

如何將字串Buffer寫入wParam或lParam? 

你可以把字串的地址傳遞過去,因為地址正好是32位。如:

char s[256]; 

SendMessage(MyWnd,WM_USERDEFINED, (WPARAM) s,0) 

接收方只需要將wParam賦給一個char*就可以了。但此方法只能使用於在一個進程內部傳遞資料。

===   問題2: 

1.在VC應用程式架構中,如何加入自己做的類,如何定義這個類的對象,我想在滑鼠點擊某個功能表項目的時候才產生這個對象,做得到嗎?(這個類的建構函式是帶參數的)。

2.訊息發送函數: 

   PostMessage(HWND handle,WM_MYMESSAGE, 

               WPARAM wParam,LPARAM lParam) 

中: 

第一個參數如何獲得?

如果我的訊息是在自己的應用程式中產生的,想發給應用程式的視窗讓它顯示某些資料(用TextOut函數),能做到嗎?

(也可以說是這樣的問題:用Appwizard產生應用程式架構,在產生的類(如CView)中如何得到視窗的控制代碼,並放在PostMessage函數中。) 

3.wParam,lParam,在訊息響應函數中如何用?vc是怎樣保證這兩個數傳到函數中的?問題比較多,謝謝! 

水平: 剛入門

回答: 

1、這個問題是肯定的。你可以使用ClassWizard定義類,也可以手工輸入。如果類定義已經在某個檔案中,只要使用Project|Add files將檔案加入工程就可以了。要想定義類的對象,只要在你的功能表項目的相應事件中就可以了。如:

... 

MyClass myObject("Hello"); 

myObject.MyMethod(); 

... 

2、在你自己的程式中傳遞訊息當然沒有任何問題,只要你知道要調用的視窗類別是從CWnd繼承來的,你就可以使用GetSafeHwnd函數獲得視窗控制代碼。不過一般在自己的同一個程式中有時不願意使用自訂訊息,因為太麻煩。你完全可以給要調用的類添加一個成員函數,只要想顯示資料,直接調用這個成員函數不就可以了?何必使用PostMessage呢?一般只有在程式間調用,才願意使用自訂訊息。這時,你通常可以使用FindWindow獲得視窗控制代碼(QA000251 "如何利用FindWindow()函數尋找程式")。

3、對於MFC已經定義了訊息處理函數的訊息,MFC會自動把wParam和lParam映射為更容易使用的方式。如OnMouseMove( UINT nFlags, CPoint point )。對於MFC不能自動處理的函數,如你使用ON_MESSAGE定義訊息函數,則MFC會把wParam和lParam原原本本的傳遞給你的函數,不做任何處理。

===   一個未公開的Win32 API函數:GetTaskmanWindow   ()

下例中還用到: GetProcAddress     GetParent(hWnd)

                     HMODULE hUser32 = GetModuleHandle("user32"); 

download

// getaskmanwnd.cpp (Windows NT/2000)

//

// 利用一個未公開的Win32 API函數:GetTaskmanWindow,

// 對Windows的工作列進行操作(顯示/隱藏)。這個函數返回擁有工作列按鈕的視窗控制代碼。

//

// This example will show you how you can obtain a handle to the

// Windows Taskbar window.

//

// (c)1999 Ashot Oganesyan K, SmartLine, Inc

// mailto:[email protected], http://www.protect-me.com, http://www.codepile.com

#i nclude <windows.h>

#i nclude <stdio.h>

// User32!GetTaskmanWindow (NT specific!)

//

// This function returns a handle to the window that ownes the taskbar buttons

//

// HWND GetTaskmanWindow()

//

typedef HWND (WINAPI *PROCGETTASKMANWND)(void);

PROCGETTASKMANWND GetTaskmanWindow;

void main(int argc, char* argv[])

{

if (argc<2)

{

printf("Usage:\n\ngetaskmanwnd.exe S|H\n");

return;

}

HMODULE hUser32 = GetModuleHandle("user32");

if (!hUser32)

return;

GetTaskmanWindow = (PROCGETTASKMANWND)GetProcAddress(hUser32,"GetTaskmanWindow"); 

if (!GetTaskmanWindow)

return;

HWND hWnd = GetTaskmanWindow();

if (!hWnd)

return;

if (*argv[1]=="H" || *argv[1]=="h")

ShowWindow(GetParent(hWnd),SW_HIDE);

else

ShowWindow(GetParent(hWnd),SW_SHOW);

}

C++ MFC常用函數(轉)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.