Win32常用API講解

1treeS發表於2019-05-10

初講

  • MessageBox

函式作用:彈出一個對話方塊,典型的模態型對話方塊
函式原型:int WINAPI MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)

引數含義:

hWnd:該訊息框的父視窗控制程式碼,如果此引數為NULL,則該訊息框沒有父視窗
lpText:訊息框的內容
lpCaption:訊息框的標題
uType:對話方塊的按鈕樣式和圖示

按鈕樣式:

MB_OK:預設值,包含一個確認按鈕
MB_OKCANCEL:包含確定以及取消兩個按鈕
MB_YESNO:包含是以及否兩個按鈕
MB_ABORTRETRYIGNORE:包含終止,重試以及跳過三個按鈕
MB_YESNOCANCEL:包含是,否以及取消三個按鈕
MB_RETRYCANCEL:包含重試以及取消兩個按鈕

圖示樣式:

MB_ICONINFORMATION:藍色i
MB_ICONASTERISK:藍色i
MB_ICONQUESTION:藍色?
MB_ICONWARNING:黃色!
MB_ICONEXCLAMATION:黃色!
MB_ICONSTOP:紅色x
MB_ICONERROR:紅色x
MB_ICONHAND:紅色x

訊息返回值:

IDYES:點選是
IDNO:點選否
IDOK:點選確認
IDCANCE:點選取消
IDABORT:點選終止
IDRETRY:點選重試
IDIGNORE:點選忽略

Demo:

#include <windows.h>

int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow){
    int chioce = MessageBox(NULL,"HelloWorld","Test",MB_OKCANCEL | MB_ICONINFORMATION);
    if(chioce = IDOK){
        MessageBox(NULL,"You choosed OK","Test",MB_OK | MB_ICONINFORMATION);
    }
    return 0;
}
  • CreateWindow

函式作用:建立視窗例項!一個完整的視窗程式應該先註冊視窗類,建立視窗例項,設定視窗的顯示狀態,最後傳送重繪訊息以防被其它視窗覆蓋後不能重新整理

函式原型:HWND CreateWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HANDLE hlnstance, LPVOID lpParam)

引數含義:

lpClassName:指向視窗類名
lpWindowName:指定標題或者靜態文字框文字
dwStyle:指定視窗風格(標題,邊框,滾動條…)
x:相對於父視窗的橫座標
y:相對於父視窗的縱座標
nWidth:視窗寬度
nHeight:視窗高度
hWndParent:指向父視窗的控制程式碼
hMenu:該視窗使用的某種型別的選單的控制程式碼
hlnstance:與視窗相關聯的模組例項的控制程式碼
lpParam:指向 CREATESTRUCT 結構的指標,傳遞 WM_CREATE 訊息

重點說明:
1.一般視窗程式套路是:RegisterClass -> CreateWindow -> ShowWindow -> UpdateWindow,按照物件導向實現很好理解,先註冊視窗類再例項化視窗,之後的 ShowWindow 是用於設定屬性讓視窗可見(WS_VISIBLE)或者不可見,UpdateWindow 是用來傳送WM_PAINT訊息更新視窗的

2.任何控制元件都屬於視窗,所以建立某個控制元件也是需要 CreateWindow 函式,傳入不同的 style 就表示不同的控制元件,比如:靜態文字static,按鈕button,編輯框edit,核取方塊Check Box

3.CreateWindow 會給普通視窗過程傳送一個 WM_CREATE 訊息,對於層疊,彈出式和子視窗,CreateWindow 給視窗傳送WM_CREATEWM_GETMINMAXINFOWM_NCCREATE訊息

  • BeginPaint

函式作用:當視窗收到 WM_PAINT 訊息時,需要首先呼叫 BeginPaint 獲取裝置環境控制程式碼,在其它情況下需要使用 GetDC 來獲取裝置環境控制程式碼!因為我們不能直接訪問硬體,所以需要藉助裝置環境(Device Context)這個中間層間接訪問鍵盤,顯示器等硬體裝置

函式原型:HDC BeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint)

引數含義:

hwnd:被重繪視窗的控制程式碼
lpPaint:指向一個用來接收繪畫資訊的 PAINTSTRUCT結構

當得到了裝置環境控制程式碼後,我們就可以呼叫圖形裝置介面(GDI)中已經封裝好的函式,諸如:TextOut,DrawText,CreateMenu,CreateBitmap,Rectangle,CreatePen等

  • SendMessage

函式作用:主動傳送一條訊息給視窗

函式原型:LRESULT SendMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)

引數含義:

hWnd:目標視窗的控制程式碼
msg:傳送的訊息
wParam:附加訊息,某些特定的訊息需要用到
lParam:附加訊息,某些特定的訊息需要用到

  • GetWindowText

函式作用:用於將指定視窗的標題文字(如果存在)拷貝到一個快取區內,如果指定的視窗是一個控制元件,則拷貝控制元件的文字

函式原型:Int GetWindowText(HWND hWnd, LPTSTR lpString, Int nMaxCount)

引數含義:

hWnd:視窗或者控制元件控制程式碼
lpString:指向接收文字的緩衝區指標
nMaxCount:最大的儲存長度

  • SetWindowText

函式作用:用於改變指定視窗的標題欄的文字內容(如果視窗有標題欄),如果指定視窗是一個控制元件,則改變控制元件的文字內容

函式原型:BOOL SetWindowText(HWND hWnd, LPCTSTR lpString)

引數含義:

hWnd:要改變文字內容的視窗或控制元件的控制程式碼
lpString:指向改變後的字串指標

  • DialogBox

函式作用:從一個對話方塊資源中建立一個模態對話方塊,該函式直到指定的回撥函式通過呼叫 EndDialog 函式中止模態的對話方塊才能返回控制。該函式通過呼叫 DialogBoxParam 實現

函式原型:int DialogBox(HINSTANCE hInstance, LPCTSTR lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc)

引數含義:

hInstance:例項控制程式碼
lpTemplate:對話方塊模板名
hWndParent:指定擁有對話方塊的視窗
lpDialogFunc:指向對話方塊過程的指標

  • CreateDialog

函式作用:建立一個非模態對話方塊,需要使用 DestroyWindow 結束該對話方塊。該函式通過呼叫 CreateDialogParam 實現

函式原型:HWND CreateDialog(HINSTANCE hlnstance, LPCTSTR lpTemplate, HWND hWndParent, DLGPROC IpDialogFunc)

引數含義:

hInstance:標識該模組的可執行檔案含有對話方塊模板
lpTemplate:對話方塊模板名
hWndParent:指定擁有對話方塊的視窗
lpDialogFunc:指向對話方塊過程的指標

重點說明:
當關閉非模態對話方塊或者視窗時,會呼叫DestroyWindow,這個函式先傳送 WM_DESTROY 訊息,接著傳送 WM_NCDESTROY 訊息

  • LoadString

函式作用:從資源里載入字串資源到 CString 物件裡,引數是資源 ID,同型別的還有LoadIconLoadCursor

函式原型:int WINAPI LoadStringA(HINSTANCE hInstance, UINT uID, LPSTR lpBuffer, int nBufferMax)

引數含義:

hInstance:應用程式例項控制程式碼
uID:資源ID
lpBuffer:接收從資源裡拷貝字串出來的緩衝區
nBufferMax:指明緩衝區大小

  • OutputDebugString

函式作用:輸出調式資訊到 Debugger

函式原型:void OutputDebugString(LPCTSTR lpOutputString)

引數含義:

lpOutputString:在偵錯程式中除錯時,輸出的字串

  • SetWindowPos

函式作用:改變一個子視窗,彈出式視窗或頂層視窗的尺寸,位置或Z序

函式原型:WINUSERAPI BOOL WINAPI SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags)

引數含義:

hWnd:視窗控制程式碼
hWndInsertAfter:視窗的 Z 順序
x:指定視窗新位置的左邊界
y:指定視窗新位置的頂邊界
cx:以畫素指定視窗的新的寬度
cy:以畫素指定視窗的新的高度
uFlags:視窗尺寸和定位的標誌

  • FindWindowEx

函式作用:在視窗列表中尋找與指定條件相符的第一個子視窗

函式原型:HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter, LPCTSTR lpszClass, LPCTSTR lpszWindow)

引數含義:

hwndParent:要查詢子視窗的父視窗控制程式碼
hwndChildAfter:子視窗控制程式碼,查詢從在Z序中的下一個子視窗開始
lpszClass:指向一個指定了類名的空結束字串
lpszWindow:指向一個指定了視窗名(視窗標題)的空結束字串

  • AnimateWindow

函式作用:該函式在顯示與隱藏視窗時能產生特殊的效果,有兩種型別的動畫效果:滾動動畫和滑動動畫

函式原型:BOOL AnimateWindow(HWND hWnd, DWORD dwTime, DWORD dwFlags)

引數含義:

hWnd:指定產生動畫的視窗的控制程式碼
dwTime:指明動畫持續的時間
dwFlags:指定動畫型別

  • MoveWindow

函式作用:改變指定視窗的位置和大小

函式原型:BOOL MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint)

引數含義:

hWnd:視窗的控制程式碼
x:指定了CWnd的左邊的新位置
y:指定了CWnd的頂部的新位置
nWidth:指定了CWnd的新寬度
nHeight:指定了CWnd的新高度
bRepaint:指定了是否要重畫CWnd

  • EnumWindows

函式作用:列舉所有螢幕上的頂層視窗,並將視窗控制程式碼傳送給定義的回撥函式。FindWindow 和它類似,只找頂層視窗不找子視窗

函式原型: BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)

引數含義:

lpEnumFunc:指向一個應用程式定義的回撥函式指標
lPararm:指定一個傳遞給回撥函式的應用程式定義值

回撥函式原型:BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)

  • IsWindow

函式作用:判斷目標視窗是否存在

函式原型:BOOL IsWindow(HWND hWnd)

引數含義:

hWnd:目標視窗控制程式碼

  • GetWindow

函式作用:返回與指定視窗有特定關係(如Z序或所有者)的視窗控制程式碼

函式原型:HWND GetWindow(HWND hWnd, UNIT nCmd)

引數含義:

hWnd:視窗控制程式碼
nCmd:說明指定視窗與要獲得控制程式碼的視窗之間的關係

重要說明:
Z 序表示視窗層疊時的順序,Z 序越大視窗越靠前,即 Z 序小的視窗會被 Z 序大的視窗遮擋

終講

原本草稿都寫好了,打算一口氣把檔案操作,程式操作以及網路套接字相關 API 的常見函式及其引數都介紹一下,但是我不小心找到了大佬們漢化後的 Win32API參考手冊,我覺得我也不可能有這個介紹得詳細了!所以之後查 API 就用這個啦,英文好的朋友還可以直接去微軟官網找文件

END

相關文章