Windows經常使用API

Windows經常使用API

1:MessageBox

 函數功能:php

MessageBox 函數用於顯示一個模態對話框,其中包含一個系統圖標、 一組按鈕和一個簡短的特定於應用程序消息,如狀態或錯誤的信息。
    消息框中返回一個整數值,該值指示用戶單擊了哪一個按鈕。
API 函數原型:
註釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。
html

 int WINAPI MessageBox(git

  _In_opt_  HWNDhWnd,程序員

  _In_opt_  LPCTSTRlpText,編程

  _In_opt_  LPCTSTRlpCaption,windows

  _In_     UINT uType數組

);緩存


參數解析:
安全

參數服務器

 

含義

hWnd

1. 該消息框的父窗口句柄
2. 若是此參數爲NULL,則該消息框沒有擁有父窗口

lpText

消息框的內容

lpCaption

消息框的標題

uType

1. 指定一個決定對話框的內容和行爲的位標誌集
2. 此參數能夠經過指定下列標誌或標誌的組合,來顯示消息框中的按鈕以及圖標


uType參數定義解析

按鈕

含義

MB_OK

默認值,有一個「確認」按鈕在裏面

MB_YESNO

有「是」和「否」兩個按鈕在裏面

MB_ABORTRETRYIGNORE

有「停止」,「重試」和「跳過」三個按鈕在裏面

MB_YESNOCANCEL

有「是」,「否」和「取消」三個按鈕在裏面

MB_RETRYCANCEL

有「重試」和「取消」兩個按鈕在裏面

MB_OKCANCEL

有「肯定」和「取消」兩個按鈕在裏面



圖標

含義

MB_ICONEXCLAMATION

一個驚歎號出如今消息框: 

MB_ICONWARNING

一個驚歎號出如今消息框(同上)

MB_ICONINFORMATION

一個圓圈中小寫字母i組成的圖標出如今消息框: 

MB_ICONASTERISK

一個圓圈中小寫字母i組成的圖標出如今消息框(同上)

MB_ICONQUESTION

一個問題標記圖標出如今消息框: 

MB_ICONSTOP

一箇中止消息圖標出如今消息框: 

MB_ICONERROR

一箇中止消息圖標出如今消息框(同上)

MB_ICONHAND

一箇中止消息圖標出如今消息框(同上)



默認按鈕

含義

MB_DEFBUTTON1

指定第一個按鈕爲默認按鈕

MB_DEFBUTTON2

指定第二個按鈕爲默認按鈕

MB_DEFBUTTON3

指定第三個按鈕爲默認按鈕

MB_DEFBUTTON4

指定第四個按鈕爲默認按鈕



消息框形態

含義

MB_APPLMODAL

1. 在 hWnd 參數標識的窗口中繼續工做之前,用戶必定響應消息框
2. 可是,用戶能夠移動到其餘線程的窗口且在這些窗口中工做
3. 根據應用程序中窗口的層次機構,用戶則以移動到線程內的其餘窗口
4. 全部母消息框的子窗口自動地失效,可是彈出窗口不是這樣
5. 若是既沒有指定 MB_SYSTEMMODAL 也沒有指定 MB_TASKMODAL,則 MB_APPLMODAL 爲默認的

MB_SYSTEMMODAL

1. 除了消息框有 WB_EX_TOPMOST 類型,不然 MB_APPLMODAL 和 MB_SYSTEMMODAL 同樣
2. 用系統模態消息框來改變各類各樣的用戶,主要的損壞錯誤須要當即注意(例如,內存溢出)
3. 若是不是那些與 hWnd 聯繫的窗口,此標誌對用戶對窗口的相互聯繫沒有影響

MB_TASKMODAL

1. 若是參數 hWnd 爲 NULL 的話,那麼除了全部屬於當前線程高層次的窗口失效外,MB_TASKMODAL 和 MB_APPLMODAL 同樣
2. 當調用應用程序或庫沒有一個能夠獲得的窗口句柄時,可使用此標誌,但仍須要阻止輸入到調用線程的其餘窗口,而不是擱置其餘線程



其餘標誌

含義

MB_DEFAULT_DESKTOP_ONLY

1. 接收輸入的當前桌面必定是一個默認桌面,不然函數調用失敗
2. 默認桌面是一個在用戶已經記錄且之後應用程序在此上面運行的桌面

MB_HELP

1. 把一個 Help 按鈕增長到消息框
2. 選擇 Help 按鈕或按 F1 產生一個 Help 事件

MB_RIGHT

文本爲右對齊

MB_RTLREADING

用在 Hebrew 和 Arabic 系統中從右到左的順序顯示消息和大寫文本

MB_SETFOREGROUND

1. 消息框變爲前景窗口
2. 在內部系統爲消息個調用 SetForegroundWindow 函數

MB_TOPMOST

消息框用 WS_EX_TOPMOST 窗口類型來建立 MB_SERVICE_NOTIFICATION



返回值:

返回值

含義

IDOK

用戶按下了「確認」按鈕

IDCANCEL

用戶按下了「取消」按鈕

IDABORT

用戶按下了「停止」按鈕

IDRETRY

用戶按下了「重試」按鈕

IDIGNORE

用戶按下了「忽略」按鈕

IDYES

用戶按下了「是」按鈕

IDNO

用戶按下了「否」按鈕



舉例:
#include <windows.h>

 

int WINAPI WinMain(HINSTANCEhInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)

{

       MessageBox(NULL, TEXT("這是我在魚C學的第一個程序!"), TEXT("打招呼"), MB_OKCANCEL| MB_ICONQUESTION | MB_DEFBUTTON2);

       return 0;

}

 


 

1:MessageBox


    Windows的窗口老是基於窗口類來建立的,窗口類同時肯定了處理窗口消息的窗口過程(回調函數)。

在建立應用程序窗口以前,必須調用 RegisterClass 函數來註冊窗口類。該函數只須要一個參數,即指向 WNDCLASS 窗口類的指針。由於 WNDCLASS 類包含了窗口所擁有的基本屬性。

結構原型:
typedef struct tagWNDCLASSW {

    UINT       style;

    WNDPROC    lpfnWndProc;

    int        cbClsExtra;

    int        cbWndExtra;

    HINSTANCE  hInstance;

    HICON      hIcon;

    HCURSOR    hCursor;

    HBRUSH     hbrBackground;

    LPCWSTR    lpszMenuName;

    LPCWSTR    lpszClassName;

} WNDCLASSW, *PWNDCLASSW, NEAR*NPWNDCLASSW, FAR *LPWNDCLASSW;



成員解析:

成員

含義

style

指定窗口類型,各類「類風格」(詳見下方↓)可使用按位或操做符組合起來

lpfnWndProc

指定窗口過程(必須是回調函數)

cbClsExtra

預留的額外空間,通常爲 0

cbWndExtra

預留的額外空間,通常爲 0

hInstance

應用程序的實例句柄

hIcon

爲全部基於該窗口類的窗口設定一個圖標

hCursor

爲全部基於該窗口類的窗口設定一個鼠標指針

hbrBackground

指定窗口背景色

lpszMenuName

指定窗口菜單

lpszClassName

指定窗口類名



style 類風格解析

類風格

含義

CS_VREDRAW

移動或者調整窗口的高度(垂直方向)時,重繪整個窗口

CS_HREDRAW

移動或者調整窗口的寬度(水平方向)時,重繪整個窗口

CS_DBLCLKS

當用戶光標在窗口內雙擊時,容許發送雙擊消息給窗口過程

CS_OWNDC

給予每一個窗口實例分配一個惟一的 DC(注意,儘管這樣是很方便,但它必須慎重使用,由於每一個 DC 大約要佔 800 個字節的內存)

CS_CLASSDC

該窗口類的全部窗口實例都共享一個窗口類 DC

CS_PARENTDC

1. 將子窗口的裁剪區域設置到父窗口的 DC 中去,這樣子窗口即可以在父窗口上繪製自身。(注意,這是子窗口仍是從系統緩存中獲取 DC,而不是使用父窗口的 DC。)
2. 指定該風格能夠提升系統性能

CS_NOCLOSE

禁止系統菜單的關閉選項

CS_SAVEBITS

1. 以位圖形式保存被該窗口遮擋的屏幕部分,這樣當給窗口移動之後,系統即可以用該保存的位圖恢復屏幕移動的相應部分,從而系統不用向被該窗口遮擋的窗口發送 WM_PAINT 消息
2. 該特性對於菜單類型的窗口比較合適,由於它一般是簡短的顯示一下以後便消失
3. 設置該特性將增長顯示該窗口的時間,由於它一般要先分配保存位圖的內存

CS_BYTEALIGNCLIENT

在字節邊界上(在 x 方向上)定位窗口的用戶區域的位置

CS_BYTEALIGNWINDOW

在字節邊界上(在 x 方向上)定位窗口的位置

CS_GLOBALCLASS

1. 當調用 CreateWindow 或 CreateWindowEx 函數來建立窗口時容許它的 hInstance 參數和註冊窗口類時傳遞給 RegisterClass 的 hInstance 參數不一樣
2. 若是不指定該風格,則這兩個 hInstance 必須相同




1:MessageBox

 

函數功能:

CreateWindow 函數建立一個重疊式窗口、彈出式窗口或子窗口。它指定窗口類,窗口標題,窗口風格,以及窗口的初始位置及大小(可選的)。函數也指該窗口的父窗口或所屬窗口(若是存在的話),及窗口的菜單。

若要使用除 CreateWindow 函數支持的風格外的擴展風格,則使用 CreateWindowEx 函數代替 CreateWindow 函數。

API 函數原型:

註釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。

HWND WINAPI CreateWindow(

  _In_opt_  LPCTSTRlpClassName,    // 窗口類名稱

  _In_opt_  LPCTSTRlpWindowName,   // 窗口標題

  _In_     DWORD dwStyle,          // 窗口風格,或稱窗口格式

  _In_     int x,                 // 初始 x 座標

  _In_     int y,                 // 初始 y 座標

  _In_     int nWidth,            // 初始 x 方向尺寸

  _In_     int nHeight,           // 初始 y 方向尺寸

  _In_opt_  HWNDhWndParent,        // 父窗口句柄

  _In_opt_  HMENUhMenu,            // 窗口菜單句柄

  _In_opt_  HINSTANCEhInstance,    // 程序實例句柄

  _In_opt_  LPVOIDlpParam          // 建立參數

);

 

 

參數解析:

參數

含義

lpClassName

1. 窗口類名稱,能夠是一個指向 NULL 結束的字符串或一個整型數值
2. 若是是字符串,它指定了窗口的類名。這個類名能夠是任何用函數 RegisterClass 註冊的類名,或是任何預約義的控制類名
3. 如是一個整型量,它是由此前調用 theGlobalAddAtom 函數產生的全局量。這個小於 0xC000 的 16 位數必須是 lpClassName 參數字的低 16 位,該參數的高位必須是 0

lpWindowName

1. 窗口標題,一個指向 NULL 結束的字符串指針
2. 若是窗口風格指定了標題條,由 lpWindowName 指向的窗口標題將顯示在標題條上
3. 當使用 Createwindow 函數來建立控制例如按鈕,選擇框和靜態控制時,可以使用 lpWindowName 來指定控制文本

dwStyle

指定建立窗口的風格(詳見下方↓)

x

1. 指定窗口的初始水平位置(x 座標)
2. 對一個層疊或彈出式窗口,x 參數是屏幕座標系的窗口的左上角的初始 x 座標
3. 對於子窗口,x 是子窗口左上角相對父窗口客戶區左上角的初始 x 座標
4. 若是該參數被設爲 CW_USEDEFAULT 則系統爲窗口選擇缺省的左上角座標並忽略 y 參數,CW_USEDEFAULT 只對層疊窗口有效,若是爲彈出式窗口或子窗口設定,則 x 和 y 參數被設爲零。

y

1. 指定窗口的初始垂直位置(y 座標)
2. 對一個層疊或彈出式窗口,y 參數是屏幕座標系的窗口的左上角的初始 y 座標
3. 對於子窗口,y 是子窗口左上角相對父窗口客戶區左上角的初始 y 座標
4. 對於列表框,y 是列表框客戶區左上角相對父窗口客戶區左上角的初始 y 座標
5. 若是層疊窗口是使用 WS_VISIBLE 風格位建立的而且 x 參數被設爲 CW_USEDEFAULT,則系統將忽略 y 參數

nWidth

1. 以設備單元指明窗口的寬度
2. 對於層疊窗口,nWidth 的值或是屏幕座標的窗口寬度或是 CW_USEDEFAULT
3. 若 nWidth 是 CW_USEDEFAULT,則系統爲窗口選擇一個默認的高度和寬度(默認寬度爲從初始 x 座標開始到屏幕的右邊界,缺省高度爲從初始 y 座標開始到目標區域的頂部。),CW_USEDEFAULT 只對層疊窗口有效,若是爲彈出式窗口和子窗口設定 CW_USEDEFAULT 標誌則 nWidth 和 nHeight 被設爲零

nHeight

1. 以設備單元指明窗口的高度
2. 對於層疊窗口,nHeight 是屏幕座標的窗口寬度
3. 若 nWidth 被設爲 CW_USEDEFAULT,則系統忽略 nHeight 參數,自動爲 nWidth 和 nHeight 設置默認參數

hWndParent

1. 指向被建立窗口的父窗口或全部者窗口的句柄
2. 若要建立一個子窗口或一個從屬窗口,需提供一個有效的窗口句柄
3. 建立一個單純的消息窗口,能夠提供 HWND_MESSAGE 或提供一個己存在的消息窗口的句柄

hMenu

1. 指向窗口菜單句柄,或依據窗口風格指明一個子窗口標識
2. 對於層疊或彈出式窗口,hMenu 指定窗口使用的菜單:若是使用了菜單類,則 hMenu 能夠爲 NULL
3. 對於子窗口,hMenu 指定了該子窗口標識(一個整型量),一個對話框使用這個整型值將事件通知父類。應用程序肯定子窗口標識,這個值對於相同父窗口的全部子窗口必須是惟一的

hInstance

與窗口相關聯的模塊實例的句柄

lpParam

1. 指向一個值的指針,該值傳遞給窗口 WM_CREATE 消息。該值經過在 IParam 參數中的 CREATESTRUCT 結構傳遞
2. 若是應用程序調用 CreateWindow 建立一個 MDI 客戶窗口,則 lpParam 必須指向一個 CLIENTCREATESTRUCT 結構



dwStyle 窗口風格解析

窗口風格

含義

WS_BORDER

建立一個帶邊框的窗口

WS_CAPTION

建立一個有標題框的窗口(包含了 WS_BODER 風格)

WS_CHILD

建立一個子窗口,這個風格的窗口不能擁有菜單也不能與 WS_POPUP 風格合用

WS_CHILDWINDOW

與 WS_CHILD 相同

WS_CLIPCHILDREN

當在父窗口內繪圖時,排除子窗口區域,在建立父窗口時使用這個風格

WS_CLIPSIBLINGS

1. 排除子窗口之間的相對區域,也就是,當一個特定的窗口接收到 WM_PAINT 消息時,WS_CLIPSIBLINGS 風格將全部層疊窗口排除在繪圖以外,只重繪指定的子窗口
2. 若是未指定該風格,而且子窗口是層疊的,則在重繪子窗口的客戶區時,就會重繪鄰近的子窗口

WS_DISABLED

1. 建立一個初始狀態爲禁止的子窗口,一個禁止狀態的窗口不能接受來自用戶的輸入信息
2. 在窗口建立以後,能夠調用 EnableWindow 函數來啓用該窗口

WS_DLGFRAME

建立一個帶對話框邊框風格的窗口,這種風格的窗口不能帶標題條

WS_GROUP

1. 指定一組「控制窗口」的第一個「控制窗口」
2. 這個「控制窗口」組由第一個「控制窗口」和隨後定義的「控制窗口」組成,自第二個「控制窗口」開始每一個「控制窗口」具備 WS_GROUP 風格
3. 每一個組的第一個「控制窗口」帶有 WS_TABSTOP 風格,從而使用戶能夠在組間移動
4. 用戶隨後可使用光標在組內的控制間改變鍵盤焦點

WS_HSCROLL

建立一個有水平滾動條的窗口

WS_ICONIC

建立一個初始狀態爲最小化狀態的窗口,與 WS_MINIMIZE 風格相同

WS_MAXIMIZE

建立一個初始狀態爲最大化狀態的窗口

WS_MAXIMIZEBOX

建立一個具備最大化按鈕的窗口,該風格不能與 WS_EX_CONTEXTHELP 風格同時出現,同時必須指定 WS_SYSMENU 風格

WS_MINIMIZE

建立一個初始狀態爲最小化狀態的窗口,與 WS_ICONIC 風格相同

WS_MINIMIZEBOX

建立一個具備最小化按鈕的窗口,該風格不能與 WS_EX_CONTEXTHELP 風格同時出現,同時必須指定 WS_SYSMENU 風格

WS_OVERLAPPED

產生一個層疊的窗口,一個層疊的窗口有一個標題條和一個邊框,與 WS_TILED 風格相同

WS_OVERLAPPEDWINDOW

至關於(WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX),與 WS_TILEDWINDOW 風格相同

WS_POPUP

建立一個彈出式窗口,該風格不能與 WS_CHILD 風格同時使用。

WS_POPUPWINDOW

至關於(WS_POPUP | WS_BORDER | WS_SYSMENU),但 WS_CAPTION 和 WS_POPUPWINDOW 必須同時設定才能使窗口某單可見

WS_SIZEBOX

建立一個可調邊框的窗口,與 WS_THICKFRAME 風格相同

WS_SYSMENU

建立一個在標題條上帶有窗口菜單的窗口,必須同時設定 WS_CAPTION 風格

WS_TABSTOP

1. 建立一個「控制窗口」,在用戶按下 Tab 鍵時能夠得到鍵盤焦點。
2. 按下 Tab 鍵後使鍵盤焦點轉移到下一具備 WS_TABSTOP 風格的「控制窗口」

WS_THICKFRAME

建立一個具備可調邊框的窗口,與 WS_SIZEBOX 風格相同

WS_TILED

產生一個層疊的窗口,一個層疊的窗口有一個標題和一個邊框,與 WS_OVERLAPPED 風格相同

WS_TILEDWINDOW

至關於(WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX),與 WS_OVERLAPPEDWINDOW 風格相同

WS_VISIBLE

建立一個初始狀態爲可見的窗口

WS_VSCROLL

建立一個有垂直滾動條的窗口



返回值:

1. 若是函數成功,返回值爲新窗口的句柄;
2. 若是函數失敗,返回值爲 NULL。


 

4:ShowWindow

 

函數功能:

ShowWindow 函數用於設置指定窗口的顯示狀態。

 

應用程序第一次調用 ShowWindow 時,應該使用 WinMain 函數的 nCmdshow 參數做爲它的 nCmdShow 參數。在隨後調用 ShowWindow 函數時,必須使用下列顯示方式中的一個給定值,而不是由 WinMain 函數的 nCmdSHow 參數指定的值。

API 函數原型:

BOOL WINAPI ShowWindow(

   _In_  HWNDhWnd,

  _In_  intnCmdShow

);



參數解析:

參數

含義

hWnd

窗口句柄

nCmdShow

控制窗口如何顯示,若是發送應用程序的程序提供了 STARTUPINFO 結構,則應用程序第一次調用 ShowWindow 時該參數被忽略。不然,在第一次調用 ShowWindow 函數時,該值應爲在函數 WinMain 中 nCmdShow 參數。



在隨後的調用中,nCmdShow 參數能夠爲下列值之一:

顯示方式

含義

SW_FORCEMINIMIZE

1. 最小化窗口,即便擁有窗口的線程被掛起也會最小化
2. 在從其餘線程最小化窗口時才使用這個參數

SW_HIDE

隱藏窗口並激活其餘窗口

SW_MAXIMIZE

最大化指定的窗口

SW_MINIMIZE

最小化指定的窗口而且激活在 Z 序中的下一個頂層窗口

SW_RESTORE

1. 激活並顯示窗口
2. 若是窗口最小化或最大化,則系統將窗口恢復到原來的尺寸和位置
3. 在恢復最小化窗口時,應用程序應該指定這個標誌。

SW_SHOW

在窗口原來的位置以原來的尺寸激活並顯示窗口

SW_SHOWDEFAULT

依據在 STARTUPINFO 結構中指定的 SW_FLAG 標誌設定顯示狀態,STARTUPINFO 結構是由啓動應用程序的程序傳遞給 CreateProcess 函數的。

SW_SHOWMAXIMIZED

激活窗口並將其最大化

SW_SHOWMINIMIZED

激活窗口並將其最小化

SW_SHOWMINNOACTIVE

1. 窗口最小化
2. 在窗口激活的狀況下,這個值跟 SW_SHOWMINIMIZED 很類似

SW_SHOWNA

1. 以窗口原來的位置以原來的尺寸顯示窗口
2. 在窗口激活的狀況下,這個值跟 SW_SHOW 很類似

SW_SHOWNOACTIVATE

1. 以窗口最近一次的位置和尺寸顯示窗口
2. 在窗口激活的狀況下,這個值跟 SW_SHOWNORMAL 很類似

SW_SHOWNORMAL

1. 激活並顯示一個窗口
2. 若是窗口被最小化或最大化,系統將其恢復到原來的尺寸和大小
3. 應用程序在第一次顯示窗口的時候應該指定此標誌


返回值:
1. 若是窗口以前可見,則返回值爲非 0;
2. 若是窗口以前被隱藏,則返回值爲 0。

 

 

 

5: UpdateWindow__更新窗口

 

函數功能:

UpdateWindow 函數繞過應用程序的消息隊列,直接發送 WM_PAINT 消息給指定窗口的窗口過程。

若是窗口更新的區域不爲空,UpdateWindow 函數經過發送一個 WM_PAINT 消息來更新指定窗口的客戶區。若是更新區域爲空,則不發送消息。

API 函數原型:

BOOL UpdateWindow(

  _In_  HWNDhWnd

);


參數解析:

參數

含義

hWnd

指定要更新的窗口的句柄.



返回值:
1. 若是函數調用成功,返回值爲非 0;
2. 若是函數調用不成功,返回值爲 0。

UpdateWindowWindowsSDKWindowsAPISDK教程UpdateWindow詳解

 

 

 

6:MSG 消息結構

MSG 消息結構

在 Windows 程序中,消息是由 MSG 結構體來表示的。

結構原型:

typedef struct tagMSG {

  HWND  hwnd;

  UINT  message;

  WPARAM wParam;

  LPARAM lParam;

  DWORD  time;

  POINT  pt;

} MSG, *PMSG, *LPMSG;

 



成員解析:

成員

含義

hwnd

指定接收消息的窗口句柄
若是是線程消息,該值是 NULL

message

1. 消息的標識符,因爲數值不便於記憶,因此 Windows 將消息對應的數值定義爲 WM_XXX 宏的形式
2. 應用程序消息只能使用低 16 位,高 16 位被系統保留
3. 傳送門:Windows經常使用消息及含義

wParam

指定消息的附加消息,確切的含義取決於消息成員的值

lParam

指定消息的附加消息,確切的含義取決於消息成員的值

time

該消息被投放到消息隊列的時間

pt

當消息被投放到消息隊列的時,鼠標位於屏幕中的位置

 

 

 

7: GetMessage

 

函數功能:

GetMessage 函數的做用是從當前線程的消息隊列裏取出一個消息並填入 MSG結構 中。

 

該函數只能獲取調用線程的消息,不能得到其餘線程的消息。成功獲取消息後,線程將從消息隊列中刪除該消息。若是消息隊列爲空,函數會一直等待直到有消息到來纔有返回值。

API 函數原型:
BOOL WINAPI GetMessage(

  _Out_    LPMSG lpMsg,

  _In_opt_  HWNDhWnd,

  _In_     UINT wMsgFilterMin,

  _In_     UINT wMsgFilterMax

);



參數解析:

參數

含義

lpMsg

指向 MSG 結構的指針

hWnd

1. 須要檢索消息的窗口的句柄,該窗口必須屬於當前線程
2. 當其值是 NULL 時,將檢索全部的當前線程的窗口消息和線程消息
3. 當其值是 -1 時,只檢索當前線程消息

wMsgFilterMin

指定被檢索的最小消息值的整數

wMsgFilterMax

指定被檢索的最大消息值的整數



返回值:

1. 若是函數取得 WM_QUIT 以外的其餘消息,返回非零值;
2. 若是函數取得 WM_QUIT 消息,返回值是零;
3. 若是出現了錯誤,返回值是 -1。



 

8:TranslateMessage

 

函數功能:

TranslateMessage 函數將虛擬鍵消息轉換爲字符消息,字符消息被寄送到當前線程的消息隊列裏。

當下一次線程調用函數 GetMessage 或PeekMessage 時被讀出。

API 函數原型:

BOOL WINAPI TranslateMessage(

  _In_  constMSG *lpMsg

);



參數解析:

參數

含義

lpMsg

指向含有消息的 MSG 結構的指針



返回值:

1. 若是消息被轉換(字符消息被寄送到當前線程的消息隊列裏)則返回非零值;
2. 若是消息是 WM_KEYDOWN,WM_KEYUPWM_SYSKEYDOWN 或 WM_SYSKEYUP,返回非零值,不考慮轉換;
3. 若是消息沒被轉換(字符消息沒被寄送到調用線程的消息隊列裏)則返回值是零。


 

9: DispatchMessage

 

函數功能:

DispatchMessage 函數分派一個消息給窗口過程(回調函數),一般該消息從 GetMessage 函數得到。Windows 的控制權在該函數交給了應用程序。

API 函數原型:

LRESULT WINAPIDispatchMessage(

  _In_  constMSG *lpmsg

);



參數解析:

參數

含義

lpmsg

指向含有消息的 MSG結構 的指針



返回值:
1. 返回值是窗口過程返回的值;
2. 儘管返回值的含義依賴於被分派的消息,但返回值一般被忽略。

備註:
1. MSG 結構必須包含有效的消息值。
2. 若是參數 lpmsg 指向一個 WM_TIMER 消息,而且 WM_TIMER 消息的參數 lParam 不爲 NULL,則調用 lParam 指向的函數,而不是調用窗口程序。


 

 

10:PAINTSTRUCT 結構

PAINTSTRUCT 結構包含一些窗口過程用來對客戶區進行繪製的信息。

結構原型:

typedef struct tagPAINTSTRUCT{

  HDC  hdc;

  BOOL fErase;

  RECT rcPaint;

  BOOL fRestore;

  BOOL fIncUpdate;

  BYTErgbReserved[32];

} PAINTSTRUCT, *PPAINTSTRUCT;

 



成員解析:

成員

含義

hdc

用於繪製的設備環境句柄

fErase

1. 表示背景是否必須擦除,若是爲非零值則擦除背景,不然不擦除背景
2. 若是建立窗口類的時候沒有設置背景畫刷,則負責擦除背景

rcPaint

一個 RECT結構,指定左上角和右下角的座標肯定一個要繪製的矩形範圍

fRestore

系統保留

fIncUpdate

系統保留

rgbReserved

系統保留




11:RECT 結構

RECT 結構定義了一個矩形的左上角和右下角的座標。

結構原型:

typedef struct _RECT {

  LONG left;

  LONG top;

  LONG right;

  LONG bottom;

} RECT, *PRECT;



成員解析:

成員

含義

left

指定矩形左上角的 x 座標

top

指定矩形左上角的 y 座標

right

指定矩形右下角的 x 座標

bottom

指定矩形右下角的 y 座標




12:BeginPaint

 

函數功能:

BeginPaint 函數爲指定窗口進行繪畫工做的準備,並用將和繪畫有關的信息填充到一個 PAINTSTRUCT結構中。

API 函數原型:

HDC BeginPaint(

  _In_  HWND hwnd,

  _Out_  LPPAINTSTRUCTlpPaint

);

參數解析:

參數

含義

hwnd

須要從新繪製的窗口句柄

lpPaint

指向 PAINTSTRUCT結構的指針,用於存放繪畫相關的信息



返回值:
1. 若是函數成功,返回值是指定窗口的「顯示設備描述表」句柄;
2. 若是函數失敗,返回值是 NULL,代表沒有獲得顯示設備的內容。

備註:
1. BeginPaint 函數自動設置顯示設備內容的剪切區域,而排除任何更新區域外的區域。該更新區域能夠經過 InvalidateRect 或 InvalidateRgn 函數設置,也能夠是系統在改變大小、移動、建立、滾動後設置的,或者其餘的影響客戶區的操做來設置的。
2. 若是更新區域被標記爲可擦除的,BeginPaint 發送一個 WM_ERASEBKGND 消息給窗口。
3. 一個應用程序除了響應 WM_PAINT 消息外,不該該調用 BeginPaint。
4. 每次調用 BeginPaint 都應該有相應的 EndPaint 函數。
5. 若是被繪畫的客戶區中有一個 caret(caret:插入符。是窗口客戶區中的一個閃爍的線,塊,或位圖。插入符一般表示文本或圖形將被插入的地方。即一閃一閃的光標),BeginPaint 自動隱藏該符號,而保證它不被擦除。
6. 若是窗口類有一個背景刷,BeginPaint 使用這個刷子來擦除更新區域的背景。


 

13:GetClientRect 

 

函數原型:

GetClientRect 函數用於獲取窗口客戶區的座標,客戶區座標指定客戶區的左上角和右下角。

因爲客戶區座標是相對窗口客戶區的左上角而言的,所以左上角座標爲(0,0)

API 函數原型:

BOOL WINAPI GetClientRect(

  _In_  HWND hWnd,

  _Out_  LPRECTlpRect

);



參數解析:

參數

含義

hWnd

須要獲取客戶區座標的窗口句柄

lpRect

1. 指向 RECT結構的指針,該結構有四個成員,分別爲 left、top、right 和 bottom
2. GetClientRect 將這四個成員設定爲窗口顯示區域的尺寸,left 和 top 字段一般設定爲 0,right 和 bottom 字段設定爲顯示區域的寬度和高度(像素點數)



返回值:
1. 若是函數成功,返回值是非 0;
2. 若是函數失敗,返回值是 0。


14:DrawText

 

函數原型:

DrawText 函數在指定的矩形裏寫入格式化的正文,根據指定的方法對正文格式化(擴展的製表符,字符對齊、折行等)。

須要指定更多的格式選項,可使用 DrawTextEx 函數。


API 函數原型:

int DrawText(

  _In_    HDC hDC,

  _Inout_  LPCTSTRlpchText,

  _In_    int nCount,

  _Inout_  LPRECTlpRect,

  _In_    UINT uFormat

);

 

 

參數解析:

參數

含義

hDC

指定「顯示設備描述表」句柄

lpchText

1. 指向將被寫入的字符串的指針,若是參數 nCount 是 -1,則字符串必須是以 \0 結束的
2. 若是 uFormat 包含 DT_MODIFYSTRING,則函數可爲此字符串增長 4 個字符,存放字符串的緩衝區必須足夠大,能容納附加的字符

nCount

1. 指向字符串中的字符數
2. 若是 nCount 爲 -1,則 lpchText 指向的字符串被認爲是以 \0 結束的,DrawText 會自動計算字符數

lpRect

指向 RECT結構的指針,其中包含文本將被置於其中的矩形的信息(按邏輯座標)

uFormat

1. 指定格式化文本的方法
2. 此參數能夠經過指定下列標誌或標誌的組合



uFormat 參數各類標誌解析

標誌

含義

DT_BOTTOM

對齊文字到矩形的底部,當且僅當設置了 DT_SINGLELINE 標誌纔有效

DT_CALCRECT

1. 這個參數決定矩形的寬度和高度
2. 若是輸出文本有多行,DrawText 函數使用 lpRect 定義的矩形的寬度,並擴展矩形的底部以容納輸出文本的最後一行
3. 若是輸出文本只有一行,則 DrawText 函數改變矩形的右邊界,以容納下正文行的最後一個字符
4. 出現上述任何一種狀況,DrawText 函數將返回格式化文本的高度,而不是繪製文本

DT_CENTER

文本水平居中顯示

DT_EDITCONTROL

將擁有多行編輯控件的正文顯示特性(尤爲是平均字符寬度的計算方法,而且不會顯示不可見的最後一行)

DT_END_ELLIPSIS

1. 對於顯示的文本,若是結束的字符串的範圍不在矩形內,它會被截斷並以省略號標識
2. 若是一個字母不是在字符串的末尾但卻超出了矩形範圍,它會被換行但沒有追加省略號標識
3. 除非指定了 DT_MODIFYSTRING 標誌,不然字符串不會被修改

DT_EXPANDTABS

1. 擴展製表符,每一個製表符的缺省字符數是 8
2. DT_WORD_ELLIPSIS, DT_PATH_ELLIPSIS 和 DT_END_ELLIPSIS 不能和此參數一塊兒使用

DT_EXTERNALLEADING

在行的高度裏包含字體的外部標頭(一般外部標頭不被包含在正文行的高度裏)

DT_HIDEPREFIX

1. 忽略正文中的前綴字符(&),而且前綴字符後面的字母不會出現下劃線,其它前綴字符的調用方式不受影響
2. 例如:輸入字符串爲「F&is&&hC」,正常顯示爲「Fis&hC」,使用 DT_HIDEPREFIX 顯示爲「Fis&hC」

DT_INTERNAL

用系統字體來計算正文尺寸

DT_LEFT

正文左對齊

DT_MODIFYSTRING

1. 容許系統修改給定的字符串來匹配顯示的正文
2. 此標誌必須和 DT_END_ELLIPSIS 或 DT_PATH_ELLIPSIS 同時使用

DT_NOCLIP

無裁剪繪製,使用 DT_NOCLIP 能夠提升 DrawText 的效率

DT_NOFULLWIDTHCHARBREAK

1. 在寬字符的字符串中防止行斷開,所以折行規則至關於單字符的字符串
2. 例如,咱們能夠用在韓國版的 Windows 中,爲圖標標籤提供更好的可讀性
3. 除非指定 DT_WORDBREAK,不然此值沒有做用

DT_NOPREFIX

1. 關閉前綴字符的處理(一般 DrawText 解釋 & 爲給其後的字符加下劃線,解釋 && 爲顯示單個 &)
2. 例如:輸入字符串爲「F&is&&hC」,正常顯示爲「Fis&hC」,使用 DT_NOPREFIX 顯示爲「F&is&&hC」

DT_PATH_ELLIPSIS

1. 對於過長的正文,自動替換字符串中間的字符爲省略號(...),以確保結果能在合適的矩形內顯示
2. 若是該字符串包含反斜槓(\)字符,DT_PATH_ELLIPSIS 儘量的保留最後一個反斜槓以後的字符
3. 除非指定了 DT_MODIFYSTRING 標誌不然字符串不會被修改

DT_PREFIXONLY

1. 僅僅在(&)前綴字符的位置下繪製一個下劃線,但不繪製字符串中的任何其餘字符
2. 例如:輸入字符串爲「F&is&&hC」,正常顯示爲「Fis&hC」,使用 DT_PREFIXONLY 顯示爲「_」

DT_RIGHT

正文右對齊

DT_RTLREADING

當設備環境的字體是希伯來文或阿拉伯文字體時,爲雙向正文安排從右到左的閱讀順序

DT_SINGLELINE

顯示正文的同一行,回車和換行符都不能換行

DT_TABSTOP

1. 設置製表符,參數 uFormat 的 8~15 位(低位字中的高位字節)指定每一個製表符的字符數,每一個製表符的缺省字符數是 8
2. DT_CALCRECT, DT_EXTERNALLEADING, DT_INTERNAL, DT_NOCLIP 和 DT_NOPREFIX 不能和此參數一塊兒使用

DT_TOP

正文頂端對齊

DT_VCENTER

使正文在矩形中垂直居中,當且僅當設置了 DT_SINGLELINE 標誌纔有效

DT_WORDBREAK

1. 當一行中的字符將會延伸到由 lpRect 指定的矩形的邊框時,此行自動地在單詞之間斷開
2. 一個回車一換行也能使之換行
3. 若是沒有指定,輸出會在一行上

DT_WORD_ELLIPSIS

截短不符合矩形的正文,並增長省略號(與 DT_END_ELLIPSIS 相似)



返回值:
1. 若是函數調用成功,返回值是正文的高度(邏輯單位);
2. 若是指定了 DT_VCENTER 或 DT_BOTTOM,返回值是 lpRect -> top 到繪製的正文的底部的偏移值;
3. 若是函數調用失敗,返回值是 0。

備註:

1. 函數 DrawText 用設備環境中的字體選擇、正文顏色和背景顏色來寫正文。
2. DrawText 裁剪正文,使之不會出如今指定矩形的外面,除非指定了 DT_NOCLIP。
3. 除非使用 DT_SINGLELINE 格式化,不然其他的格式都認爲正文有多行。 
4. 若是選擇的字體對指定的矩形而言太大,DrawText 並不會試圖去換成一種小字體。
5. 設備環境的正文對齊方式必須包括 TA_LEFT, TA_TOP 和 TA_NOUPDATECP 標誌。 


 

15:EndPaint

 

函數原型:

EndPaint 函數標記指定窗口的繪畫過程結束。

這個函數在每次調用 BeginPaint 函數以後被調用(釋放設備描述表),但僅僅在繪畫完成之後。

API 函數原型:

BOOL EndPaint(

  _In_  HWNDhWnd,

  _In_  constPAINTSTRUCT *lpPaint

);



參數解析:

參數

含義

hWnd

已經被從新繪製的窗口句柄

lpPaint

指向 PAINTSTRUCT結構的指針,用於存放繪畫相關的信息(該指針在調用 BeginPaint 時被賦值)



返回值:
    該函數返回值始終是非 0。


 

 

16:PostQuitMessage

 

函數原型:

PostQuitMessage 函數向系統代表有個線程有終止(退出)請求。這個函數一般用來響應WM_DESTROY 消息。

API 函數原型:

VOID WINAPI PostQuitMessage(

  _In_  intnExitCode

);


參數解析:

參數

含義

nExitCode

指定應用程序的退出代碼,此值被用做 WM_QUIT 消息的 wParam 參數



返回值: 該函數沒有返回值。


備註:
1. PostQuitMessage 函數的功能是發送一個 WM_QUIT 消息給線程的消息隊列並當即返回。
2. 當線程從消息隊列裏取得 WM_QUIT 消息時,應當退出消息循環並將返回系統,返回給系統的退出值必須是消息WM_QUIT 的 wParam 參數(因此 WinMain 函數的返回值是 msg.wParam)。


 

17:DefWindowProc

 

函數功能:

DefWindowProc 函數調用缺省的窗口過程來處理那些窗口過程沒有處理的任何消息,該函數是爲了確保每一個消息都被處理。
   DefWindowProc函數傳入和窗口過程一樣的參數。

API 函數原型:

LRESULT WINAPI DefWindowProc(

  _In_  HWNDhWnd,

  _In_  UINTMsg,

  _In_  WPARAMwParam,

  _In_  LPARAMlParam

);

 

參數解析:

參數

含義

hWnd

指定接收消息的窗口句柄

Msg

1. 消息的標識符,因爲數值不便於記憶,因此 Windows 將消息對應的數值定義爲 WM_XXX 宏的形式
2. 應用程序消息只能使用低 16 位,高 16 位被系統保留
3. 傳送門:Windows經常使用消息及含義

wParam

指定消息的附加消息,確切的含義取決於消息成員的值

lParam

指定消息的附加消息,確切的含義取決於消息成員的值



返回值:
1. 返回值就是消息處理結果,它取決於發送的消息。


 

 

18: DestroyWindow 

 

函數功能:

DestroyWindow 用於銷燬一個指定的窗口,該函數經過發送 WM_DESTROY 消息和 WM_NCDESTROY 消息使窗口無效並移除其鍵盤焦點。

DestroyWindow 函數還銷燬窗口的菜單,清空線程的消息隊列,銷燬與窗口過程相關的定時器,解除窗口對剪貼板的擁有權,打斷剪貼板器的查看鏈。

若是指定的窗口擁有子窗口或擁有其它窗口,該函數將自動先銷燬其子窗口或所擁有的窗口,而後再銷燬自身。


API 函數原型:

BOOL WINAPI DestroyWindow(

  _In_  HWNDhWnd

);

 

參數解析:

參數

含義

hWnd

指定將被銷燬的窗口句柄



返回值:
1. 若是函數成功執行,返回值爲非 0;
2. 若是函數執行失敗,返回值爲 0。

備註:
1. 一個線程不能使用本函數銷燬別的線程建立的窗口。
2. 若是這個窗口是一個不具備 WS_EX_NOPARENTNOTIFY 樣式的子窗口,則銷燬窗口時將發WM_PARENTNOTIFY 消息給其父窗口。


 

19:TextOut

 

函數功能:

TextOut 函數使用當前選擇的字體、背景顏色和文本顏色,將一個字符串繪畫於窗口的指定位置。

API 函數原型:

註釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。

BOOL TextOut(

  _In_  HDChdc,

  _In_  intnXStart,

  _In_  intnYStart,

  _In_  LPCTSTRlpString,

  _In_  intcchString

);



參數解析:

參數

含義

hdc

設備環境句柄

nXStart

指定用於字符串對齊的基準點的邏輯 x 座標(有關基準點請看下邊備註)

nYStart

指定用於字符串對齊的基準點的邏輯 y 座標

lpString

1. 指向將被繪製字符串的指針
2. 該字符串沒必要以'\0'結束,由於 cchString 參數指定了該字符串的長度

cchString

lpString 字符串的長度(有多少個字符)



返回值:
1. 若是函數調用成功,返回值爲非 0;
2. 若是函數調用失敗,返回值爲 0。

備註:字符串對齊的基準點取決於當前的文本對齊模式。應用程序能夠經過調用 GetTextAlign 得到當前的文本對齊模式,經過調用SetTextAlign 修改該模式。


 

 

20:GetTextAlign

 

GetTextAlign 函數得到指定的設備環境下的文字對齊方式的設置。

API 函數原型:

註釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。

UINT GetTextAlign(

  _In_  HDChdc

);



參數解析:

參數

含義

hdc

指定設備環境句柄



返回值:
1. 若是函數調用失敗,返回值是 GDI_ERROR;
2. 若是函數調用成功,返回值是文字對齊標誌的狀態。

該返回值是下列值的組合:

含義

TA_BASELINE

基準點在正文的基線上

TA_BOTTOM

基準點在限定矩形的底邊上(限定矩形的含義請看下邊備註)

TA_TOP

基準點在限定矩形的頂邊上

TA_CENTER

基準點在限定矩形的中心水平對齊位置

TA_LEFT

基準點在限定矩形的左邊上

TA_RIGHT

基準點在限定矩形的右邊上

TA_RTLREADING

1. 適用於中東 Windows 版本:正文從右到左的閱讀順序排列,與缺省的從左到右正好相反
2. 只有當被選擇的字體是 Hebrew 或 Arabic 時,此值纔有用

TA_NOUPDATECP

每次輸出調用後當前狀態不改變

TA_UPDATECP

每次輸出調用後當前狀態改變

 

若當前字體有一條缺省的垂直基線(如Kanji),下列值用於取代 TA_BASELINE 和 TA_CENTER:

含義

VTA_BASELINE

基準點在正文的基線上

VTA_CENTER

基準點與限定矩形的中心垂直對齊


備註:
1. 默認值是 TA_LEFT, TA_TOP 和 TA_NOUPDATECP
2. 限定矩形是指能將正文字符串的全部字符單元限定於其中的矩形
3. 限定矩形的尺寸可經過調用 GetTextExtentPoint32 來得到
4. 文字對齊標誌決定 TextOut 和 ExtTextOut 如何將正文字符串與基準點對齊
5. 文字對齊標誌沒必要是單個的標誌位,能夠等於0
6. 標誌必須按相關的組來檢查,以下:
    TA_LEFT, TA_RIGHT, andTA_CENTER

TA_BOTTOM, TA_TOP, and TA_BASELINE

TA_NOUPDATECP and TA_UPDATECP


若是當前字體有缺省的垂直基線,相關的標誌以下所示:
    TA_LEFT, TA_RIGHT, andVTA_BASELINE

TA_BOTTOM, TA_TOP, and VTA_CENTER

TA_NOUPDATECP and TA_UPDATECP


7. 要驗證一個特定的標誌在返回值中被設置,應用程序必須執行如下步驟:
(例子:如何設置文本對齊模式
    對該標誌及其相關標誌實施位OR操做;

對結果和返回值實施位AND操做;

檢查結果值和標誌是否相等。



 

21:SetTextAlign

 

函數功能:

SetTextAlign 函數爲指定設備環境設置文字的對齊標誌。

API 函數原型:

UINT SetTextAlign(

  _In_  HDChdc,

  _In_  UINTfMode

);


參數解析:

參數

含義

hdc

指定設備環境句柄

fMode

1. 文本對齊標誌
2. 在橫向對齊和縱向對齊標誌中只能選擇一個
3. 兩個標誌只能選擇一個來改變當前的位置


使用下面的列表中的掩碼指定文本對齊方式:

含義

TA_BASELINE

基準點在正文的基線上

TA_BOTTOM

基準點在限定矩形的底邊上(限定矩形的含義請看下邊備註)

TA_TOP

基準點在限定矩形的頂邊上

TA_CENTER

基準點在限定矩形的中心水平對齊位置

TA_LEFT

基準點在限定矩形的左邊上

TA_RIGHT

基準點在限定矩形的右邊上

TA_NOUPDATECP

1. 適用於中東 Windows 版本:正文從右到左的閱讀順序排列,與缺省的從左到右正好相反
2. 只有當被選擇的字體是 Hebrew 或 Arabic 時,此值纔有用

TA_RTLREADING

每次輸出調用後當前狀態不改變

TA_UPDATECP

每次輸出調用後當前狀態改變


若當前字體有一條缺省的垂直基線(如Kanji),下列值用於取代 TA_BASELINE 和 TA_CENTER:

含義

VTA_BASELINE

基準點在正文的基線上

VTA_CENTER

基準點與限定矩形的中心垂直對齊

默認值是TA_LEFT, TA_TOP 和 TA_NOUPDATECP。

返回值:
1. 若是函數調用失敗,返回值是 GDI_ERROR;
2. 若是函數調用成功,返回值是文字對齊方式的前一個設置。

備註:
1. 限定矩形是指能將正文字符串的全部字符單元限定於其中的矩形
2. TextOut 和 ExtTextOut 函數用文字對齊標誌來將一個正文字符串定位於顯示器或者其餘設備
3. 該標誌指定了基準點與限定正文的矩形的位置關係,基準點能夠是當前位置,也但是傳給正文輸出函數的一個點
4. 設置左對齊文本的作好方法能夠是以下:

SetTextAlign (hdc, GetTextAlign(hdc) & (~TA_CENTER))

或者

SetTextAlign (hdc,TA_LEFT | <other flags>)

 

你固然可使用 SetTextAlign (hdc, TA_LEFT) 來達到這個目的,可是這個方法會丟失全部的垂直基線或者從右到左的設置。
5. 調用 SetTextAlign 函數時,若是使用 TA_UPDATECP 標誌,Windows 會忽略 TextOut 的 xStart 和 yStart 參數,而使用由 MoveToEx、LineTo 或更改目前位置的另外一個函數設定的位置。

 

 

 

 

22:wsprintf

 

函數功能:

wsprintf 函數用於把數據格式化寫入到指定的緩衝區裏,輸出緩衝區裏的的值取決於格式說明符(即"%"),若是寫入的是文字,此函數給寫入的文字的末尾追加一個'\0',函數的返回值是寫入的長度,但不包括最後的'\0'

 

注意:實際編程中不要再使用該函數,請使用 StringCchPrintf 或StringCbPrint 代替。

API 函數原型:

int __cdecl wsprintf(

  _Out_  LPTSTRlpOut,

  _In_  LPCTSTR lpFmt,

  _In_   ...

);

 



參數解析:

參數

含義

lpOut

1. 指定格式化數據將要寫入的緩衝區
2. 緩衝區限定最大爲 1024 字節

lpFmt

1. 格式化字符串
2. 與 printf 的格式化字符串基本一致,但不支持浮點數

...

可變參數,參數的個數取決 lpFmt 參數



返回值:
1. 若是函數調用成功,返回值與計劃寫入緩衝區的字符個數相等(不包含最後的'\0');
2. 若是函數調用失敗,返回值小於計劃寫入緩衝區的字符個數,可經過調用 GetLastError 獲取詳細的錯誤信息。


 

 

23:StringCchPrintf

 

函數功能:

StringCchPrintf 函數用於把數據格式化寫入到指定的緩衝區裏,該函數要求提供目標緩衝區的大小,確保不會發生越界訪問。

微軟推薦使用該函數替代如下函數:

sprintf, swprintf, _stprintf

wsprintf

wnsprintf

_snprintf, _snwprintf,_sntprintf



API 函數原型:

HRESULT StringCchPrintf(

  _Out_  LPTSTRpszDest,

  _In_  size_t cchDest,

  _In_  LPCTSTR pszFormat,

  _In_  ...

);

 


參數解析:

參數

含義

pszDest

指定格式化數據將要寫入的緩衝區

cchDest

1. 緩衝區大小
2. 應該設置足夠大,以容納字符串和結束標記('\n')
3. 最大容許的字符數是 STRSAFE_MAX_CCH

pszFormat

1. 格式化字符串
2. 與 pirntf 的格式化字符串一致

...

可變參數,參數的個數取決 pszFormat 參數

返回值:

這個函數返回一個 HRESULT,而不是像 sprintf 同樣返回存儲在其目標緩衝區的字節數。咱們強烈建議您使用 SUCCEEDED和 FAILED 宏來測試這個函數的返回值。

返回值能夠是如下任意一個值:

返回代碼

描述

S_OK

表示有足夠的空間將拷貝到 pszDest,沒有發生截斷

STRSAFE_E_INVALID_PARAMETER

cchDest 的值爲 0 或大於 STRSAFE_MAX_CCH

STRSAFE_E_INSUFFICIENT_BUFFER

1. 因爲緩衝區空間不足而致使的複製失敗
2. 結果被截斷,當仍然包含'\0'結尾
3. 若是截斷操做能夠被接受,則不必定被看做是失敗



備註:

使用 StringCchPrintf 函數須要添加頭文件:strsafe.h



代碼演示:

#include "strsafe.h"

 

......

 

TCHAR pszDest[30]; 

size_t cchDest = 30;

LPCTSTR pszFormat =TEXT("從你家到魚C工做室須要 %f 千米!");

HRESULT hr =StringCchPrintf(pszDest, cchDest, pszFormat, 123.45);

 

......

 

 

 

24:strlen

 

函數功能:

lstrlen 函數用於計算指定字符串的長度(不包含'\0),注意:實際編程中不要再使用該函數,請使用 StringCchLength 或StringCbLength 代替。
API 函數原型:
int WINAPI lstrlen(

  _In_  LPCTSTRlpString

);



參數解析:

參數

含義

lpString

指向以'\0'爲終止符的字符串



返回值:
1. 該函數返回指定字符串的字符數;
2. 若是是空字符串,則返回 0。

安全建議:

錯誤的使用 lstrlen 函數將可能會危害到應用程序的安全:lstrlen 函數假定 lpString 參數是以'\0'結尾的字符串,若是事實上傳入的參數不按套路出牌,則會形成緩衝區溢出,最終致使程序沒法按照指望正常運行。

 

 

25:SUCCEEDED 和 FAILED 宏

 

宏功能:

SUCCEEDED 宏表示測試成功,FAILED 宏表示測試失敗。

宏定義:

#define  SUCCEEDED(hr)  (((HRESULT)(hr))>= 0)

#define  FAILED(hr)  (((HRESULT)(hr))< 0)



參數解析:

參數

含義

hr

1. 狀態碼
2. 該值能夠是 HRESULT 或 SCODE 類型
3. 非負數表示成功
4. 負數表示失敗

返回值:
1. 若是 hr 的值大於等於 0,則結果爲TRUE;
2. 若是 hr 的值小於 0,則結果爲FALSE。

 

 

 

26:StringCchLength

 

函數功能:

StringCchLength 函數用於肯定字符串是否超過了規定的長度,以字符爲計算單位。

微軟推薦使用該函數替代如下函數:

strlen, wcslen, _tcslen


API 函數原型:

HRESULT StringCchLength(

  _In_  LPCTSTR psz,

  _In_  size_t cchMax,

  _Out_  size_t*pcch

);

 



參數解析:

參數

含義

psz

指向待檢查的字符串

cchMax

1. psz 參數裏最大容許的字符數量,包括'\0'
2. 這個數不能超過 STRSAFE_MAX_CCH

pcch

1. psz 參數指向字符串的字符個數,不包括'\0'
2. 這個值只有在 psz 指針不爲 NULL,且函數成功時有效



返回值:

這個函數返回一個 HRESULT,而不是指定字符串的字符個數。咱們強烈建議您使用 SUCCEEDED 和 FAILED 宏來測試這個函數的返回值。

返回值能夠是如下任意一個值:

返回代碼

描述

S_OK

psz 指向的字符串不爲空,且字符串的長度(包括'\0')小於等於 cchMax

STRSAFE_E_INVALID_PARAMETER

1. psz 指向空字符串
2. cchMax 的值大於STRSAFE_MAX_CCH
3. psz 指向的字符串的字符個數超過 cchMax



備註:
1. 對比 StringCchLength 所替代的函數,StringCchLength 是可使你的代碼正確處理緩存區的一個附加功能。由於小的緩衝處理會牽連不少安全問題,例如緩存區溢出
2. 使用 StringCchLength 函數須要添加頭文件:strsafe.h


 

 

 

27:StringCchCat 

 

函數功能:

StringCchCat 函數的功能是將一個字符串拼接到另外一個字符串。StringCchCat 函數要求提供目標緩衝區的長度,以確保寫入數據不會超出緩衝區的末尾。

微軟推薦使用該函數替代如下函數:

strcat, wcscat, _tcsat

lstrcat

StrCat

StrCatBuff



API 函數原型:

HRESULT StringCchCat(

  _Inout_  LPTSTRpszDest,

  _In_    size_t cchDest,

  _In_    LPCTSTR pszSrc

);


參數解析:

參數

含義

pszDest

1. 目標緩衝區,同時包含第一個字符串
2. 該緩衝區必須大於或等於 pszDest + pszSrc + 1(兩個字符串的字符總和+'\0')

cchDest

1. 目標緩衝區的大小(字符個數)
2. 該值必須大於或等於 pszDest + pszSrc + 1(兩個字符串的字符總和+'\0')
3. 這個數不能超過 STRSAFE_MAX_CCH

pszSrc

第二個字符串


返回值:
    這個函數返回一個 HRESULT,而不是拼接好的字符串指針。咱們強烈建議您使用 SUCCEEDED 和 FAILED 宏來測試這個函數的返回值。

返回值能夠是如下任意一個值:

返回代碼

描述

S_OK

字符串正常拼接

STRSAFE_E_INVALID_PARAMETER

1. cchDest 參數的值爲 0 
2. cchDest 參數的值大於 STRSAFE_MAX_CCH
3. 目標緩衝區空間已滿

STRSAFE_E_INSUFFICIENT_BUFFER

1. 因緩衝區空間不足致使失敗
2. 結果被截斷,當仍然包含'\0'結尾
3. 若是截斷操做能夠被接受,則不必定被看做是失敗




28: lstrcat

函數功能:

lstrcat 函數的功能是將一個字符串拼接在另外一個字符串後邊。

注意:實際編程中不要再使用該函數,請使用 StringCchCat 代替。


API 函數原型:

LPTSTR WINAPI lstrcat(

  _Inout_  LPTSTRlpString1,

  _In_    LPTSTR lpString2

);


參數解析:

參數

含義

lpString1

一個以'\0'爲結尾的字符串,該字符串空間必須大到足以容納自己及另外一個字符串

lpString2

一個以'\0'爲結尾的字符串,該字符串將拼接到 lpString1 指向的字符串後邊


返回值:
1. 若是函數調用成功,返回指向拼接好的字符串指針;
2. 若是函數調用失敗,返回值爲 NULL,而且 lpString1 可能會變成非 '\0' 結束的字符串。
安全建議:
1. 不正確的使用 lstrcat 函數,可能會損害應用程序的安全性
2. lstrcat 函數使用結構化異常處理(SEH)來捕捉訪問衝突和其餘錯誤。當該函數捕獲 SEH 錯誤,若是沒有以'\0'結尾的字符串,則返回 NULL,且不把錯誤通知調用者。所以,把空間不足做爲錯誤的條件是不安全的
3. lpString1 必須足夠大,以增長 lpString2 和結束'\0',不然可能發生緩衝區溢出
4. 在最壞的狀況下,緩衝區溢出可能容許攻擊者可執行代碼注入到你的進程,尤爲是當 lpString1 是一個基於堆棧的緩衝區

29:StringCchCopy

 

函數功能:

StringCchCopy 函數的功能是複製一個字符串到緩衝區。StringCchCopy 函數要求提供目標緩衝區的長度,以確保寫入數據不會超出緩衝區的末尾。

微軟推薦使用該函數替代如下函數:


strcpy, wcscpy, _tcscpy

lstrcpy

StrCpy



API 函數原型:

HRESULT StringCchCopy(

  _Out_  LPTSTRpszDest,

  _In_  size_t cchDest,

  _In_  LPCTSTR pszSrc

);



參數解析:

參數

含義

pszDest

緩衝區,用於接收拷貝過來的字符串

cchDest

1. 目標緩衝區的大小(字符個數)
2. 該值必須大於或等於 pszSrc + 1(待拷貝字符串的字符+'\0')
3. 這個數不能超過 STRSAFE_MAX_CCH

pszSrc

待拷貝的字符串



返回值:

這個函數返回一個 HRESULT,而不是指向緩衝區的指針。咱們強烈建議您使用 SUCCEEDED 和 FAILED 宏來測試這個函數的返回值。

返回值能夠是如下任意一個值:

返回代碼

描述

S_OK

字符串正常拷貝

STRSAFE_E_INVALID_PARAMETER

1. cchDest 參數的值爲 0
2. cchDest 參數的值大於 STRSAFE_MAX_CCH

STRSAFE_E_INSUFFICIENT_BUFFER

1. 因緩衝區空間不足致使失敗
2. 結果被截斷,當仍然包含'\0'結尾
3. 若是截斷操做能夠被接受,則不必定被看做是失敗




 

30:lstrcpy

 

函數功能:

lstrcpy 函數的功能是複製一個字符串到緩衝區。

注意:實際編程中不要再使用該函數,請使用 StringCchCopy 代替。


API 函數原型:

LPTSTR WINAPI lstrcpy(

  _Out_  LPTSTRlpString1,

  _In_  LPTSTR lpString2

);

 


參數解析:

參數

含義

lpString1

1. 緩衝區,用於接收來自 lpString2 參數指向的字符串
2. 該緩衝區必須足夠容納字符串和'\0'

lpString2

待拷貝的字符串



返回值:
1. 若是函數調用成功,返回指向緩衝區的指針;
2. 若是函數調用失敗,返回值是 NULL,而且 lpString1 可能會變成非 '\0' 結束的字符串。

安全建議:

1. 不正確的使用 lstcpy 函數,可能會損害應用程序的安全性
2. lstrcpy 函數使用結構化異常處理(SEH)來捕捉訪問衝突和其餘錯誤。當該函數捕獲 SEH 錯誤,若是沒有以'\0'結尾的字符串,則返回 NULL,且不把錯誤通知調用者。所以,把空間不足做爲錯誤的條件是不安全的
3. lpString1 必須足夠大,以增長 lpString2 和結束'\0',不然可能發生緩衝區溢出
4. 在最壞的狀況下,緩衝區溢出可能容許攻擊者可執行代碼注入到你的進程,尤爲是當 lpString1 是一個基於堆棧的緩衝區


 

 

31:GET_X_LPARAM和 GET_Y_LPARAM 宏

 

宏功能:

經過 lParam 參數得到相關消息觸發的座標 (x , y)

宏定義:

#define LOWORD(lp)          ((WORD)(((DWORD_PTR)(lp)) &0xffff))

#define HIWORD(lp)          ((WORD)((((DWORD_PTR)(lp)) >>16) & 0xffff))

 

#define GET_X_LPARAM(lParam)        ((int)(short)LOWORD(lParam))

#define GET_Y_LPARAM(lParam)        ((int)(short)HIWORD(lParam))

 


參數解析:

參數

含義

lParam

將要被轉換的 lParam 參數



返回值:
1. GET_X_LPARAM(lParam) 返回座標的 x 值;
2. GET_Y_LPARAM(lParam) 返回座標的 y 值。

重要備註:
1. 使用該宏須要包含頭文件:windowsx.h。
2. 不要再使用 LOWORD 和 HIWORD 去獲取鼠標的座標了,由於在多顯示器的狀況下會獲得錯誤的座標。


 

32:TEXTMETRIC 結構

 

TEXTMETRIC 結構

TEXTMETRIC 結構記錄當前設備環境中有關字體的各類信息。

TEXTMETRIC 結構成員的值的單位取決於設備環境中當前選定的映射模式,默認的映射模式是MM_TEXT,因此它們的值是以像素爲單位的。

結構原型:

typedef struct tagTEXTMETRIC

{

  LONG  tmHeight;

  LONG  tmAscent;

  LONG  tmDescent;

  LONG  tmInternalLeading;

  LONG  tmExternalLeading;

  LONG  tmAveCharWidth;

  LONG  tmMaxCharWidth;

  LONG  tmWeight;

  LONG  tmOverhang;

  LONG  tmDigitizedAspectX;

  LONG  tmDigitizedAspectY;

  TCHAR tmFirstChar;

  TCHAR tmLastChar;

  TCHAR tmDefaultChar;

  TCHAR tmBreakChar;

  BYTE  tmItalic;

  BYTE  tmUnderlined;

  BYTE  tmStruckOut;

  BYTE  tmPitchAndFamily;

  BYTE  tmCharSet;

} TEXTMETRIC, *PTEXTMETRIC;


成員解析:

成員

含義

tmHeight

字符高度(tmAscent + tmDescent)

tmAscent

字符上部高度(基線以上)

tmDescent

字符下部高度(基線如下)

tmInternalLeading

內部間距(包含在 tmHeight 中),該間距一般被用於顯示重音符號

tmExternalLeading

外部間距,這個值是字體設計者建議在兩行文字間留出的空間大小

tmAveCharWidth

1. 字體中小寫字符的平均寬度(通常定義爲字母 x 的寬度)
2. 字體中大寫字符的平均寬度通常是該值的 1.5 倍計算
3. 此值不包括字體所須要的加粗和傾斜字符

tmMaxCharWidth

字體中最寬字符的寬度

tmWeight

字體的粗細輕重程度

tmOverhang

加入某些拼接字體上的附加高度

tmDigitizedAspectX

字體設計所針對的設備水平方向

tmDigitizedAspectY

字體設計所針對的設備垂直方向

tmFirstChar

爲字體定義的第一個字符

tmLastChar

爲字體定義的最後一個字符

tmDefaultChar

字體中所沒有字符的替代字符

tmBreakChar

定義文本對齊截斷操做所顯示的字符

tmItalic

若是該值非零,則爲斜體字體

tmUnderlined

若是該值非零,則爲帶下橫線字體

tmStruckOut

若是該值非零,則爲帶刪除線字體(字符中間畫一條線)

tmPitchAndFamily

1. 若是低位爲 0,表示等寬字體,小寫和大寫字母平均寬度同樣
2. 若是低位爲 1,表示變寬字體,大寫字母是小寫平均寬度的 3/2 倍

tmCharSet

字體的字符集




 

 

33: GetTextMetrics

 

函數功能:

GetTextMetrics 函數將當前字體的信息填充到指定緩衝區(TEXTMETRIC結構

API 函數原型:

BOOL GetTextMetrics(

  _In_  HDC hdc,

  _Out_  LPTEXTMETRIClptm

);


參數解析:

參數

含義

hdc

設備環境句柄

lptm

指向 TEXTMETRIC結構的指針,該結構用於得到字體信息



返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。


備註:
1. 要肯定一種字體是否爲 TrueType 字體,能夠經過調用 GetTextMetrics 函數,而後檢查TEXTMETRIC.tmPitchAndFamily 的值是否爲 TMPF_TRUETYPE
2. 注意,調用 GetDC 函數返回的是一個未初始化的 DC,它具備「系統」(一個位圖字體)做爲默認字體。所以你須要先選擇一種字體到 DC


 

34:GetSystemMetrics

 

函數功能:

GetSystemMetrics 函數返回 Windows 中各類圖形項(圖標、鼠標指針、標題欄和滾動條等)的尺寸信息。

在不一樣的顯卡和驅動中,這些尺寸是不同的,爲了在程序中作到與設備無關的圖形輸出,GetSystemMetrics是一個很重要的函數。

注意:GetSystemMetrics 函數獲取的全部尺寸均以像素爲單位。

API 函數原型:

註釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。

int WINAPI GetSystemMetrics(

  _In_  intnIndex

);



參數解析:

參數

含義

nIndex

該參數是一個索引值,函數返回該索引值對應的配置信息


nIndex 參數是一個索引值,能夠是如下列表中任意一個:

注意:

全部 SM_CX* 開頭表示寬(橫向),SM_CY* 開頭表示高(縱向),若是是返回布爾類型的數據,用非 0 值表示 TRUE,用 0 表示 FALSE


註釋:括號內表明宏的值

 

 

索引值

含義

SM_ARRANGE(56)

指定系統如何排列最小化窗口

SM_CLEANBOOT(67)

指定系統如何啓動:
返回 0 表明 Normal boot(正常開機)
返回 1 表明 Fail-safe boot(故障安全引導)
返回 2 表明 Fail-safe with network boot(故障安全引導,帶網絡)
注:故障安全引導(也稱爲 SafeBoot,SafeMode,或者 CleanBoot)其實就是咱們平時所說的「安全模式」,該模式會繞過用戶啓動文件

SM_CMONITORS(80)

有多少個顯示器

SM_CMOUSEBUTTONS(43)

鼠標上有多少個按鈕,若是爲 0 則沒有安裝鼠標

SM_CONVERTIBLESLATEMODE(0x2003)

筆記本電腦或平板模式,0 爲平板模式,非 0 表示其餘模式

SM_CXBORDER(5)

1. 一個窗口邊框的寬
2. 若是 Windows 爲 3D 形態,則等同於 SM_CXEDGE 參數

SM_CXCURSOR(13)

1. 光標的寬
2. 系統不能建立其餘尺寸的光標

SM_CXDLGFRAME(7)

這個值與 SM_CXFIXEDFRAME 是相同的

SM_CXDOUBLECLK(36)

雙擊有效的矩形區域的寬度

SM_CXDRAG(68)

鼠標在某個矩形內單擊移動被認爲是拖拽

SM_CXEDGE(45)

3-D 邊框的寬度

SM_CXFIXEDFRAME(7)

1. 具備標題欄但不能夠調整大小的窗口邊框的寬度
2. 這個值等同於 SM_CXDLGFRAME

SM_CXFOCUSBORDER(83)

1. DrawFocusRect 函數畫出的矩形左右邊框的寬度
2. Windows 2000:不支持

SM_CXFRAME(32)

這個值等同於 SM_CXSIZEFRAME

SM_CXFULLSCREEN(16)

客戶區在全屏模式下的寬度

SM_CXHSCROLL(21)

水平滾動條上箭頭位圖的寬度

SM_CXHTHUMB(10)

水平滾動條滑塊的寬度

SM_CXICON(11)

1. 圖標的默認寬度 
2. LoadIcon 函數只能載入該寬度和 SM_CYICON 指定高度的圖標

SM_CXICONSPACING(38)

一個網格單元的大圖標視圖中項的寬度

SM_CXMAXIMIZED(61)

最大化頂級窗口的寬度

SM_CXMAXTRACK(59)

一個具備標題欄及可調整大小的窗口所能達到的最大寬度

SM_CXMENUCHECK(71)

菜單上位圖的寬度

SM_CXMENUSIZE(54)

菜單條按鈕的寬度

SM_CXMIN(28)

窗口的最小寬度

SM_CXMINIMIZED(57)

最小化窗口的寬度

SM_CXMINSPACING(47)

各個最小化窗體所佔的矩形的寬度,該值須要大於等於 SM_CXMINIMIZED

SM_CXMINTRACK(34)

1. 窗口支持拖拽的最小寬度
2. 當窗口小於此值時不容許拖拽
3. 能夠經過處理 WM_GETMINMAXINFO 消息來覆蓋此值

SM_CXPADDEDBORDER(92)

1. 帶標題欄窗口邊框的填充量
2. Windows XP/2000:不支持

SM_CXSCREEN(0)

1. 主顯示屏的屏幕寬度
2. 該值與 GetDeviceCaps(hdcPrimaryMonitor, HORZRES) 結果一致

SM_CXSIZE(30)

標題欄上按鈕的寬度

SM_CXSIZEFRAME(32)

可調整大小的窗口的邊框的寬度

SM_CXSMICON(49)

推薦的小圖標的寬度(通常出如今窗口標題欄)

SM_CXSMSIZE(52)

小標題按鈕的寬度

SM_CXVIRTUALSCREEN(78)

虛擬屏幕的寬度(虛擬屏幕是全部顯示器的邊框)

SM_CXVSCROLL(2)

垂直滾動條的寬度

SM_CYBORDER(6)

1. 一個窗口邊框的高
2. 若是 Windows 爲 3D 形態,則等同於 SM_CYEDGE 參數

SM_CYCAPTION(4)

標題區域的高度

SM_CYCURSOR(14)

1. 光標的高
2. 系統不能建立其餘尺寸的光標

SM_CYDLGFRAME(8)

這個值與 SM_CYFIXEDFRAME 是相同的

SM_CYDOUBLECLK(37)

雙擊有效的矩形區域的高度

SM_CYDRAG(69)

鼠標在某個矩形內單擊移動被認爲是拖拽

SM_CYEDGE(46)

3-D 邊框的高度

SM_CYFIXEDFRAME(8)

1. 具備標題欄但不能夠調整大小的窗口邊框的高度
2. 這個值等同於 SM_CYDLGFRAME

SM_CYFOCUSBORDER(84)

1. DrawFocusRect 函數畫出的矩形上下邊框的高度
2. Windows 2000:不支持

SM_CYFRAME(33)

這個值等同於 SM_CYSIZEFRAME

SM_CYFULLSCREEN(17)

客戶區在全屏模式下的高度

SM_CYHSCROLL(3)

水平滾動條上箭頭位圖的高度

SM_CYICON(12)

1. 圖標的默認高度
2. LoadIcon 函數只能載入該高度和 SM_CXICON 指定寬度的圖標

SM_CYICONSPACING(39)

一個網格單元的大圖標視圖中項的高度

SM_CYKANJIWINDOW(18)

對於系統的雙字節字符集版本,這個是漢字在窗口底部的高度

SM_CYMAXIMIZED(62)

最大化頂級窗口的高度

SM_CYMAXTRACK(60)

一個具備標題欄及可調整大小的窗口所能達到的最大高度

SM_CYMENU(15)

單行菜單欄的高

SM_CYMENUCHECK(72)

菜單上位圖的高度

SM_CYMENUSIZE(55)

菜單條按鈕的高度

SM_CYMIN(29)

窗口的最小高度

SM_CYMINIMIZED(58)

最小化窗口的高度

SM_CYMINSPACING(48)

各個最小化窗體所佔的矩形的高度,該值須要大於等於 SM_CYMINIMIZED

SM_CYMINTRACK(35)

1. 窗口支持拖拽的最小高度
2. 當窗口小於此值時不容許拖拽
3. 能夠經過處理 WM_GETMINMAXINFO 消息來覆蓋此值

SM_CYSCREEN(1)

1. 主顯示屏的屏幕高度
2. 該值與 GetDeviceCaps(hdcPrimaryMonitor, VERTRES) 結果一致

SM_CYSIZE(31)

標題欄上按鈕的高度

SM_CYSIZEFRAME(33)

可調整大小的窗口的邊框的高度

SM_CYSMCAPTION(51)

小標題的高度

SM_CYSMICON(50)

推薦的小圖標的高度(通常出如今窗口標題欄)

SM_CYSMSIZE(53)

小標題按鈕的高度

SM_CYVIRTUALSCREEN(79)

虛擬屏幕的高度(虛擬屏幕是全部顯示器的邊框)

SM_CYVSCROLL(20)

垂直滾動條的寬度

SM_CYVTHUMB(9)

垂直滾動條滑塊框的高度

SM_DBCSENABLED(42)

若是 User32.dll 支持 DBCS 返回非 0 值,不然返回 0

SM_DEBUG(22)

若是已安裝的 User.exe 的調試版本返回非 0 值,不然返回 0

SM_DIGITIZER(94)

1. 若是當前的操做系統是 Windows 7 或者 Windows Server 2008 R2 而且 Tablet PC input 服務已啓動,則返回非 0 值,不然返回 0
2. 返回值是一個按位掩碼,指定設備支持的數字化儀輸入的類型
3. Windows Server 2008,Windows Vista 和 Windows XP/2000:不支持

SM_IMMENABLED(82)

若是啓用了輸入法管理器或輸入法編輯器功能,則返回非 0,不然返回 0

SM_MAXIMUMTOUCHES(95)

1. 若是有在系統中的數字化儀,則返回非 0,不然返回 0
2. Windows Server 2008,Windows Vista 和 Windows XP/2000:不支持

SM_MEDIACENTER(87)

若是當前的操做系統是 Windows XP(MCE,媒體中心版),則返回非 0,不然返回 0

SM_MENUDROPALIGNMENT(40)

若是下來菜單相應的菜單欄項目是右對齊的,則返回非 0,不然若是是左對齊返回 0

SM_MIDEASTENABLED(74)

若是系統啓用了希伯來語和阿拉伯語的語言,則返回非 0,不然返回 0

SM_MOUSEPRESENT(19)

1. 若是安裝了鼠標返回非 0,不然返回 0 
2. 因爲支持虛擬鼠標而且有些系統是經過檢測端口是否存在,因此該值不多爲 0

SM_MOUSEHORIZONTALWHEELPRESENT(91)

若是鼠標有水平滾動輪,則返回非 0,不然返回 0

SM_MOUSEWHEELPRESENT(75)

若是鼠標有垂直滾動輪,則返回非 0,不然返回 0

SM_NETWORK(63)

1. 若是存在網絡,則返回值最後一位被設置爲 1,不然返回 0 
2. 在其餘位保留供未來使用

SM_PENWINDOWS(41)

若是安裝了 Windows 手寫畫板的擴展,則返回非 0,不然返回 0

SM_REMOTECONTROL(0x2001)

1. 該系統信息是用在終端服務環境下,用於判斷當前的終端服務器會話是否被遠程控制
2. 若是當前的會話被遠程控制,則返回非 0,不然返回 0
3. 你可使用終端服務管理工具,如終端服務管理器(tsadmin.msc)和 shadow.exe 控制遠程會話
4. 當一個會話正在被遠程控制,其餘用戶能夠查看該會話的內容,並有可能與它進行交互

SM_REMOTESESSION(0x1000)

1. 該系統信息是用在終端服務環境下
2. 若是調用進程是與終端服務客戶端會話相關聯,則返回非 0
3. 若是調用進程是與終端服務控制檯會話相關聯,則返回 0
4. Windows Server 2003 和 Windows XP:控制檯會話不必定是物理控制檯

SM_SAMEDISPLAYFORMAT(81)

1. 若是全部的顯示器具備相同的顏色格式,則返回非 0,不然返回 0
2. 兩個顯示器能夠具備相同的比特深度,但不一樣的色彩格式

SM_SECURE(44)

該系統信息被忽略,它老是返回 0

SM_SERVERR2(89)

若是系統是 Windows Server 2003 R2 則返回內部版本號,不然返回 0

SM_SHOWSOUNDS(70)

若是用戶須要應用程序可視化音頻信息,則返回非 0,不然返回 0

SM_SHUTTINGDOWN(0x2000)

1. 若是當前會話關閉返回非 0,不然返回 0
2. Windows 2000:不支持

SM_SLOWMACHINE(73)

若是計算機擁有一個低端(慢速)處理器,則返回非 0,不然返回 0

SM_STARTER(88)

若是當前的操做系統是 Windows 7 入門版,Windows Vista 入門版,或 Windows XP 入門版,則返回非 0,不然返回 0

SM_SWAPBUTTON(23)

若是鼠標左右鍵的含義互相交換,則返回非 0,不然返回 0

SM_SYSTEMDOCKED(0x2004)

反映了底座模式,返回 0 爲非底座模式,不然返回非 0

SM_TABLETPC(86)

1. 若是當前的操做系統是 Windows XP Tablet PC 版,或者若是當前的操做系統是 Windows Vista 或 Windows 7 且 Tablet PC input 服務已啓動,則返回非 0,不然返回 0
2. SM_DIGITIZER 標誌表示經過運行 Windows 7 或 Windows Server 2008 R2 的設備支持的數字化儀輸入的類型

SM_XVIRTUALSCREEN(76)

1. 虛擬屏幕左側的座標(虛擬屏幕是全部顯示器的邊框)
2. SM_CXVIRTUALSCREEN 標誌爲虛擬屏幕的寬度

SM_YVIRTUALSCREEN(77)

1. 虛擬屏幕頂側的座標(虛擬屏幕是全部顯示器的邊框)
2. SM_CYVIRTUALSCREEN 標誌爲虛擬屏幕的高度



返回值:

1. 若是函數調用成功,返回值索引參數對應的配置信息;

2. 若是函數調用失敗,返回值是 0。


 

 

 

 

 

35:SetScrollRange

 

函數功能:

SetScrollRange 函數設置所指定滾動條範圍的最小值和最大值。

注意:SetScrollRange 函數提供了向後的兼容性。但新的應用程序應該提倡使用 SetScrollInfo 函數代替。

API 函數原型:
註釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。

BOOL SetScrollRange(

  _In_  HWNDhWnd,

  _In_  intnBar,

  _In_  intnMinPos,

  _In_  intnMaxPos,

  _In_  BOOLbRedraw

);

 



參數解析:

參數

含義

hWnd

1. 滾動條控件的句柄或帶有標準滾動條窗體的句柄
2. 由 nBar 參數的值肯定

nBar

指定將要設置哪類滾動條的參數:
1. SB_CTL:設置滾動條控件的範圍,要求參數 hwnd 必須是滾動條控件的句柄
2. SB_HORZ:設置窗體的標準水平滾動條的範圍
3. SB_VERT:設置窗體的標準垂直滾動條的範圍

nMinPos

指定滾動位置的最小值

nMaxPos

指定滾動位置的最大值

bRedraw

指定滾動條是否被重畫以反映變化(若是這個參數爲 TRUE,滾動條將被重畫;若是爲 FALSE 則不被重畫)



返回值:
1. 若是函數調用成功,返回值爲非 0;
2. 若是函數調用失敗,返回值爲 0。

備註:
1. 將 SetScrollRange 函數中的 nMinPos 和 nMaxPos 參數設置爲同樣的值,能夠達到隱藏滾動條的目的。但在處理滾動條消息時,應用程序不該該調用 SetScrollRange 函數來隱藏滾動條。新的應用程序應該調用ShowScrollBar 函數來隱藏滾動條。

2. 若是調用 SetScrollPos 函數以後立刻調用 SetScrollRange 函數,則 SetScrollPos 函數中的 bRedraw 參數必定要設置爲零值(FALSE),以防止滾動條被畫兩次。

 

3. 標準滾動條的缺省範圍是 0 到100。滾動條控件的缺省值爲 NULL(參數 nMinPos 和 nMaxPos 的值均爲零)。兩個範圍值之間的不一樣之處在於由參數 nMinPos 和 nMaxPos 指定,不過不能超過 MAXLONG 定義的大小。

4. 由於說明滾動條位置的消息 WM_HSCROLL 和 WM_VSCROLL 是 16 位數據,因此那些只依賴於說明位置數據消息的應用程序在SetScrollRange 函數的參數 nMaxPos 中有一個實際最大值 65,535。可是,由於 SetScrolllnfo,SetScrollPos, SetScrollRange,GetScrolllnfo,GetScrollPos 和 GetScrollRange 函數都支持 32 位的滾動條位置數據,因此有一個解決 16 位 WM_HSCROLL 和WM_VSCROLL 消息阻礙的途徑,請參見函數 GetScrolllnfo 的有關技術說明。

5. 若是參數 nBar 設置爲 SB_CTL 而且參數 hWnd 所標識的不是一個標準的滾動條控件。系統將發送一個 SBM_SETRANGE 消息到窗體用以設置滾動條消息。這將容許 SetScrollRange 函數操做一個定製的僞滾動條控件。若是窗體沒有處理SBM_SETRANGE 消息,SetScrollRange 函數將調用失敗。


 

 

36:GetScrollPos

 

函數功能:

GetScrollPos 函數獲取指定滾動條中滾動按鈕的當前位置。當前位置是一個根據當前滾動範圍而定的相對值。例如,若是滾動範圍是 0~10,滾動按鈕剛好在中間的位置,則其當前位置就爲 50。

注意:該函數提供了向後兼容性,新的應用程序應該使用 GetScrollInfo 函數代替。


API 函數原型:

註釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。

int GetScrollPos(

  _In_  HWNDhWnd,

  _In_  intnBar

);


參數解析:

參數

含義

hWnd

1. 滾動條控件的句柄或帶有標準滾動條窗體的句柄
2. 由 nBar 參數的值肯定

nBar

指定哪類滾動條的當前位置將被返回:
1. SB_CTL:將返回滾動條控件的當前位置,要求參數 hwnd 必須是滾動條控件的句柄
2. SB_HORZ:將返回窗體的標準水平滾動條的當前位置
3. SB_VERT:將返回窗體的標準垂直滾動條的當前位置



返回值:
1. 若是函數調用成功,返回值是指定滾動條的當前位置;
2. 若是函數調用失敗,返回值是 0。

備註:
1. GetScrollPos 函數可使應用程序使用 32 位數據的滾動位置。儘管消息 WM_HSCROLL 和 WM_VSCROLL 只支持 16 位的數據,而 SetScrollPos,SetScrollRange,GetScrollPos 和 GetscrollRange 函數都支持 32 位的滾動條數據,所以,應用程序在處理任 WM_HSCROLL 或 WM_VSCROLL 消息時能夠調用 GetScrollPos 函數來得到 32 位數據的滾動條位。

2. 爲了得到在一個 WM_HSCROLL 或 WM_VSCROLL 消息的 SB_THUMBTRACK 請求碼的滾動框(滑塊)的 32位數據的位置,請使用 GetScrollInfo 函數。

 

 

 

 

37:GetScrollRange

 

函數功能:

GetScrollRange 函數得到指定滾動條的範圍。

注意:GetScrollRange 函數提供了向後的兼容性。但新的應用程序應該提倡使用 GetScrollInfo 函數代替。

API 函數原型:
註釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。

BOOL GetScrollRange(

  _In_  HWND hWnd,

  _In_  int nBar,

  _Out_  LPINTlpMinPos,

  _Out_  LPINTlpMaxPos

);



參數解析:

參數

含義

hWnd

1. 滾動條控件的句柄或帶有標準滾動條窗體的句柄
2. 由 nBar 參數的值肯定

nBar

指定將要設置哪類滾動條的參數:
1. SB_CTL:設置滾動條控件的範圍,要求參數 hwnd 必須是滾動條控件的句柄
2. SB_HORZ:設置窗體的標準水平滾動條的範圍
3. SB_VERT:設置窗體的標準垂直滾動條的範圍

lpMinPos

指向存放最小位置的整型變量

lpMaxPos

指向存放最大位置的整型變量



返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。


備註:
1. 若是指定的窗口沒有標準的滾動條或不是滾動條控件,GetScrollRange 函數將零複製到 lpMinPos 和 lpMaxPos 參數中。

2. 標準滾動條的默認範圍是 0 到 100。滾動條控件的缺省值爲空。

3. 由於說明滾動條位置的消息 WM_HSCROLL 和 WM_VSCROLL 是 16 位數據,因此那些只依賴於說明位置數據消息的應用程序在SetScrollRange 函數的參數 nMaxPos 中有一個實際最大值 65,535。可是,由於 SetScrolllnfo,SetScrollPos, SetScrollRange,GetScrolllnfo,GetScrollPos 和 GetScrollRange 函數都支持 32 位的滾動條位置數據,因此有一個解決 16 位 WM_HSCROLL 和WM_VSCROLL 消息阻礙的途徑,請參見函數 GetScrolllnfo 的有關技術說明。

4. 若是參數 nBar 設置爲 SB_CTL 而且參數 hWnd 所標識的不是一個標準的滾動條控件。系統將發送一個 SBM_GETRANGE 消息到窗體用以設置滾動條消息。這將容許 GetScrollRange 函數操做一個定製的僞滾動條控件。若是窗體沒有處理SBM_GETRANGE 消息,GetScrollRange 函數將調用失敗。

 

 

 

 

 

 

 

38: LOWORD和 HIWORD 宏

 

宏功能:

得到指定 32 位數據的低 16位數據和高 16 位數據。

 

小甲魚舒適提醒:不要使用 LOWORD 和 HIWORD 宏去獲取鼠標的座標,由於在多顯示器的狀況下會獲得錯誤的座標。應該使用 GET_X_LPARAM和 GET_Y_LPARAM 來獲取。


宏定義:

#define LOWORD(lParam)     ((WORD)(((DWORD_PTR)(lParam)) & 0xffff))

#define HIWORD(lParam)     ((WORD)((((DWORD_PTR)(lParam)) >> 16) & 0xffff))



參數解析:

參數

含義

lParam

32 位的目標數據



返回值:
1. LOWORD(lParam) 返回 lParam 的低16 位數據;
2. HIWORD(lParam) 返回 lParam 的高16 位數據。

39: WM_SIZE消息

 

消息含義:

當主窗口的客戶區部分大小改變時,操做系統將給應用程序發送 WM_SIZE 消息。

應用程序經過窗口過程接收該消息(請關注:《Windows程序設計(SDK)》視頻教學)。

消息定義:

#define WM_SIZE                       0x0005

 

參數解析:

wParam:指出窗口的新狀態
wParam 參數能夠是下列值之一:

含義

SIZE_MAXHIDE(4)

當該應用程序的其餘窗口被最大化的時候,消息被髮送往全部的彈出窗口

SIZE_MAXIMIZED(2)

該窗口被最大化

SIZE_MAXSHOW(3)

當該應用程序的其餘窗口已經恢復到原來大小的時候,消息被髮送往全部的彈出窗口

SIZE_MINIMIZED(1)

該窗口被最小化

SIZE_RESTORED(0)

該窗口的大小發生變化,但不是最大化(SIZE_MAXIMIZED)或最小化(MINIMIZED)



lParam:指出當前客戶區的大小(寬度和高度)

1. lParam 參數的低 16 位指定了新窗口的寬度;

2. lParam 參數的高 16 位制定了新窗口的高度。

 

小甲魚舒適提醒:能夠經過 LOWORD和 HIWORD來獲取 lParam 參數的低 16 位和高16 位。


返回值:
1. 若是窗口過程響應該消息,必須返回 0。

 

 

40:WM_VSCROLL消息

 

消息含義:

當窗口的標準垂直滾動條有滾動事件發生時,操做系統向窗口的消息隊列投入一條WM_VSCROLL 消息。

此消息也適用於觸發垂直滾動條控件。

應用程序經過窗口過程接收該消息(請關注:《Windows程序設計(SDK)》視頻教學)。

消息定義:

#define WM_VSCROLL                    0x0115



參數解析:

wParam:當 LOWORD(wParam) 的結果(取低 16 位)爲SB_THUMBPOSITION 或 SB_THUMBTRACK 時,HIWORD(wParam) 的值(取高 16 位)是當前滑塊在滾動框的位置。

小甲魚舒適提示:

當 wParam 的低 16 位的值是 SB_THUMBTRACK 時,wParam 的高 16 位是用戶拖動滑塊的當前位置

當 wParam 的低 16 位的值是 SB_THUMBPOSITION 時,wParam 的高 16 位是用戶鬆開鼠標按鍵時滑塊的最終位置

對於其餘的滾動操做,wParam 的高 16 位應該被忽略

LOWORD(wParam) 的結果(取低 16 位)表明了鼠標在滾動條上的動做,這個值被稱之爲「通知碼」,由一個以「SB」開頭的標識符定義。

該通知碼是下列值之一:

含義

SB_BOTTOM

滾動到底部(鍵盤 End 按鍵觸發)

SB_ENDSCROLL

完成滾動操做(鬆開鼠標)

SB_LINEDOWN

向下滾動一行

SB_LINEUP

向上滾動一行

SB_PAGEDOWN

向下滾動一頁

SB_PAGEUP

向上滾動一頁

SB_THUMBPOSITION

1. 用戶有拖動滾動條的操做,並已經鬆開了鼠標按鈕
2. HIWORD(wParam) 獲得用戶鬆開鼠標按鍵時滑塊的最終位置

SB_THUMBTRACK

1. 用戶拖動滾動條滑塊觸發此消息
2. 此消息被重複發送,直到用戶鬆開鼠標按鈕
3. HIWORD(wParam) 獲得用戶拖動滑塊的當前位置

SB_TOP

滾動到頂端(鍵盤 Home 按鍵觸發)



lParam:若是該參數等於 0,說明它是標準的窗口滾動條;若是該參數等於滾動條窗口句柄,說明它是滾動條控件。

返回值:
1. 若是窗口過程響應該消息,必須返回 0。

 

 

 

41:WM_HSCROLL消息

 

消息含義:

當窗口的標準水平滾動條有滾動事件發生時,操做系統向窗口的消息隊列投入一條WM_HSCROLL 消息。

此消息也適用於觸發水平滾動條控件。

應用程序經過窗口過程接收該消息(請關注:《Windows程序設計(SDK)》視頻教學)。


消息定義:

#define WM_HSCROLL                    0x0114



參數解析:

wParam:wParam:當 LOWORD(wParam) 的結果(取低 16 位)爲SB_THUMBPOSITION 或 SB_THUMBTRACK 時,HIWORD(wParam) 的值(取高 16 位)是當前滑塊在滾動框的位置。

小甲魚舒適提示:

當 wParam 的低 16 位的值是 SB_THUMBTRACK 時,wParam 的高 16 位是用戶拖動滑塊的當前位置

當 wParam 的低 16 位的值是 SB_THUMBPOSITION 時,wParam 的高 16 位是用戶鬆開鼠標按鍵時滑塊的最終位置

對於其餘的滾動操做,wParam 的高 16 位應該被忽略

LOWORD(wParam) 的結果(取低 16 位)表明了鼠標在滾動條上的動做,這個值被稱之爲「通知碼」,由一個以「SB」開頭的標識符定義。

該通知碼是下列值之一:

含義

SB_ENDSCROLL

完成滾動操做(鬆開鼠標)

SB_LEFT

滾動到左邊

SB_RIGHT

滾動到右邊

SB_LINELEFT

向左滾動一行

SB_LINERIGHT

向右滾動一行

SB_PAGELEFT

向左滾動一頁

SB_PAGERIGHT

向右滾動一頁

SB_THUMBPOSITION

1. 用戶有拖動滾動條的操做,並已經鬆開了鼠標按鈕
2. HIWORD(wParam) 獲得用戶鬆開鼠標按鍵時滑塊的最終位置

SB_THUMBTRACK

1. 用戶拖動滾動條滑塊觸發此消息
2. 此消息被重複發送,直到用戶鬆開鼠標按鈕
3. HIWORD(wParam) 獲得用戶拖動滑塊的當前位置

lParam:若是該參數等於 0,說明它是標準的窗口滾動條;若是該參數等於滾動條窗口句柄,說明它是滾動條控件。

返回值:
1. 若是窗口過程響應該消息,必須返回 0。

 

 

 

42:InvalidateRect

 

函數功能:

InvalidateRect 函數向指定的窗體更新區域添加一個矩形,而後窗口客戶區域的這一部分將被從新繪製。

API 函數原型:

註釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。

BOOL InvalidateRect(

  _In_  HWNDhWnd,

  _In_  constRECT *lpRect,

  _In_  BOOLbErase

);

參數解析:

參數

含義

hWnd

1. 指向待更新的客戶區所在的窗體的句柄
2. 若是爲 NULL,則系統將在函數返回前從新繪製全部的窗口(注意,是全部的窗口),並在函數返回前發送 WM_ERASEBKGND 和 WM_PAINT 消息
3. 不推薦將該參數設置爲 NULL

lpRect

1. 一個指向 RECT結構的指針,指定無效區域的矩形,該矩形將會被從新繪製
2. 若是爲 NULL,則將會重繪整個窗口

bErase

1. 指定更新區域內的背景是否重繪
2. 若是爲 TRUE,調用 BeginPaint函數的時候,背景重繪
3. 若是爲 FALSE,則背景保持不變



返回值:

1. 若是函數調用成功,返回值是非 0;

2. 若是函數調用失敗,返回值是 0。


備註:

1. 在下一個 WM_PAINT 消息產生前,全部 ValidateRect 或 ValidateRgn 函數產生的更新區域會被拼接成一個大的更新區域。
2. 當更新區域不爲空而且窗口的消息隊列中沒有其餘消息,系統向窗口過程發送 WM_PAINT 消息,令其重繪。
3. 若是任何一個更新區域的 bErase 參數爲 TRUE,整個背景會被擦除重繪。

 

 

 

 

43:SCROLLINFO結構

 

SetScrollInfo 函數經過 SCROLLINFO 結構設置滾動條參數(或者 SBM_SETSCROLLINFO 消息),GetScrollInfo 函數也經過 SCROLLINFO 結構得到滾動條參數(或者 SBM_GETSCROLLINFO 消息)。

結構原型:

typedef struct tagSCROLLINFO {

  UINT cbSize;

  UINT fMask;

  int  nMin;

  int  nMax;

  UINT nPage;

  int  nPos;

  int  nTrackPos;

} SCROLLINFO, *LPCSCROLLINFO;


成員解析:

成員

含義

cbSize

1. 該結構的大小(以字節爲單位)
2. 一般使用 sizeof(SCROLLINFO) 得到

fMask

指定被設置或獲取的滾動條參數,該參數能夠由下列標誌組成:
1. SIF_ALL:至關於 SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS
2. SIF_DISABLENOSCROLL:若是當前窗口不須要滾動條時,禁用滾動條取代隱藏滾動條(該標誌只用於 SetScrollInfo 函數中)
3. SIF_PAGE:指出須要設置或獲取頁面的大小到 nPage 中(若是不但願滑塊大小發生變化,則不要設置此標誌)
4. SIF_POS:指出須要設置或獲取滾動條滑塊的位置到 nPos 中
5. SIF_RANGE:指出須要在 nMin 和 nMax 設置或獲取範圍的最小值和最大值
6. SIF_TRACKPOS:指出當 WM_VSCROLL 或 WM_HSCROLL 消息的通知碼爲 SB_THUMBTRACK 或 SB_THUMBPOSITION 時,返回當前滑塊的位置到 nTrackPos(該標誌只用在 GetScrollInfo 函數中,而且該值爲一個 32 位整數)

nMin

滾動條範圍的最小值

nMax

滾動條範圍的最大值

nPage

頁面的大小,滾動條經過這個值來動態肯定滑塊的大小

nPos

滑塊的位置

nTrackPos

當前滑塊的位置


如在使用上有任何不一樣,能夠參考小甲魚的《Windows程序設計(SDK)》第 14 講:滾動條3

 

 

 

 

 

44:SetScrollInfo

 

函數功能:

SetScrollInfo 函數用於設置滾動條的參數,其中包括:滾動範圍的最小值和最大值,頁面的大小,以及滑塊的位置。若是須要,該函數還能夠重繪滾動條。

API 函數原型:

int SetScrollInfo(

  _In_  HWNDhwnd,

  _In_  intfnBar,

  _In_  LPCSCROLLINFOlpsi,

  _In_  BOOLfRedraw

);


參數解析:

參數

含義

hwnd

1. 滾動條控件的句柄或帶有標準滾動條窗體的句柄
2. 由 fnBar 參數的值肯定

fnBar

指定將要設置哪類滾動條的參數:
1. SB_CTL:設置滾動條控件的範圍,要求參數 hwnd 必須是滾動條控件的句柄
2. SB_HORZ:設置窗體的標準水平滾動條的範圍
3. SB_VERT:設置窗體的標準垂直滾動條的範圍

lpsi

1. 指向 SCROLLINFO結構
2. 在調用 SetScrollInfo 函數前,需先設置 SCROLLINFO結構中 cbSize 成員以標識結構大小,設置 fMask 成員以說明待設置的滾動條參數,而且在適當的成員中指定新的參數值

fRedraw

指定滾動條是否被重畫以反映變化(若是這個參數爲 TRUE,滾動條將被重畫;若是爲 FALSE 則不被重畫)


返回值
SetScrollInfo 函數的返回值是滾動按鈕的當前位置。

備註:

SetScrollInfo 函數將會檢查 SCROLLINFO結構中的 nPage 和 nPos 兩個成員的值的範圍(nPage 成員的值必須是 0 ~ nMax-nMin+1;nPos 成員的值必須是在 nMin 到 nMax - max(nPage-1, 0) 之間),若是任何一個值超過了範圍,函數將在指定範圍內爲它設置一個值。

如在使用上有任何不一樣,能夠參考小甲魚的《Windows程序設計(SDK)》第 14 講:滾動條3

 

 

 

 

45: GetScrollInfo

 

函數功能:

GetScrollInfo 函數用於獲取滾動條的參數,其中包括:滾動範圍的最小值和最大值,頁面的大小,以及滑塊的位置。

API 函數原型:

BOOL GetScrollInfo(

  _In_    HWND hwnd,

  _In_    int fnBar,

  _Inout_  LPSCROLLINFOlpsi

);



參數解析:

參數

含義

hwnd

1. 滾動條控件的句柄或帶有標準滾動條窗體的句柄
2. 由 fnBar 參數的值肯定

fnBar

指定將要設置哪類滾動條的參數:
1. SB_CTL:設置滾動條控件的範圍,要求參數 hwnd 必須是滾動條控件的句柄
2. SB_HORZ:設置窗體的標準水平滾動條的範圍
3. SB_VERT:設置窗體的標準垂直滾動條的範圍

lpsi

1. 指向 SCROLLINFO結構
2. 在調用 GetScrollInfo 函數前,需先設置 SCROLLINFO結構中 cbSize 成員以標識結構大小,設置 fMask 成員以說明待獲取的滾動條參數
3. 函數返回前,GetScrollInfo 函數拷貝指定的參數給 SCROLLINFO 結構中適當的成員



返回值:

1. 若是函數成功獲取滾動條的參數,則返回值是非 0;
2. 若是函數沒有獲取滾動條的參數,則返回值是 0。

備註:
1. 儘管滾動條消息 WM_HSCROLL 和 WM_VSCROLL 能夠經過 HIWORD(wParam) 取得滾動條的位置(當 LOWORD(wParam) 通知碼爲 SB_THUMBPOSITION 和 SB_THUMBTRACK 的時候),但獲得是 16 位的滾動條位置。若是想要獲得 32 位的滾動條數據,可使用 GetScrollInfo 函數。

2. 爲了在 WM_HSCROLL 或 WM_VSCROLL 的 SB_THUMBTRACK 通知碼中得到滾動條滑塊的 32 位的位置,能夠經過調用 GetScrollInfo 函數並設置 SCROLLINFO結構 fMask 成員的值爲 SIF_TRACKPOS 實現。GetScrollInfo 函數將滾動條滑塊的位置存放在 SCROLLINFO 結構的 nTrackPos 成員中。這將使得用戶在移動滑塊時你能夠及時得到滑塊的位置。

【API檔案】版權歸魚C工做室(www.fishc.com)全部,轉載請註明來源。

示例:

SCROLLINFO si;

case WM_HSCROLL:

   switch(LOWORD(wparam)) {

       case SB_THUMBTRACK:

         // Initialize SCROLLINFO structure

 

           ZeroMemory(&si, sizeof(si));

           si.cbSize = sizeof(si);

           si.fMask = SIF_TRACKPOS;

 

         // Call GetScrollInfo to get current tracking 

         //    position in si.nTrackPos

 

           if (!GetScrollInfo(hwnd, SB_HORZ, &si) )

               return 1; // GetScrollInfo failed

           break;

       .

       .

       .

    }

 


如在使用上有任何不一樣,能夠參考小甲魚的《Windows程序設計(SDK)》第 14 講:滾動條3

 

 

 

 

46:ScrollWindow

函數功能:

ScrollWindow 函數滾動指定窗口的客戶區內容。

注意:該函數提供了向後兼容性,新的應用程序應該使用 ScrollWindowsEx 函數代替。

API 函數原型:

註釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。

 

BOOL ScrollWindow(

  _In_  HWNDhWnd,

  _In_  intXAmount,

  _In_  intYAmount,

  _In_  constRECT *lpRect,

  _In_  constRECT *lpClipRect

);



參數解析:

參數

含義

hWnd

指向客戶區將被滾動的窗口句柄

XAmount

1. 在設備單元中,指定水平滾動的數量
2. 若是窗口類風格爲 CS_OWNDC 或 CS_CLASSDC,則此參數則使用邏輯單元而非設備單元
3. 當向左滾動窗口的內容時,該參數的值必須是負數

YAmount

1. 在設備單元中,指定垂直滾動的數量
2. 若是窗口類風格爲 CS_OWNDC 或 CS_CLASSDC,則此參數則使用邏輯單元而非設備單元
3. 當向上滾動窗口的內容時,該參數的值必須是負數

lpRect

1. 指向 RECT結構指針,該結構指定了將要滾動的客戶區範圍
2. 若是此參數爲 NULL,則整個客戶區域將被滾動

lpClipRect

1. 指向 RECT結構指針,該結構指定了要滾動的裁剪區域
2. 只有這個矩形中的內容纔會被滾動(在矩形以外的內容不會被影響,即便它們是在 lpRect 指定的矩形以內)



返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。


備註:

1. 若是在被滾動的窗口中含有插入符,ScrollWindow 函數將自動隱藏插入符,以防它被擦掉。當滾動結束後再恢復插入符,插入符的位置相應的被調整。

2. 未被 ScrollWindow 函數覆蓋的區域不會被重繪,但該區域會與窗口更新區域組合,當應用程序最終收到 WM_PAINT 的消息時,組合區域統一重繪。爲了在滾動操做的同時重畫未覆蓋區域,則應在調用 ScrollWindow 函數後立刻調用UpdateWindow 函數。

3. 若是 lpRect 參數的值爲 NULL,則窗口中的任何子窗口的位置由參數 XAmount 和 Yamount 的數值決定移動距離;窗口中無效的區域(未重繪)也會移動。

4. 當 lpRect 參數爲 NULL 時,ScrollWindow函數能夠執行得更快。

5. 若是 lpRect 參數不爲 NULL,則窗口中的子窗口的位置不改變,窗口中無效的區域(未重繪)也不移動。爲了防止 lpRect 參數不爲 NULL 時更新的問題,須要在調用 ScrollWindow 函數前調用 UpdateWindow 函數重繪窗口。

/*-------------------------------------------------------------------

                【API檔案】ScrollWindow 函數使用例子

                    魚C工做室 -- www.fishc.com

--------------------------------------------------------------------*/

LRESULT CALLBACK WndProc(HWNDhwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

       HDC hdc;

       PAINTSTRUCT ps;

       TEXTMETRIC tm;

       SCROLLINFO si;

 

       static int xClient;     // 客戶區的寬度

       static int yClient;     // 客戶區的高度

       static int xClientMax;  // 客戶區內容顯示的最大寬度(超過此寬度則加入滾動條)

 

       static int xChar;       // 字體的平均水平寬度

       static int yChar;       // 字體的垂直高度

       static int xUpper;      // 字體的大寫字符的水平寬度

 

       static int xPos;        // 當前水平滾動條滑塊的位置

       static int yPos;        // 當前垂直滾動條滑塊的位置

 

       int i;                 // 循環計數器

       int x, y;              // 水平和垂直的座標

 

       int FirstLine;          // 失效區域的第一行(需重繪的第一行)

       int LastLine;          // 失效區域的最後一行((需重繪的最後一行))

       HRESULT hr;

       size_t abcLength;       // 用於存放 abc 數組的長度

 

       // 建立要顯示的行(呃,打印的內容我就不翻譯了吧...)

       #define LINES 28 

       static TCHAR *abc[] = {

               TEXT("anteater"),TEXT("bear"), TEXT("cougar"),

               TEXT("dingo"),TEXT("elephant"), TEXT("falcon"),

               TEXT("gazelle"),TEXT("hyena"), TEXT("iguana"),

               TEXT("jackal"),TEXT("kangaroo"), TEXT("llama"),

               TEXT("moose"),TEXT("newt"), TEXT("octopus"),

               TEXT("penguin"),TEXT("quail"), TEXT("rat"),

               TEXT("squid"),TEXT("tortoise"), TEXT("urus"),

               TEXT("vole"),TEXT("walrus"), TEXT("xylophone"),

               TEXT("yak"),TEXT("zebra"),

               TEXT("This line containswords, but no character. Go figure."),

               TEXT("")

       };

 

       switch (message)

       {

       case WM_CREATE:

               // 得到設備環境句柄

               hdc = GetDC(hwnd);

 

               // 得到文本中字體的大小 

               GetTextMetrics(hdc, &tm);

               xChar = tm.tmAveCharWidth;

               xUpper = (tm.tmPitchAndFamily& 1 ? 3 : 2) * xChar / 2;

               yChar = tm.tmHeight +tm.tmExternalLeading;

 

               // 釋放設備環境句柄 

               ReleaseDC(hwnd, hdc);

 

               // 設置客戶區的最大寬度 

               // (咱們這裏設置爲 48 個小寫字符的寬度 + 12 個大寫字符的寬度)

               xClientMax = 48 * xChar + 12 *xUpper;

 

               return 0;

 

       case WM_SIZE:

               // 得到客戶區的尺寸 

               yClient = HIWORD(lParam);

               xClient = LOWORD(lParam);

 

               // 設置垂直滾動條範圍和頁面大小(設置頁面大小將決定滑塊的粗細)

               si.cbSize = sizeof(si);

               si.fMask = SIF_RANGE | SIF_PAGE;

               si.nMin = 0;

               si.nMax = LINES - 1;

               si.nPage = yClient / yChar;

               SetScrollInfo(hwnd, SB_VERT,&si, TRUE);

 

               // 設置水平滾動條範圍和頁面大小(設置頁面大小將決定滑塊的粗細) 

               si.cbSize = sizeof(si);

               si.fMask = SIF_RANGE | SIF_PAGE;

               si.nMin = 0;

               si.nMax = 2 + xClientMax / xChar;

               si.nPage = xClient / xChar;

               SetScrollInfo(hwnd, SB_HORZ,&si, TRUE);

 

               return 0;

       case WM_HSCROLL:

               // 得到水平滾動條的全部信息

               si.cbSize = sizeof (si);

               si.fMask = SIF_ALL;

               GetScrollInfo(hwnd, SB_HORZ,&si);

 

               // 保存當前滑塊位置,遲些進行比較

               xPos = si.nPos;

               switch (LOWORD(wParam))

               {

                      // 用戶點擊滾動條左邊的三角形

               case SB_LINELEFT:

                      si.nPos -= 1;

                      break;

 

                      // 用戶點擊滾動條右邊的三角形

               case SB_LINERIGHT:

                      si.nPos += 1;

                      break;

 

                      // 用戶點擊滑塊左邊的滾動條軸

               case SB_PAGELEFT:

                      si.nPos -= si.nPage;

                      break;

 

                      // 用戶點擊滑塊右邊的滾動條軸

               case SB_PAGERIGHT:

                      si.nPos += si.nPage;

                      break;

 

                      // 用戶拖動滾動條

               case SB_THUMBTRACK:

                      si.nPos = si.nTrackPos;

                      break;

 

               default:

                      break;

               }

 

               // 設置滾動條滑塊的新位置

               si.fMask = SIF_POS;

               SetScrollInfo(hwnd, SB_HORZ,&si, TRUE);

 

               // 得到滾動條滑塊的位置,因爲窗口調整,它可能不是同一個值

               GetScrollInfo(hwnd, SB_HORZ,&si);

 

               // 與此前的保存的值進行比較,若是不一樣則滾動窗口

               if (si.nPos != xPos)

               {

                      ScrollWindow(hwnd, xChar * (xPos - si.nPos), 0, NULL, NULL);

               }

 

               return 0;

 

       case WM_VSCROLL:

               // 得到垂直滾動條的全部信息

               si.cbSize = sizeof (si);

               si.fMask = SIF_ALL;

               GetScrollInfo(hwnd, SB_VERT,&si);

 

               // 保存當前滑塊位置,遲些進行比較

               yPos = si.nPos;

               switch (LOWORD(wParam))

               {

                      // 用戶點擊鍵盤 Home 按鍵

               case SB_TOP:

                       si.nPos= si.nMin;

                      break;

 

                      // 用戶點擊鍵盤 End 按鍵

               case SB_BOTTOM:

                      si.nPos = si.nMax;

                      break;

 

                      // 用戶點擊滾動條上邊的三角形

               case SB_LINEUP:

                      si.nPos -= 1;

                      break;

 

                      // 用戶點擊滾動條下邊的三角形

               case SB_LINEDOWN:

                      si.nPos += 1;

                      break;

 

                       // 用戶點擊滑塊上邊的滾動條軸

               case SB_PAGEUP:

                      si.nPos -= si.nPage;

                      break;

 

                      // 用戶點擊滑塊下邊的滾動條軸

               case SB_PAGEDOWN:

                      si.nPos += si.nPage;

                      break;

 

                      // 用戶拖動滾動條

               case SB_THUMBTRACK:

                      si.nPos = si.nTrackPos;

                      break;

 

               default:

                      break;

               }

 

               // 設置滾動條滑塊的新位置

               si.fMask = SIF_POS;

               SetScrollInfo(hwnd, SB_VERT,&si, TRUE);

 

               // 得到滾動條滑塊的位置,因爲窗口調整,它可能不是同一個值

               GetScrollInfo(hwnd, SB_VERT,&si);

 

               // 與此前的保存的值進行比較,若是不一樣則滾動窗口

               if (si.nPos != yPos)

               {

                      ScrollWindow(hwnd, 0, yChar * (yPos - si.nPos), NULL, NULL);

                      UpdateWindow(hwnd);

               }

 

               return 0;

 

        caseWM_PAINT:

               // 準備繪製

               hdc = BeginPaint(hwnd, &ps);

 

               // 得到垂直滾動條的位置

               si.cbSize = sizeof (si);

               si.fMask = SIF_POS;

               GetScrollInfo(hwnd, SB_VERT,&si);

               yPos = si.nPos;

 

               // 得到水平滾動條的位置

               GetScrollInfo(hwnd, SB_HORZ,&si);

               xPos = si.nPos;

 

               // 計算須要重繪的區域

               FirstLine = max(0, yPos +ps.rcPaint.top / yChar);

               LastLine = min(LINES - 1, yPos +ps.rcPaint.bottom / yChar);

 

               for (i = FirstLine; i <=LastLine; i++)

               {

                      x = xChar * (1 - xPos);

                      y = yChar * (i - yPos);

 

                      // 使用安全字符串函數得到字符串長度

                      hr = StringCchLength(abc[i], 55, &abcLength);

                      if ((FAILED(hr)) | (abcLength == NULL))

                      {

                              // 獲取字符串長度失敗的提示...

                      }

 

                       // 在客戶區繪製一行數據

                      TextOut(hdc, x, y, abc[i], abcLength);

               }

 

               // 繪製完畢

               EndPaint(hwnd, &ps);

               return 0;

       case WM_DESTROY:

               PostQuitMessage(0);

               return 0;

       }

       return DefWindowProc(hwnd, message, wParam, lParam);

}

 

 

 

 

47:ScrollWidnowEx

 

函數功能:  ScrollWindowEx函數滾動指定窗口的客戶區內容。


API 函數原型:

int ScrollWindowEx(

  _In_  HWND hWnd,

  _In_  int dx,

  _In_  int dy,

  _In_  const RECT *prcScroll,

  _In_  const RECT *prcClip,

  _In_  HRGN hrgnUpdate,

  _Out_  LPRECTprcUpdate,

  _In_  UINT flags

);



參數解析:

參數

含義

hWnd

指向客戶區將被滾動的窗口句柄

dx

1. 在設備單元中,指定水平滾動的數量
2. 在向左滾動時此參數必須爲負值

dy

1. 在設備單元中,指定垂直滾動的數量
2. 在向上滾動時此參數必須爲負值

prcScroll

1. 指向 RECT結構指針,該結構指定了將要滾動的客戶區範圍
2. 若是此參數爲 NULL,則整個客戶區域將被滾動

prcClip

1. 指向 RECT結構指針,該結構指定了要滾動的裁剪區域
2. 只有這個矩形中的內容纔會被滾動(在矩形以外的內容不會被影響,即便它們是在 lpRect 指定的矩形以內)
3. 此參數能夠爲 NULL

hrgnUpdate

1. 指向因爲滾動而無效的區域的句柄
2. 此參數能夠爲 NULL

prcUpdate

1. 指向 RECT結構,該結構指定因爲滾動而無效的矩形的邊界
2. 此參數能夠爲 NULL

flags

指定控制滾動的標誌


flags 參數由下列標誌組合:

標誌

含義

SW_ERASE

經過發送 WM_ERASEBKGND 消息給窗口,令其擦除新的無效區域(需同時指定 SW_INVALIDATE 消息)

SW_INVALIDATE

滾動後,使得 hrgnUpdate 參數指定的區域無效

SW_SCROLLCHILDREN

1. 滾動全部由參數 prcScroll 指定的相交重疊的子窗口
2. 子窗口經過由 dx 和 dy 參數指定的像素的數量滾動
3. 系統會發送 WM_MOVE 消息給全部由參數 prcScroll 指定的相交重疊的子窗口,即使它們可能不移動

SW_SMOOTHSCROLL

Windows 98/Me, Windows 2000/XP:使用平滑滾動,使用 HIWORD(flags) 指出平滑滾動須要多少時間(以毫秒爲單位)



返回值:

1. 若是函數調用成功,返回值是 SIMPLEREGION(矩形的無效區域),COMPLEXREGION(非矩形的無效區域;重疊的矩形)或 NULLREGION(沒有無效區域);
2. 若是函數調用失敗,返回值是 ERROR。


備註:
1. 若是flags 參數的 SW_INVALIDATE 和 SW_ERASE 標誌沒有被設定,那麼 ScrollWindowEx 函數不能使滾動過的區域失效。若是 flags 參數中任何一個標誌被設置,ScrollWindowEx 函數就可使該區域失效。這個區域就不會被更新直到應用程序調用 UpdateWindow 函數,或調用 RedrawWindow 函數(指定 RDW_UPDATENOW 或 RDW_ERASENOW 標誌),或響應 WM_PAINT 消息。

2. 若是窗口擁有 WS_CLIPCHILDREN 類型,那麼由 hrgnUpdate 和 prcUpdate 參數指定的返回區域描述了必須更新的滾動窗口的所有區域,包括所需更新子窗口的任何區域。

3. 若是 flags 參數的 SW_SCROLLCHILDREN 標誌被設置,那麼在子窗口的一部分被滾動時,系統將不能徹底更新屏幕。位於矩形外邊的滾動子窗體部分不被擦除,也不在它的新方向上被重繪。爲了移動子窗體使之徹底不在 prcScroll 參數指定的矩形中,可使用 DeferWindowPos 函數。若是 SW_SCROLLCHILDREN 標誌被設置而且插入符矩形和滾動矩形相交重疊,則光標也從新設置。

4. 全部輸入和輸出座標(prcScroll, prcClip, prcUpdate 和 hrgnUpdate)均被定義爲客戶端,不管窗口是否具 CS_OWNDC 或 CS_CLASSDC 類型。必要的話,還可使用 LPtoDP 和 DPtoLP 函數來轉換邏輯座標和設備座標。

 

 

48:RGB 宏

 

宏功能:

RGB 宏有三個參數(byRed, byGreen, byBlue),功能是將這三個參數轉換爲COLORREF 顏色值。

註釋:COLORREF 顏色被定義爲 DWORD 類型(4 個字節),用於表示 RGB 顏色。

宏定義:

#define RGB(r,g,b)  ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))



參數解析:

參數

含義

byRed

紅色的顏色值

byGreen

綠色的顏色值

byBlue

藍色的顏色值


小甲魚忍不住羅嗦補充一句:色彩中不能再分解的基本色稱之爲原色,紅綠藍即三原色,將它們按照不一樣比例混合,能夠搭配出全部的顏色。


返回值:
1. 返回三個參數轉換後的 COLORREF 顏色值

備註:
1. 每一個顏色能夠指定的顏色值是 0 ~ 255,三個參數同時爲 0,即黑色,同時爲 255 即白色。
2. 經過 GetRValue、GetGValue和 GetBValue 能夠分別從 COLORREF 顏色值中得到紅色、綠色、藍色的顏色值。

 

 

49:SetPixel

 

函數功能:

SetPixel 函數將指定座標處的像素設爲指定的顏色。

API 函數原型:

註釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。

COLORREF SetPixel(

  _In_  HDChdc,

  _In_  intx,

  _In_  inty,

  _In_  COLORREFcrColor

);



參數解析:

參數

含義

hdc

設備環境句柄

x

指定要設置的像素點的 X 軸座標,按邏輯單位表示座標

y

指定要設置的像素點的 Y 軸座標,按邏輯單位表示座標

crColor

1. 指定該像素點的顏色
2. 使用 RGB建立 COLORREF 的顏色值


註釋:COLORREF 顏色被定義爲 DWORD 類型(4 個字節),用於表示 RGB 顏色。

返回值:
1. 若是函數調用成功,那麼返回值就是函數設置像素的 RGB 顏色值(這個值可能與 crColor 指定的顏色有所不一樣,之因此有時發生這種狀況是由於沒有找到對指定顏色進行真正匹配形成的);
2. 若是函數調用失敗,那麼返回值是 -1。

能夠是如下值

返回值

含義

ERROR_INVALID_PARAMETER

一個或者多個參數不正確


備註:

1. 若是像素點座標位於當前剪裁區以外,那麼該函數執行失敗。
2. 不是全部設備都支持 SetPixel 函數。有關詳情,請參考 GetDeviceCaps。

 

 

 

 

50:GetRValue、GetGValue 和 GetBValue 宏

 

宏功能:

GetRValue、GetGValue 和 GetBValue 宏分別從 RGB 顏色值(COLORREF)中得到紅色、綠色、藍色的顏色值。


宏定義:

#define GetRValue(rgb)     (LOBYTE(rgb))

#define GetGValue(rgb)     (LOBYTE(((WORD)(rgb)) >> 8))

#define GetBValue(rgb)     (LOBYTE((rgb)>>16))

參數解析:

參數

含義

rgb

指定一個 RGB 顏色值(COLORREF)


返回值:
1. 分別返回三原色(紅色、綠色、藍色)的顏色值。

備註:
顏色值的取值範圍是 0 ~ 255

 

 

 

51:GetPixel

 

函數功能:

GetPixel 函數得到指定座標處的像素的 RGB 顏色值。

API 函數原型:

註釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。

COLORREF GetPixel(

  _In_  HDChdc,

  _In_  intnXPos,

  _In_  intnYPos

);


參數解析:

參數

含義

hdc

設備環境句柄

nXPos

指定要獲取的像素點的 X 軸座標,按邏輯單位表示座標

nYPos

指定要獲取的像素點的 Y 軸座標,按邏輯單位表示座標



返回值:
1. 返回值是 COLORREF 值,指定像素的 RGB(能夠經過 GetRValue、GetGValue和 GetBValue 分別得到紅、綠、藍分別的色值);
2. 若是指定的像素點在當前剪裁區以外;那麼返回值是 CLR_INVALID。


備註:

1. 若是像素點座標位於當前剪裁區以外,那麼該函數執行失敗。

2. 不是全部設備都支持 GetPixel 函數。有關詳情,請參考 GetDeviceCaps。

3. 位圖必須選入設備環境中,不然也會返回 CLR_INVALID

 

 

 

 

 

 

52:SetPixelV

 

函數功能:

SetPixelV 函數將指定座標處的像素設爲指定的顏色(與 SetPixel 同樣,但效率高一些)。

API 函數原型:

註釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。

BOOL SetPixelV(

  _In_  HDChdc,

  _In_  intX,

  _In_  intY,

  _In_  COLORREFcrColor

);



參數解析:

參數

含義

hdc

設備環境句柄

x

指定要設置的像素點的 X 軸座標,按邏輯單位表示座標

y

指定要設置的像素點的 Y 軸座標,按邏輯單位表示座標

crColor

1. 指定該像素點的顏色
2. 使用 RGB建立 COLORREF 的顏色值


註釋:COLORREF 顏色被定義爲 DWORD 類型(4 個字節),用於表示 RGB 顏色。


返回值:
1. 若是函數調用成功,返回值爲非 0;
2. 若是函數調用失敗,返回值爲 0。


備註:
1. 不是全部設備都支持 SetPixelV 函數。有關詳情,請參考 GetDeviceCaps。
2. SetPixelV 函數比 SetPixel 函數快,由於 SetPixelV 不須要返回實際繪製的像素值(返回布爾類型)。

 

 

 

 

53:GetDC

 

函數功能:

GetDC 函數用戶得到指定窗口的客戶區或整個屏幕的設備環境句柄,隨後,你能夠在 GDI 函數中使用該句柄在設備環境中繪圖。

設備環境是一個不公開的數據結構,它的值供 GDI 函數內部使用。


API 函數原型:

註釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。

HDC GetDC(

  _In_  HWNDhWnd

);



參數解析:

參數

含義

hWnd

1. 指定的窗口句柄
2. 若是該值是 NULL,得到整個屏幕的設備環境



返回值:
1. 若是函數調用成功,返回值是指定窗口的客戶區的設備環境句柄;
2. 若是函數調用失敗,返回值是 NULL。

備註:
1. GetDC 函數根據指定類型的窗口得到普通的、典型的或特有的設備環境。
2. 對於普通的設備環境,GetDC 函數在每次調用的時候爲它賦值默認屬性;對於典型的和特有的設備環境,GetDC函數不改變先前設置的屬性。
3. 在使用普通的設備環境繪圖以後,必須調用 ReleaseDc函數釋放該設備環境;典型的和特有的設備環境則不須要釋放,設備環境的個數僅受有效內存的限制。
4. 有一點要特別注意,GetDC 函數對系統的開銷相對比較大,若是你的應用程序裏使用了幾百個 GetDC 函數而又不經過 ReleaseDC 函數釋放的話,那麼你機器運行速度將是龜速。

 

 

 

 

 

 

 

54:ReleaseDC

 

函數功能:

ReleaseDC 函數用於釋放設備環境,以供其餘應用程序使用。

ReleaseDC 函數的效果取決於設備環境的類型,它只能釋放普通的和窗口設備環境;對於典型的和特有的設備環境則無效。


API 函數原型:

註釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。

int ReleaseDC(

  _In_  HWNDhWnd,

  _In_  HDChDC

);



參數解析:

參數

含義

hWnd

指定的窗口句柄

hDC

指定將要被釋放的設備環境句柄


返回值:

返回值說明設備環境是否成功釋放
1. 若是設備環境成功釋放,返回 1;
2. 若是設備環境沒有釋放,返回 0。


備註:
1. 每次調用 GetWindowDC 函數和 GetDC 函數得到普通的設備環境以後,應用程序必須調用 ReleaseDC 函數來釋放設備環境。
2. 應用程序不能調用 ReleaseDC 函數來釋放由 CreateDC 函數建立的設備環境,CreateDC 建立的設備環境只能使用DeleteDC 函數來刪除。
3. ReleaseDC 函數必須跟 GetDC 函數同在一個線程內調用。

 

 

 

 

 

 

55: GetWindowDC

 

函數功能:

GetWindowDC 函數用於得到的整個窗口(包括非客戶區)的設備環境,例如標題欄、菜單、滾動條,以及邊框。

一個窗口的設備環境容許在任何地方繪畫,由於該設備環境的原點爲窗口的左上角,而不是客戶區。

GetWindowDC 函數每次得到設備環境時都爲它賦值默認屬性。

API 函數原型:

註釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。

HDC GetWindowDC(

  _In_  HWNDhWnd

);



參數解析:

參數

含義

hWnd

1. 指定的窗口句柄
2. 若是該值是 NULL,得到整個屏幕的設備環境

 

小甲魚註釋:若是 hWnd 的值是 NULL,GetWindowDC 函數得到的是主顯示器(多顯示器的狀況下)的設備環境,能夠經過調用 EnumDisplayMonitors 和 CreateDC 函數得到其餘顯示器的設備環境。


返回值:
1. 若是函數調用成功,返回值是指定窗口的設備環境句柄;
2. 若是函數調用失敗,返回值是 NULL。


備註:
1. GetWindowDC 函數得到的設備環境包含窗口的非客戶區,在非客戶區進行繪畫是不推薦的。
2. 能夠經過調用 GetSystemMetrics 函數來得到非客戶區的各個部位(如標題欄、菜單或滾動條等)的尺寸。
3. GetDC 函數也可用於得到整個屏幕的設備環境。
4. 繪製結束後,必須調用 ReleaseDC 函數釋放設備環境,如沒有釋放設備環境,對有繪畫需求的應用程序將帶來嚴重的影響。


 

56:CreateDC 

 

函數功能:

CreateDC 函數經過使用指定的名字爲一個設備建立設備環境。

API 函數原型:

註釋:_In_ 說明該參數是輸入的,_out_ 說明該參數是輸出的,_opt_ 說明該參數是可選參數。

HDC CreateDC(

  LPCTSTRlpszDriver,

  _In_  LPCTSTRlpszDevice,

  LPCTSTRlpszOutput,

  _In_  constDEVMODE *lpInitData

);



參數解析:

參數

含義

lpszDriver

1. 指向一個以 NULL 爲結束符的字符串指針,它能夠是 TEXT("DISPLAY") 或顯示設備的名稱
2. 對於打印設備,咱們推薦設置爲 NULL,由於使用打印設備時,GDI 會忽略這個參數

lpszDevice

1. 指向一個以 NULL 爲結束符的字符串指針,該字符串指定了正在使用的特定輸出設備的名字(注意:不是打印機模式名)
2. 能夠經過調用 EnumDisplayDevices 函數得到設備的名字
3. 若是 lpszDriver 是 TEXT("DISPLAY") 或顯示設備的名稱,那麼本參數必須是 NULL 或者那個指定的顯示設備的名稱(若是是 NULL,那麼建立出來的設備環境是根據主顯示器建立的)
4. 若是是在擁有多個顯示器的系統上,調用 CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL) 將建立一個涵蓋全部顯示器的設備環境。

lpszOutput

這個參數必須爲 NULL(僅爲兼容 16 位系統而存在)

lpInitData

1. 指向一個 DEVMODE 結構,該結構包含指定設備驅動程序初始化時須要的數據
2. 調用 DocumentProperties 函數能夠得到指定設備的 DEVMODE 結構的數據
3. 若是設備驅動是使用用戶指定的初始化數據(若是有的話),那麼這個參數必須設置爲 NULL
4. 若是 lpszDriver 是 TEXT("DISPLAY"),那麼該參數必須是 NULL,而後 GDI 使用該顯示設備當前的 DEVMODE 結構


返回值:
1. 若是函數調用成功,返回值是指定設備的設備環境句柄;
2. 若是函數調用失敗,返回值是 NULL。
備註:

1. 注意,設備環境的句柄在任什麼時候候都只能由單線程使用。
2. 對於 lpszDriver 和 lpszDevice 參數,能夠經過調用 EnumDisplayDevices 函數得到顯示設備的名字。
3. 若是你再也不須要設備環境,請調用 DeleteDC 函數。

 

 

 

 

57:CreateCompatibleDC

 

函數功能:

CreateCompatibleDC 函數建立一個與指定設備兼容的內存設備環境(DC)。


API 函數原型:

註釋:_In_ 說明該參數是輸入的。

HDC CreateCompatibleDC(

  _In_  HDChdc

);



參數解析:

參數

含義

hdc

1. 指定一個存在的設備環境句柄
2. 若是這個參數的值是 NULL,則建立該應用程序當前屏幕的內存設備環境



返回值:
1. 若是函數調用成功,返回值是內存設備環境句柄;
2. 若是函數調用失敗,返回值是 NULL。

備註:
1. 內存設備環境是僅在內存中的;當內存設備環境被建立時,它的顯示界面是標準的一個單色像素寬和一個單色像素高;在一個應用程序可使用內存設備環境進行繪圖操做以前,它必須選擇一個高和寬都正確的位圖到設備環境中;能夠經過調用 CreateCompatibleBitmap 函數指定高、寬和色彩組合以知足函數調用的須要。
2. 當一個內存設備環境被建立時,全部的特性都被設置爲默認值;能夠把內存設備環境看成一個普通的設備環境那樣去使用:能夠設置屬性、得到當前的設置、爲它選擇畫筆,刷子和區域。
3. CreateCompatibleDc 函數只適用於支持光柵操做的設備,應用程序能夠經過調用 GetDeviceCaps 函數來肯定一個設備是否支持這些操做。
4. 當再也不須要內存設備環境時,可調用 DeleteDc 函數刪除它。

 

 

 

 

58:CreateMetaFile

 

函數功能:

CreateMetaFile 函數用於建立一個圖元文件的設備環境。

注意:該函數只兼容 Windows 格式的圖元文件;對於新的應用程序,推薦使用功能更加卓越的加強型圖元文件;調用 CreateEnhMetaFile 函數能夠建立加強型圖元文件對應的設備環境。


API 函數原型:

註釋:_In_ 說明該參數是輸入的。

HDC CreateMetaFile(

  _In_  LPCTSTRlpszFile

);



參數解析:

參數

含義

lpszFile

1. 一個以 NULL 字符爲結尾的指針,指向將被建立的 Windows 格式的圖元文件的名稱
2. 若是該參數爲 NULL,則將 Windows 格式的圖元文件建立於內存中而且當調用 DeleteMetaFile 函數後全部內容就會消失



返回值:
1. 若是函數調用成功,返回值是 Windows 格式的圖元文件的設備環境句柄;
2. 若是函數調用失敗,返回值是 NULL。

 

 

 

 

 

 

 

59: CloseMetaFile

 

函數功能:

CloseMetaFile 函數用於關閉指定圖元文件的設備環境,並返回一個圖元文件句柄。

注意:該函數只兼容 Windows 格式的圖元文件;對於新的應用程序,推薦使用功能更加卓越的加強型圖元文件;調用 CreateEnhMetaFile 函數能夠建立加強型圖元文件對應的設備環境(調用CloseEnhMetaFile 來關閉它)。


API 函數原型:

註釋:_In_ 說明該參數是輸入的。

HMETAFILE CloseMetaFile(

  _In_  HDChdc

);



參數解析:

參數

含義

hdc

圖元文件的設備環境句柄,用於建立 Windows 格式的圖元文件



返回值:
1. 若是函數調用成功,返回值是 Windows 格式的圖元文件句柄;
2. 若是函數調用失敗,返回值是 NULL。

 

 

 

60:MoveToEx

 

函數功能:

MoveToEx 函數將當前繪圖位置移動到某個具體的點,同時也可得到以前位置的座標。

API 函數原型:

註釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。

BOOL MoveToEx(

  _In_  HDC hdc,

  _In_  int X,

  _In_  int Y,

  _Out_  LPPOINTlpPoint

);

 



參數解析:

參數

含義

hdc

指定設備環境句柄

X

指定新位置的 X 軸座標,按邏輯單位表示座標

Y

指定新位置的 Y 軸座標,按邏輯單位表示座標

lpPoint

1. 一個 POINT結構的指針,用於得到以前位置的座標
2. 若是這個值是 NULL,則不會得到以前位置的座標



返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。

備註:
1. MoveExTo 函數將影響全部的繪圖函數。
2. 在默認的設備環境中,點 (0, 0) 爲最初設定的當前位置。

 

 

 

 

61:LineTo

 

函數功能:

LineTo 函數使用當前畫筆繪製一條線,線段從當前位置連到一個指定的點 (x, y)。

當這個函數調用完畢後,當前位置變成 (x, y)。

小甲魚提示:所繪製的線段並不包含指定的點 (x, y)。

API 函數原型:

註釋:_In_ 說明該參數是輸入的,_opt_ 說明該參數是可選參數。

BOOL LineTo(

  _In_  HDChdc,

  _In_  intnXEnd,

  _In_  intnYEnd

);



參數解析:

參數

含義

hdc

指定設備環境句柄

nXEnd

1. 線段終點X座標位置,採用邏輯座標表示。
2. 這個點不會實際畫出來,由於它不屬於線段的一部份

nYEnd

1. 線段終點Y座標位置,採用邏輯座標表示。
2. 這個點不會實際畫出來,由於它不屬於線段的一部份


返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。

 

 

 

 

62:POINT 結構

 

POINT 結構定義了一個點的 x 座標和 y 座標。

結構原型:

typedef struct tagPOINT {

  LONG x;

  LONG y;

} POINT, *PPOINT;

 


成員解析:

成員

含義

x

被定義的點的 x 座標

y

被定義的點的 y 座標



63:GetCurrentPositionEx 

 

函數功能:

GetCurrentPositionEx 函數用於獲取邏輯座標中的當前位置。

API 函數原型:

BOOL GetCurrentPositionEx(

  _In_  HDC hdc,

  _Out_  LPPOINTlpPoint

);



參數解析:

參數

含義

hdc

指定設備環境句柄

lpPoint

一個 POINT結構的指針,用於得到當前邏輯座標的位置



返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。

 

 

 

64:Polyline

 

函數功能:

Polyline 函數將指定數組的鏈接點繪製成一系列線段(折線)。

API 函數原型:

註釋:_In_ 說明該參數是輸入的。

BOOL Polyline(

  _In_  HDChdc,

  _In_  constPOINT *lppt,

  _In_  intcPoints

);



參數解析:

參數

含義

hdc

指定設備環境句柄

lppt

一個指向 POINT結構的數組的指針(折線的頂點)

cPoints

1. lppt 參數指向的數組中頂點(POINT結構)的個數
2. 該值必須大於或等於 2



返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。


備註:
1. 該折線是使用當前畫筆,經過將指定數組中的頂點依次鏈接繪製出來的。
2. 不像 LineTo 或 PolylineTo 函數,Polyline 函數既不會用到當前位置,也不會去修改它。

 

 

 

65:PolylineTo

 

函數功能:

PolylineTo 函數將指定數組的鏈接點繪製成一系列線段(折線)。


API 函數原型:

註釋:_In_ 說明該參數是輸入的。

BOOL PolylineTo(

  _In_  HDChdc,

  _In_  constPOINT *lppt,

  _In_  DWORDcCount

);

 



參數解析:

參數

含義

hdc

指定設備環境句柄

lppt

一個指向 POINT結構的數組的指針(折線的頂點)

cCount

1. lppt 參數指向的數組中頂點(POINT結構)的個數
2. 該值必須大於或等於 2


返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。

備註:
1. 不像 Polyline 函數,PolylineTo 函數會使用並修改當前位置。
2. 繪畫時,會使用使用當前畫筆,先從當前位置畫一條線鏈接到 lppt 指定的第一個頂點的位置,而後畫到下一個頂點,以此類推。
3. 繪畫完成以後,會將當前位置移動到最後一個頂點的位置。
4. 若是該函數繪製了一個封閉的圖形,那麼該圖形不會被填充。

 

 

 

66:PolyPolyline

 

函數功能:

PolyPolyline 函數用於同時繪製多條折線。

API 函數原型:

註釋:_In_ 說明該參數是輸入的。

BOOL PolyPolyline(

  _In_  HDChdc,

  _In_  constPOINT *lppt,

  _In_  constDWORD *lpdwPolyPoints,

  _In_  DWORDcCount

);



參數解析:

參數

含義

hdc

指定設備環境句柄

lppt

一個指向 POINT 結構的數組的指針(一系列折線上的頂點)

lpdwPolyPoints

一個指向數組的指針,數組中每一個元素用於指定 lppt 參數中相應折線的頂點的數量

cCount

lpdwPolyPoints 參數指向的數組的元素數量(折線的數量)


返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。

備註:
1. 該函數繪製的一系類折線都是使用當前畫筆完成。
2. 該函數繪製的圖形並無填充。
3. 該函數既不會用到當前位置,也不會去修改它。

 

 

 

 

67:GetDeviceCaps 

 

函數功能:

GetDeviceCaps 函數用於得到指定設備的一些特定信息。

API 函數原型:

註釋:_In_ 說明該參數是輸入的。

int GetDeviceCaps(

  _In_  HDChdc,

  _In_  intnIndex

);



參數解析:

參數

含義

hdc

設備環境句柄

nIndex

索引值,根據這個索引值該函數得到並返回相應信息的值



nIndex 的索引值能夠是如下值:

索引值

含義

DRIVERVERSION

設備驅動程序版本

TECHNOLOGY

1. 設備技術,能夠是下列任何一個值:

DT_PLOTTER

矢量繪圖儀

DT_RASDISPLAY

光柵顯示器

DT_RASPRINTER

光柵打印機

DT_RASCAMERA

光柵照相機

DT_CHARSTREAM

字符流

DT_METAFILE

圖元文件

DT_DISPFILE

顯示器文件

2. 若是 hdc 參數是加強型圖元文件的設備環境句柄,則設備技術就是給 CreateEnhMetaFile 函數的引用設備,使用 GetObjectType 函數能夠肯定它是否加強型圖元文件的設備環境。

HORZSIZE

物理顯示器的寬度(毫米)

VERTSIZE

物理顯示器的高度(毫米)

HORZRES

物理顯示器的寬度(像素)

VERTRES

物理顯示器的高度(像素)

LOGPIXELSX

1. 沿顯示器寬度每邏輯英寸的像素數
2. 在多顯示器系統中,該值對所顯示器相同

LOGPIXELSY

1. 沿顯示器高度每邏輯英寸的像素數
2. 在多顯示器系統中,該值對所顯示器相同

BITSPIXEL

每一個像素的色彩位數

PLANES

色彩平面的數目

NUMBRUSHES

設備指定的畫刷數

NUMPENS

設備指定的畫筆數

NUMFONTS

設備指定的字體數

NUMCOLORS

1. 若是設備的色彩深度不超過 8位/像素點,返回設備的色彩數值
2. 若是設備的色彩深度超過 8位/像素點,返回 1

ASPECTX

用於畫線的設備像素的相對寬度

ASPECTY

用於畫線的設備像素的相對高度

ASPECTXY

用於畫線的設備像素的對角線寬度

PDEVICESIZE

保留

CLIPCAPS

1. 顯示設備支持剪切性能的標誌
2. 若是設備可剪切爲一個矩形,則爲 1,不然爲 0

SIZEPALETTE

1. 系統調色板中的入口數目
2. 只有當設備驅動器在 RASTERCAPS 索引中設置 RC_PALETFE 標誌時該索引值纔是有效的
3. 該索引值只能用於 16 位 Windows 的驅動器

NUMRESERVED

1. 系統調色板中保留的入口數目
2. 只有當設備驅動器在 RASTERLAP 索引中設置 RC_PALETFE 標誌時該索引值纔是有效的
3. 該索引值只能用於 16 位 Windows 的驅動器

COLORRES

1. 設備的實際顏色分辨率(位/像素)
2. 只有當設備驅動器在 RASTERLAP 索引中設置 RC_PALETFE 標誌時該索引值纔是有效的
3. 該索引值只能用於 16 位 Windows 的驅動器

PHYSICALWIDTH

對於打印設備:設備單位的物理頁面的寬度。例如一個在 8.5 * 11 紙上設置爲 600dpi 的打印機的設備物理單位寬度值爲 5100,注意物理頁面老是大於可打印的頁面面積

PHYSICALHEIGHT

對於打印設備:設備單位的物理頁面的高度。例如一個在 8.5 * 11 紙上設置爲 600dpi 的打印機的設備物理單位高度值爲 6600,注意物理頁面老是大於可打印的頁面面積

PHYSICALOFFSETX

對於打印設備:從物理頁面左邊到打印頁面左邊的距離。例如一個在 8.5 * 11 紙上設置爲 600dpi 的打印機,不能在超出左邊 0.25 英寸的地方打印,且有一個 150 設備單位的水平物理位移

PHYSICALOFFSETY

對於打印設備:從物理頁面上面到打印頁面上邊的距離。例如一個在 8.5 * 11 紙上設置爲 600dpi 的打印機,不能在超出上邊 0.5 英寸的地方打印,且有一個 300 設備單位的垂直物理位移

VREFRESH

對於顯示設備:
1. 設備的當前垂直刷新率(循環次數/秒,Hz)
2. 0 或 1 表明顯示硬件的默認刷新率,此默認刷新率一般經過設置顯卡或主板的跳線來改變,或經過一個非顯示函數(好比 ChangeDisplaySettings) 的配置程序來設置

SCALINGFACTORX

打印機 x 軸的比例係數

SCALINGFACTORY

打印機 y 軸的比例係數

BLTALIGNMENT

1. 首選的水平繪圖調整(表示爲像素的倍數)
2. 對於最佳性能的繪圖操做,窗口水平繪圖應該是調整到此值的倍數

SHADEBLENDCAPS

該值用於指定顯示設備的陰影和混合性能:

SB_CONST_ALPHA

處理 BLENDFUNCTION 結構中的 SourceConstantAlpha 元素,並經過 AlphaBlend 函數中的 blendFunction 參數來指定

SB_GRAD_RECT

調用 GradientFill 函數填充矩形

SB_GRAD_TRI

調用 GradientFill 函數填充三角形

SB_NONE

設備不支持這些特性

SB_PIXEL_ALPHA

調用 AlphaBlend 函數處理每個像素 Alpha

SB_PREMULT_ALPHA

調用 AlphaBlend 函數對 Alpha 進行預乘

RASTERCAPS

該值用於指定顯示設備的光柵性能:

RC_BANDING

須要聯合支持

RC_BITBLT

支持傳送位圖

RC_BITMAP64

支持大於 64K 的位圖

RC_DI_BITMAP

支持 SetDIBits 函數和 GetDIBits 函數

RC_DIBTODEV

支持 SetDIBitsToDevice 函數

RC_FLOODFILL

支持連續填充

RC_PALETTE

指定一個基於調色板的設備

RC_SCALING

支持縮放

RC_STRETCHBLT

支持 StretchBlt 函數

RC_STRETCHDIB

支持 StretchDIBits 函數

CURVECAPS

該值用於指定顯示設備繪製曲線的性能:

CC_NONE

不支持繪製曲線

CC_CHORD

支持繪製弦

CC_CIRCLES

支持繪製圓

CC_ELLIPSES

支持繪製橢圓

CC_INTERIORS

支持內部填充

CC_PIE

支持繪製扇形圖

CC_ROUNDRECT

支持繪製圓角矩形

CC_STYLED

支持繪製帶風格的邊界

CC_WIDE

支持繪製寬的邊界

CC_WIDESTYLED

支持繪製寬且帶風格的邊界

LINECAPS

該值用於指定顯示設備繪製線段的性能:

LC_NONE

不支持繪製線段

LC_INTERIORS

支持內部填充

LC_MARKER

支持繪製標記符

LC_POLYLINE

支持折線

LC_POLYMARKER

支持多種標記符

LC_STYLED

支持帶風格的線段

LC_WIDE

支持畫寬線

LC_WIDESTYLED

支持畫寬的且帶風格的線段

POLYGONALCAPS

該值用於指定顯示設備繪製多邊形的性能:

PC_NONE

不支持繪製多邊形

PC_INTERIORS

支持內部填充

PC_POLYGON

支持繪製間隔式填充多邊形

PC_RECTANGLE

支持繪製矩形

PC_SCANLINE

支持繪製掃描線

PC_STYLED

支持繪製帶風格的邊界

PC_WIDE

支持繪製寬邊界

PC_WIDESTYLED

支持繪製寬的且帶風格的邊界

PC_WINDPOLYGON

支持繪製折線式填充多邊形

TEXTCAPS

該值用於指定顯示設備繪製文本的性能:

TC_OP_CHARACTER

支持字符輸出精度

TC_OP_STROKE

支持筆畫輸出精度

TC_CP_STROKE

支持筆畫剪切精度

TC_CR_90

支持字符做 90 度旋轉

TC_CR_ANY

支持字符做任意角度旋轉

TC_SF_X_YINDEP

支持 x 和 y 方向的獨立縮放

TC_SA_DOUBLE

支持把字符放大一倍

TC_SA_INTEGER

支持整數倍縮放

TC_SA_CONTIN

支持以任何倍數的嚴格縮放

TC_EA_DOUBLE

支持字符加劇

TC_IA_ABLE

支持斜字體

TC_UA_ABLE

支持下劃線

TC_SO_ABLE

支持刪除線

TC_RA_ABLE

支持光柵字體

TC_VA_ABLE

支持矢量字體

TC_RESERVED

保留,但必須爲 0

TC_SCROLLBLT

不支持用位快傳遞來滾動(注意,這可能事與願違)

COLORMGMTCAPS

該值用於指定顯示設備顏色管理的性能:

CM_CMYK_COLOR

設備能夠接受 CMYK 色彩空間的 ICC 色彩配置文件

CM_DEVICE_ICM

設備能夠在任意的設備驅動程序或設備自己執行的 ICM

CM_GAMMA_RAMP

設備支持 GetDeviceGammaRamp 函數和 SetDeviceGammaRamp 函數

CM_NONE

設備不支持 ICM


返回值:
1. 返回 nIndex 參數指定項的值;
2. 若是 nIndex 參數是 BITSPIXEL, 且設備是具備 15bpp 或 16bpp,返回值是16。

備註:
1. 若是 nIndex 參數的值是 SHADEBLENDCAPS:

對於打印設備:GetDeviceCaps 函數返回任何打印機的報告

對於顯示設備:全部混合操做都支持,除了 SB_NONE,惟一的返回值是 SB_CONST_ALPHA 和 SB_PIXEL_ALPHA,這代表這些操做是否被加速


2. 在多顯示器系統中,若是 hdc 是臺式機,GetDeviceCaps 函數返回主顯示器的功能。若是你想爲其餘顯示器的信息,則必須使用多顯示器的 API 函數或調用 CreateDC 函數獲得一個 hdc 指定顯示器的設備環境。

注意,通常顯示 1 是主顯示器,但並不是老是如此。

3. GetDeviceCaps 提供瞭如下六個索引值爲打印設備轉義符:

索引值

打印設備轉義符

PHYSICALWIDTH

GETPHYSPAGESIZE

PHYSICALHEIGHT

GETPHYSPAGESIZE

PHYSICALOFFSETX

GETPRINTINGOFFSET

PHYSICALOFFSETY

GETPHYSICALOFFSET

SCALINGFACTORX

GETSCALINGFACTOR

SCALINGFACTORY

GETSCALINGFACTOR


4. 注意:

GetDeviceCaps 函數得到的信息來源於顯示驅動程序。

若是顯示驅動程序拒絕提供任何信息,GetDeviceCaps函數則經過計算固定數據獲得信息。

若是顯示驅動程序報告無效信息,GetDeviceCaps函數返回無效信息。

此外,若是顯示驅動拒絕報告信息,GetDeviceCaps 函數可能計算不正確的信息,由於它假設是固定的 DPI(每英寸點數 96)或固定的大小(取決於顯示驅動程序是否提供)。

不幸的是,實如今 Windows 顯示驅動程序模型(WDDM)(在 Windows Vista 中引入)的顯示驅動程序致使 GDI 拿不到信息,因此 GetDeviceCaps 函數必須經過計算獲得信息。

 

68:PolyBezier

 

函數功能:

PolyBezier 函數用於繪製一個或多個貝塞爾曲線。

貝賽爾曲線是一種很是優美的曲線,一條貝賽爾樣條由4個定義點定義:兩個端點和兩個控制點。

API 函數原型:

註釋:_In_ 說明該參數是輸入的。

BOOL PolyBezier(

  _In_  HDChdc,

  _In_  constPOINT *lppt,

  _In_  DWORDcPoints

);



參數解析:

參數

含義

hdc

指定設備環境句柄

lppt

1. 一個指向 POINT 結構的數組的指針,該數組包含端點和控制點的座標
2. 順序是起點、第一控制點、第二控制點和終點

cPoints

指明 lppt 指向的數組中點的個數



返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。


備註:
1. PolyBezier 函數經過使用由 lppt 參數指定的端點和控制點繪製一條或多條三次貝塞爾曲線。
2. 第一條貝塞爾曲線的四個點依次是:起點、第一控制點、第二控制點和終點;隨後的每一條貝塞爾曲線則只需給出三個點,由於前一條貝塞爾曲線的終點會被看成後一條貝塞爾曲線的起點,以此類推。
3. 繪製一系列相連的貝塞爾曲線時,僅當第一條貝塞爾曲線的第二個控點、第一條貝塞爾曲線的終點(也就是第二條貝塞爾曲線的起點)與第二條貝塞爾曲線的第一個控點是線性關係時(即三點共線時),曲線在鏈接點處纔是平滑的。

 

 

 

 

69: PolyBezierTo

 

函數功能:

PolyBezierTo 函數用於繪製一個或多個貝塞爾曲線。

貝賽爾曲線是一種很是優美的曲線,一條貝賽爾樣條由4個定義點定義:兩個端點和兩個控制點。

API 函數原型:

註釋:_In_ 說明該參數是輸入的。

BOOL PolyBezierTo(

  _In_  HDChdc,

  _In_  constPOINT *lppt,

  _In_  DWORDcCount

);



參數解析:

參數

含義

hdc

指定設備環境句柄

lppt

1. 一個指向 POINT 結構的數組的指針,該數組包含端點和控制點的座標
2. 順序是第一控制點、第二控制點和終點
3. 跟 PolyBezier 函數不一樣,PolyBezierTo 將當前位置做爲起點

cCount

指明 lppt 指向的數組中點的個數,該值必須是要繪製的貝塞爾曲線的數量的三倍



返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。


備註:
1. PolyBezierTo 函數經過使用由 lppt 參數指定的端點和控制點繪製一條或多條三次貝塞爾曲線。
2. 第一條貝塞爾曲線是從當前位置做爲起點開始繪製,鏈接前三個點,分別是:第一控制點、第二控制點和終點;隨後的每一條貝塞爾曲線則只需給出三個點,由於前一條貝塞爾曲線的終點會被看成後一條貝塞爾曲線的起點,以此類推。
3. PolyBezierTo 函數將移動當前位置到最後一條貝塞爾曲線的終點。

 

 

 

 

70:Rectangle 

 

函數功能:

Rectangle 函數用於繪製一個矩形。

該矩形用當前畫筆繪製輪廓,用當前畫刷填充。

 


API 函數原型:

註釋:_In_ 說明該參數是輸入的。

BOOL Rectangle(

  _In_  HDChdc,

  _In_  intxLeft,

  _In_  intyTop,

  _In_  intxRight,

  _In_  intyBottom

);



參數解析:

參數

含義

hdc

指定設備環境句柄

xLeft

指定矩形左上角的邏輯 x 座標

yTop

指定矩形左上角的邏輯 y 座標

xRight

指定矩形右下角的邏輯 x 座標

yBottom

指定矩形右下角的邏輯 y 座標


返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。

備註:
1. 該函數既不使用當前位置,也不修改當前位置。
2. 寫過圖形程序的程序員一般熟悉邊界誤差(off-by-one)的問題:一些圖形程序系統畫出的圖形包含了右座標和底座標表示的點,一些則只畫到右座標和底座標表示的點以前的一點。Windows 使用後一種方法。
3. 若是使用 PS_NULL 畫筆,則矩形的尺寸高和寬比實際少一個像素。

 

 

 

 

71:Ellipse 

 

函數功能:

Ellipse 函數用於繪製一個橢圓,橢圓的中心是限定矩形的中心。

該橢圓用當前畫筆繪製輪廓,用當前畫刷填充。

 


API 函數原型:

註釋:_In_ 說明該參數是輸入的。

BOOL Ellipse(

  _In_  HDChdc,

  _In_  intxLeft,

  _In_  intyTop,

  _In_  intxRight,

  _In_  intyBottom

);

參數解析:

參數

含義

hdc

指定設備環境句柄

xLeft

指定橢圓限定矩形左上角的邏輯 x 座標

yTop

指定橢圓限定矩形左上角的邏輯 y 座標

xRight

指定橢圓限定矩形右下角的邏輯 x 座標

yBottom

指定橢圓限定矩形右下角的邏輯 y 座標



返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。

備註:
該函數既不使用當前位置,也不修改當前位置。

 

 

 

 

72:RoundRect

 

函數功能:

RoundRect 函數用於繪製一個帶圓角的矩形。該矩形用當前畫筆繪製輪廓,用當前畫刷填充。

 



API 函數原型:

註釋:_In_ 說明該參數是輸入的。

BOOL RoundRect(

  _In_  HDChdc,

  _In_  intxLeft,

  _In_  intyTop,

  _In_  intxRight,

  _In_  intyBottom,

  _In_  intxCornerEllipse,

  _In_  intyCornerEllipse

);



參數解析:

參數

含義

hdc

指定設備環境句柄

xLeft

指定限定矩形的左上角的邏輯 x 座標

yTop

指定限定矩形的左上角的邏輯 y 座標

xRight

指定限定矩形的右下角的邏輯 x 座標

yBottom

指定限定矩形的右下角的邏輯 y 座標

xCornerEllipse

指定用來畫圓角的橢圓的寬

yCornerEllipse

指定用來畫圓角的橢圓的高


返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。

備註:
該函數既不使用當前位置,也不修改當前位置。

 

 

 

73:Arc

 

函數功能:

Arc 函數用於繪製一個橢圓的圓弧。

 


API 函數原型:

註釋:_In_ 說明該參數是輸入的。

BOOL Arc(

  _In_  HDChdc,

  _In_  intxLeft,

  _In_  intyTop,

  _In_  intxRight,

  _In_  intyBottom,

  _In_  intxStart,

  _In_  intyStart,

  _In_  intxEnd,

  _In_  intyEnd

);



參數解析:

參數

含義

hdc

指定設備環境句柄

xLeft

指定限定矩形的左上角的邏輯 x 座標

yTop

指定限定矩形的左上角的邏輯 y 座標

xRight

指定限定矩形的右下角的邏輯 x 座標

yBottom

指定限定矩形的右下角的邏輯 y 座標

xStart

指定圓弧開始的邏輯 x 座標

yStart

指定圓弧開始的邏輯 y 座標

xEnd

指定圓弧結束的邏輯 x 座標

yEnd

指定圓弧結束的邏輯 y 座標



返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。


備註:
1. 點 (xLeft, yTop) 和點 (xRight, yBottom) 指定限定矩形的位置。
2. 由指定的限定矩形造成的橢圓定義弧的曲線。
3. 弧的起始點 (xStart, yStart) 開始和終點 (xEnd, yEnd) 並不在橢圓上,而是定義爲在橢圓的中心的延長線上(不懂的魚油請看上圖)。
4. 若是橢圓的起始點和終點是同一個點,那麼將繪製整個橢圓。

 

 

 

74:Chord

 

函數功能:

Chord 函數繪製不只繪製一條弧,還會鏈接弧的兩個端點鏈接一條弦,最後構成一個弓形的封閉區域。

該弓形用當前畫筆繪製輪廓,用當前畫刷填充。

 


API 函數原型:

註釋:_In_ 說明該參數是輸入的。

BOOL Chord(

  _In_  HDChdc,

  _In_  intxLeft,

  _In_  intyTop,

  _In_  intxRight,

  _In_  intyBottom,

  _In_  intxStart,

  _In_  intyStart,

  _In_  intxEnd,

  _In_  intyEnd

);



參數解析:

參數

含義

hdc

指定設備環境句柄

xLeft

指定限定矩形的左上角的邏輯 x 座標

yTop

指定限定矩形的左上角的邏輯 y 座標

xRight

指定限定矩形的右下角的邏輯 x 座標

yBottom

指定限定矩形的右下角的邏輯 y 座標

xStart

指定圓弧開始的邏輯 x 座標

yStart

指定圓弧開始的邏輯 y 座標

xEnd

指定圓弧結束的邏輯 x 座標

yEnd

指定圓弧結束的邏輯 y 座標



返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。

備註:
1. 弦對應的曲線(弧)由限定矩形畫出的橢圓所指定。
2. 曲線(弧)的起始點 (xStart, yStart) 開始和終點 (xEnd, yEnd) 並不在橢圓上,而是定義爲在橢圓的中心的延長線上(不懂的魚油請看上圖)。
3. 若是橢圓的起始點和終點是同一個點,那麼將繪製整個橢圓。
4. 該函數既不使用當前位置,也不修改當前位置。

 

 

 

75:Pie

 

函數功能:

Pie 函數繪製一個由弧以及橢圓中心構成的扇形。該扇形用當前畫筆繪製輪廓,用當前畫刷填充。

 



API 函數原型:

註釋:_In_ 說明該參數是輸入的。

BOOL Pie(

  _In_  HDChdc,

  _In_  intxLeft,

  _In_  intyTop,

  _In_  intxRight,

  _In_  intyBottom,

  _In_  intxStart,

  _In_  intyStart,

  _In_  intxEnd,

  _In_  intyEnd

);



參數解析:

參數

含義

hdc

指定設備環境句柄

xLeft

指定限定矩形的左上角的邏輯 x 座標

yTop

指定限定矩形的左上角的邏輯 y 座標

xRight

指定限定矩形的右下角的邏輯 x 座標

yBottom

指定限定矩形的右下角的邏輯 y 座標

xStart

指定圓弧開始的邏輯 x 座標

yStart

指定圓弧開始的邏輯 y 座標

xEnd

指定圓弧結束的邏輯 x 座標

yEnd

指定圓弧結束的邏輯 y 座標



返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。

備註:
1. 扇形對應的曲線(弧)由限定矩形畫出的橢圓所指定。
2. 曲線(弧)的起始點 (xStart, yStart) 開始和終點 (xEnd, yEnd) 並不在橢圓上,而是定義爲在橢圓的中心的延長線上(不懂的魚油請看上圖)。
3. 該函數既不使用當前位置,也不修改當前位置。

 

 

 

 

76:GetStockObject

 

函數功能:

GetStockObject 函數用於得到 Windows 預設的畫筆、畫刷、字體或者調色板的句柄。


API 函數原型:

註釋:_In_ 說明該參數是輸入的。

HGDIOBJ GetStockObject(

  _In_  intfnObject

);



參數解析:

參數

含義

fnObject

指定待獲取對象的類型,具體參考下邊。



fnObject 可取以下值之一:

含義

BLACK_BRUSH

黑色畫刷

DKGRAY_BRUSH

暗灰色畫刷

DC_BRUSH

1. 純色畫刷,默認顏色是白色的
2. 調用 SetDCBrushColor 函數能夠修改該值的顏色

GRAY_BRUSH

灰色畫刷

HOLLOW_BRUSH

空畫刷(至關於 NULL_BRUSH)

LTGRAY_BRUSH

淺灰色畫刷

NULL_BRUSH

空畫刷(至關於 HOLLOW_BRUSH)

WHITE_BRUSH

白色畫刷

BLACK_PEN

黑色畫筆

DC_PEN

1. 純色畫筆,默認顏色是白色的
2. 調用 SetDCPenColor 函數能夠修改該值的顏色

NULL_PEN

空畫筆(空畫筆不繪製任何東西)

WHITE_PEN

白色畫筆

ANSI_FIXED_FONT

Windows 中的固定間距(等寬)系統字體

ANSI_VAR_FONT

Windows 中的可變間距(比例間距)系統字體

DEVICE_DEFAULT_FONT

設備相關字體

DEFAULT_GUI_FONT

1. 用戶界面對象(如菜單、對話框)的默認字體
2. 不推薦使用 DEFAULT_GUI_FONT 或 SYSTEM_FONT 得到對話框或系統的字體
3. 該字體默認是 Tahoma

OEM_FIXED_FONT

原始設備製造商(OEM)相關固定間距(等寬)字體

SYSTEM_FONT

1. 系統字體
2. 默認狀況下,Windows 使用系統字體繪製菜單,對話框和文本
3. 不推薦使用 DEFAULT_GUI_FONT 或 SYSTEM_FONT 得到對話框或系統的字體
4. 該字體默認是 Tahoma

SYSTEM_FIXED_FONT

1. 固定間距(等寬)系統字體
2. 該對象僅爲兼容 16 位 Windows 版本提供

DEFAULT_PALETTE

默認調色板(該調色板由系統調色板中的靜態色彩組成)



返回值:
1. 若是函數調用成功,返回值是所申請的邏輯對象的句柄;
2. 若是函數調用失敗,返回值是 NULL。


備註:

1. 不建議您使用該函數得到對話框和窗口的當前字體。應該使用 SystemParametersInfo 函數(SPI_GETNONCLIENTMETRICS參數)來得到當前字體,由於 SystemParametersInfo 函數將考慮到當前主題,並提供了標題欄,菜單和消息對話框的字體信息。
2. 僅在窗口風格爲 CS_HREDRAW 和 CS_VREDRAW 中,才能使用 DKGRAY_BRUSH、GRAY_BRUSH 和 LTGRAY_BRUSH 對象。若是在其餘風格的窗口中使灰色畫刷,可能致使在窗口移動或改變大小以後出現畫刷模式錯位現象,原始畫刷不能被調整。
3. HOLLOW_BRUSH 和 NULL_BRUSH 對象是同樣的。
4. 沒必要要經過調用 DeleteObject 函數來刪除 Windows 預設的對象。
5. DC_BRUSH 和 DC_PEN 都能與其餘對象如 BLACK_BRUSH 和 BLACK_PEN 相互交換。具體請參考 GetDCBrushColor 函數、SetDCBrushColor 函數、GetDCPenColor 函數和 SetDCPenColor 函數。

 

 

 

77:SelectObject

 

函數功能:

SelectObject 函數用於選擇一對象到指定的設備環境中,該新對象將替換先前的相同類型的對象。


API 函數原型:

註釋:_In_ 說明該參數是輸入的。

HGDIOBJ SelectObject(

  _In_  HDChdc,

  _In_  HGDIOBJhgdiobj

);



參數解析:

參數

含義

hdc

指定設備環境句柄

hgdiobj

1. 被選擇的對象的句柄
2. 該指定對象必須由如下的函數建立



hgdiobj 參數的對象必需由如下的函數建立:

對象

函數

位圖

CreateBitmap, CreateBitmapIndirect, CreateCompatibleBitmap, CreateDIBitmap, CreateDIBSection
(只有內存設備環境可選擇位圖,而且在同一時刻只能一個設備環境選擇位圖)

畫刷

CreateBrushIndirect, CreateDIBPatternBrush, CreateDIBPatternBrushPt, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush

字體

CreateFont, CreateFontIndirect

畫筆

CreatePen, CreatePenIndirect

區域

CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreateRectRgn, CreateRectRgnIndirect



返回值:
1. 若是選擇對象不是區域而且函數調用成功,那麼返回值是被取代的對象的句柄;
2. 若是選擇對象是區域而且函數執行成功,返回如下值之一:

含義

SIMPLEREGION

區域由單個矩形組成

COMPLEXREGION

區域由多個矩形組成

NULLREGION

區域爲空


3. 若是發生錯誤而且選擇對象不是一個區域,那麼返回值爲 NULL,不然返回 HGDI_ERROR。


備註:

1. 該函數返回先前指定類型的選擇對象。
2. 一個應用程序在它使用新對象進行繪製完成以後,應該用原始的默認對象替換新對象。
3. 應用程序不能同時選擇一個位圖到多個設備環境中。
4. ICM:若是被選擇的對象是畫筆或筆,那麼就執行顏色管理。

 

 

 

78:CreatePen

 

函數功能:

CreatePen 函數用指定的樣式、寬度和顏色建立一個邏輯畫筆。建立的畫筆隨後能夠被選擇到設備環境中,並用於繪製直線和曲線。


API 函數原型:

註釋:_In_ 說明該參數是輸入的。

HPEN CreatePen(

  _In_  intfnPenStyle,

  _In_  intnWidth,

  _In_  COLORREFcrColor

);



參數解析:

參數

含義

fnPenStyle

指定畫筆樣式,詳細內容請看下邊

nWidth

1. 指定畫筆的寬度
2. 若是該值爲 0,則畫筆爲一個像素寬度,無論當前的映射模式

crColor

1. 指定畫筆的 RGB 顏色
2. RGB 顏色使用 RGB生成 COLORREF 結構



fnPenStyle 參數指定畫筆樣式爲以下值之一:

含義

PS_SOLID

實線

PS_DASH

虛線(nWidth 參數的值必須 <= 1)

PS_DOT

點線(nWidth 參數的值必須 <= 1)

PS_DASHDOT

點劃線(nWidth 參數的值必須 <= 1)

PS_DASHDOTDOT

點點劃線(nWidth 參數的值必須 <= 1)

PS_NULL

該畫筆看不見

PS_INSIDEFRAME

該畫筆用於在 GDI 函數繪圖中實現,繪製橢圓、矩形、圓角矩形、餅圖以及弦等生成的封閉對象框時,畫筆寬度向內擴展。


返回值:
1. 若是函數調用成功,返回值是新畫筆的句柄;
2. 若是函數調用失敗,返回值是 NULL。

備註:
1. 調用該函數建立新畫筆以後,可使用 SelectObject 函數將新畫筆選入設備環境中。只有當畫筆被選入設備環境,才能使用該畫筆繪製線段或曲線。
2. 若是 nWidth 參數的值是 0,則畫筆爲一個像素寬度,無論當前的映射模式。
3. 若是 nWidth 參數的值大於 1,則fnPenStyle 參數的值必須爲 PS_NULL, PS_SOLID 或 PS_INSIDEFRAME 的其中一個。
4. 若是 nWidth 參數的值大於 1,且fnPenStyle 參數的值爲 PS_INSIDEFRAME,全部與該畫筆相關聯(除了折線和多邊形)的封閉圖形繪製,畫筆寬度向內擴展。
5. 若是 nWidth 參數的值大於 1,且fnPenStyle 參數的值爲 PS_INSIDEFRAME,若是指定的 RGB 顏色不存在,就進行抖動處理。
6. 若是你不再須要該畫筆,可使用 DeleteObject 函數將其刪除。

 

 

 

 

79:LOGPEN 結構

 

LOGPEN 結構

LOGPEN 結構定義了畫筆、圖形對象用於繪製線條和邊框的寬度、樣式和顏色。CreatePenIndirect 函數須要使用到 LOGPEN 結構。


結構原型:

typedef struct tagLOGPEN {

  UINT    lopnStyle;

  POINT   lopnWidth;

  COLORREFlopnColor;

} LOGPEN, *PLOGPEN;



成員解析:

成員

含義

lopnStyle

指定畫筆樣式,詳細內容請看下邊

lopnWidth

1. 指定畫筆的寬度
2. POINT 結構,Windows 只使用該結構的 x 成員表示畫筆寬度,y 成員不使用
3. 若是該值爲 0,則畫筆爲一個像素寬度,無論當前的映射模式

lopnColor

1. 指定畫筆的 RGB 顏色
2. RGB 顏色使用 RGB生成 COLORREF 結構



lopnStyle 成員指定畫筆樣式爲以下值之一:

含義

PS_SOLID

實線

PS_DASH

虛線(nWidth 參數的值必須 <= 1)

PS_DOT

點線(nWidth 參數的值必須 <= 1)

PS_DASHDOT

點劃線(nWidth 參數的值必須 <= 1)

PS_DASHDOTDOT

點點劃線(nWidth 參數的值必須 <= 1)

PS_NULL

該畫筆看不見

PS_INSIDEFRAME

該畫筆用於在 GDI 函數繪圖中實現,繪製橢圓、矩形、圓角矩形、餅圖以及弦等生成的封閉對象框時,畫筆寬度向內擴展。



備註:
1. 若是 lopnWidth 成員的值大於 1,且 lopnStyle 成員的值爲 PS_INSIDEFRAME,全部與該畫筆相關聯(除了折線和多邊形)的封閉圖形繪製,畫筆寬度向內擴展。
2. 若是指定的 RGB 顏色不存在,就進行抖動處理。
3. 若是 lopnWidth 成員的值小於等於 1,則 PS_INSIDEFRAME 樣式與 PS_SOLID  相同。

 

 

 

 

80: CreatePenIndirect

 

函數功能:

CreatePenIndirect 函數根據指定的 LOGPEN結構建立一個畫筆。

API 函數原型:

註釋:_In_ 說明該參數是輸入的。

HPEN CreatePenIndirect(

  _In_  constLOGPEN *lplgpn

);



參數解析:

參數

含義

lplgpn

1. 指向 LOGPEN結構的指針
2. LOGPEN結構指定了畫筆的樣式、寬度和顏色


返回值:
1. 若是函數調用成功,返回值是新畫筆的句柄;
2. 若是函數調用失敗,返回值是 NULL。

備註:
1. 調用該函數建立新畫筆以後,可使用 SelectObject 函數將新畫筆選入設備環境中。只有當畫筆被選入設備環境,才能使用該畫筆繪製線段或曲線。
2. 若是你不再須要該畫筆,可使用 DeleteObject 函數將其刪除。

 

 

 

 

81: DeleteObject

 

函數功能:

DeleteObject 函數用於刪除一個邏輯畫筆、畫刷、字體、位圖、區域或者調色板,釋放全部與該對象有關的系統資源。

注意,在對象被刪除以後,指定的句柄也就失效了。

API 函數原型:

註釋:_In_ 說明該參數是輸入的。

BOOL DeleteObject(

  _In_  HGDIOBJhObject

);



參數解析:

參數

含義

hObject

指定待刪除的邏輯畫筆、畫刷、字體、位圖、區域或者調色板的句柄



返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是指定的句柄無效或者它已被選入設備環境,則返回值是 0。

備註:
1. 當一個繪畫對象(如畫筆或畫刷)當前被選入一個設備環境中時,不要刪除該對象。
2. 當一個畫刷被刪除時,與該畫刷相關的位圖並不被刪除,該圖必須單獨地刪除。

 

 

 

 

82:GetObject

 

函數功能:

GetObject 函數用於得到指定圖形對象的信息。


API 函數原型:

註釋:_In_ 說明該參數是輸入的,__Out__ 說明該參數是輸出的。

int GetObject(

  _In_  HGDIOBJ hgdiobj,

  _In_  int cbBuffer,

  _Out_  LPVOIDlpvObject

);



參數解析:

參數

含義

hgdiobj

1. 指定目標圖形對象的句柄
2. 它能夠是這樣的一個句柄:邏輯位圖、畫刷、字體、調色板、畫筆或經過調用 CreateDIBsection 函數建立的與設備無關位圖

cbBuffer

指定將要寫到緩衝區的信息的字節數

lpvObject

指向一個緩衝區的指針(該緩衝區將用於存放指定圖形對象的信息)



下邊列出的是緩衝區得到的每種圖形對象的信息類型(經過 hgdiobj 參數指定)

對象類型

寫入到緩衝區的數據

HBITMAP

BITMAP 結構

HBITMAP(經過調用 CreateDIBSection 函數得到)

1. DIBSECTION 結構(若是 cbBuffer 參數的值被設置爲 sizeof (DIBSECTION))
2. BITMAP 結構(若是 cbBuffer 參數的值被設置爲 sizeof (BITMAP))

HPALETTE

邏輯調色板的顏色數(WORD 類型)

HPEN(經過調用 ExtCreatePen 函數得到)

EXTLOGPEN 結構

HPEN

LOGPEN結構

HBRUSH

LOGBRUSH 結構

HFONT

LOGFONT 結構


註釋:lpvObject 參數指向的地址必須是 4 字節的倍數,不然 GetObject 函數調用失敗。


返回值:
1. 若是函數調用成功,且 lpvObject 參數是一個有效的指針,則返回值是存儲到緩衝區的字節數;
2. 若是函數調用成功,而 lpvObject 參數是 NULL,則返回值是須要存儲到緩衝區的信息的字節數;
3. 若是函數調用失敗,返回值是 0。


備註:

1. lpvObject 參數指向的緩衝區必定要足夠大以接收圖形對象的信息。
2. 若是 hgdiobj 參數指定一個由調用 CreateDIBSection 函數建立的位圖,且指定的緩衝區足夠大,則 GetObject 函數返回一個 DIBSECTION 結構。
3. 若是 hgdiobj 參數指定一個經過其餘途徑建立的位圖,則 GetObject 只返回位圖的寬、高和顏色格式信息,經過調用 GetDIBits 或 GetBitmapBits 函數能夠獲得位置的位值。
4. 若是 hgdiobj 參數指定一個邏輯調色板,則 GetObject 得到一個 2 字節的整數,該整數指定調色板中的項數,函數不會得到定義調色板的LOGPALETTE 結構,爲了得到有關調色板項的信息,應用程序能夠調用 GetPaletteEntries 函數。

 

 

 

 

83: GetCurrentObject

 

函數功能:

GetCurrentObject 函數用於得到被選入指定環境設備中的指定對象類型的句柄。

API 函數原型:

註釋:_In_ 說明該參數是輸入的。

HGDIOBJ GetCurrentObject(

  _In_  HDChdc,

  _In_  UINTuObjectType

);



參數解析:

參數

含義

hdc

指定設備環境句柄

uObjectType

指定要獲取的對象類型


uObjectType 參數能夠是下邊任意一值:

含義

OBJ_BITMAP

返回指定設備環境選入的位圖

OBJ_BRUSH

返回指定設備環境選入的畫刷

OBJ_COLORSPACE

返回指定設備環境選入的色彩空間

OBJ_FONT

返回指定設備環境選入的字體

OBJ_PAL

返回指定設備環境選入的調色板

OBJ_PEN

返回指定設備環境選入的畫筆



返回值:
1. 若是函數調用成功,返回值是指定對象的句柄;
2. 若是函數調用失敗,返回值是 NULL。

備註:
    應用程序可使用 GetCurrentObject 函數和 GetObject 函數來得到對當前選入給定設備環境的圖形對象的描述。

 

 

 

 

84:SetDCBrushColor

 

函數功能:

SetDCBrushColor 函數用於設置指定設備環境中的畫刷對象的顏色值。若是設備不能提供指定的顏色值,那麼就把顏色設置爲最近的物理顏色。


API 函數原型:

註釋:_In_ 說明該參數是輸入的。

COLORREF SetDCBrushColor(

  _In_  HDChdc,

  _In_  COLORREFcrColor

);



參數解析:

參數

含義

hdc

指定設備環境句柄

crColor

指定新的畫刷顏色


返回值:
1. 若是函數調用成功,返回值是指定設備環境先前的畫刷顏色值(COLORREF 類型);
2. 若是函數調用失敗,返回值是 CLR_INVALID。

備註:
1. 當在一個設備環境中選擇系統預設的 DC_BRUSH 時,之後全部的繪圖操做將使用設備環境中的畫刷顏色,直到系統預設的畫刷被取消選擇爲止,默認的 DC_BRUSH 顏色是 WHITE。
2. 該函數將返回先前的 DC_BRUSH 顏色,即便在設備環境中沒有選擇系統預設的畫刷 DC_BRUSH。然而,除非系統預設的 DC_BRUSH 被選擇入設備環境,不然繪圖操做將不使用它。
3. 使用 DC_PEN 或 DC_BRUSH 參數的 GetStockObject 函數能夠與 SetDCPenColor 函數和 SetDCBrushColor 函數互換。

 

 

 

 

85:SetDCPenColor

 

函數功能:

SetDCPenColor 函數用於設置指定設備環境中的畫筆對象的顏色值。若是設備不能提供指定的顏色值,那麼就把顏色設置爲最近的物理顏色。

API 函數原型:

註釋:_In_ 說明該參數是輸入的。

COLORREF SetDCPenColor(

  _In_  HDChdc,

  _In_  COLORREFcrColor

);


參數解析:

參數

含義

hdc

指定設備環境句柄

crColor

指定新的畫筆顏色



返回值:
1. 若是函數調用成功,返回值是指定設備環境先前的畫筆顏色值(COLORREF 類型);
2. 若是函數調用失敗,返回值是 CLR_INVALID。

備註:
1. 該函數將返回先前的 DC_PEN 顏色,即便在設備環境中沒有選擇系統預設的畫筆 DC_PEN。然而,除非系統預設的 DC_PEN 被選擇入設備環境,不然繪圖操做將不使用它。
2. 使用 DC_PEN 或 DC_BRUSH 參數的 GetStockObject 函數能夠與 SetDCPenColor 函數和 SetDCBrushColor 函數互換。

 

 

 

 

86: GetDCBrushColor

 

函數功能:

GetDCBrushColor 函數用於得到指定設備環境的當前畫刷顏色。

API 函數原型:

註釋:_In_ 說明該參數是輸入的。

COLORREF GetDCBrushColor(

  _In_  HDChdc

);



參數解析:

參數

含義

hdc

指定設備環境句柄



返回值:
1. 若是函數調用成功,返回值是指定設備環境的當前畫刷顏色(COLORREF 類型);
2. 若是函數調用失敗,返回值是 CLR_INVALID。

備註:
1. 有關設置指定設備環境的當前畫刷顏色,請參考:SetDCBrushColor 函數。
ICM:若是ICM可用就執行顏色管理。

 

 

 

 

87:GetDCPenColor

 

函數功能:

GetDCPenColor 函數用於得到指定設備環境的當前畫筆顏色。

API 函數原型:

註釋:_In_ 說明該參數是輸入的。

COLORREF GetDCPenColor(

  _In_  HDChdc

);



參數解析:

參數

含義

hdc

指定設備環境句柄


返回值:
1. 若是函數調用成功,返回值是指定設備環境的當前畫筆顏色(COLORREF 類型);
2. 若是函數調用失敗,返回值是 CLR_INVALID。

備註:
1. 有關設置指定設備環境的當前畫刷顏色,請參考:SetDCPenColor 函數。
ICM:若是ICM可用就執行顏色管理。

 

 

 

 

 

 

 

88:SetBkColor

 

函數功能:

SetBkColor 函數用於設置當前的背景顏色。若是指定的顏色值超出了當前設備的表示範圍,則設置爲最近似的、設備能夠表示的顏色。


API 函數原型:

註釋:_In_ 說明該參數是輸入的。

COLORREF SetBkColor(

  _In_  HDChdc,

  _In_  COLORREFcrColor

);



參數解析:

參數

含義

hdc

指定設備環境句柄

crColor

新的背景顏色值(使用 RGB得到 COLORREF 類型)



返回值:
1. 若是函數調用成功,返回值是先前背景的顏色值(COLORREF 類型);
2. 若是函數調用失敗,返回值是 CLR_INVALID。

備註:

1. 該函數填充由 CreatePen 函數建立出來的非實線畫筆之間的空隙(例如點線畫筆,填充的是畫筆間點和線的空隙,不是客戶區的背景顏色哦)。
2. 該函數不會填充由 ExtCreatePen 函數建立出來的畫筆。
3. 該函數也能夠用於填充 TextOut 函數和 ExtTextOut 函數輸出字符的背景顏色。
4. 若是背景顏色設置爲不透明(OPAQUE)時,背景顏色用來填充非實線畫筆風格的間隙、陰影畫刷和字符的背景顏色。

 

 

 

 

 

 

 

89:SetBkMode

 

函數功能:

SetBkMode 函數用於設置字符、陰影畫刷和非實線畫筆的背景模式。

API 函數檔案:

註釋:_In_ 說明該參數是輸入的。

int SetBkMode(

  _In_  HDChdc,

  _In_  intiBkMode

);



參數解析:

參數

含義

hdc

指定設備環境句柄

iBkMode

背景模式:

OPAQUE

使用當前背景顏色來填充字符、陰影畫刷和非實線畫筆的空隙

TRANSPARENT

背景模式爲透明,Windows 不填充字符、陰影畫刷和非實線畫筆的空隙



返回值:
1. 若是函數調用成功,返回值是先前的背景模式;
2. 若是函數調用失敗,返回值是 0。

備註:
1. 該函數將影響到由 CreatePen 函數建立的非實線畫筆。
2. 該函數並不會影響到由 ExtCreatePen 函數建立的畫筆。

 

 

 

 

90:SetROP2

 

函數功能:

SetROP2 函數用於設置當前的前景色混合模式(繪圖模式)。GDI 使用前景色混合模式,將畫筆的顏色和畫線顯示區域的顏色混合後顯示出來。

API 函數原型:

註釋:_In_ 說明該參數是輸入的。

int SetROP2(

  _In_  HDChdc,

  _In_  intfnDrawMode

);

參數解析:

參數

含義

hdc

指定設備環境句柄

fnDrawMode

繪圖模式,即混合模式,具體請看下邊。



fnDrawMode 參數指定的混合模式能夠是如下值之一:

混合模式

含義

R2_BLACK

顯示的顏色老是黑色

R2_COPYPEN

顯示當前畫筆的顏色

R2_MASKNOTPEN

顯示的顏色是畫筆顏色的取反值和屏幕顏色的交集,即:R2_NOTCOPYPEN & 屏幕顏色

R2_MASKPEN

顯示的顏色是畫筆顏色和屏幕顏色的交集,即:R2_COPYPEN & 屏幕顏色

R2_MASKPENNOT

顯示的顏色是畫筆顏色和屏幕顏色的取反值的交集,即:R2_COPYPEN & R2_NOT

R2_MERGENOTPEN

顯示的顏色是畫筆顏色的取反值和屏幕顏色的並集,即:R2_NOTCOPYPEN | 屏幕顏色

R2_MERGEPEN

顯示的顏色是畫筆顏色和屏幕顏色的並集,即:R2_COPYPEN | 屏幕顏色

R2_MERGEPENNOT

顯示的顏色是畫筆顏色和屏幕顏色的取反值的並集,即:R2_COPYPEN | R2_NOT

R2_NOP

不操做,顏色保持不變

R2_NOT

顯示的顏色是屏幕顏色的取反值

R2_NOTCOPYPEN

顯示的顏色是當前畫筆顏色的取反值

R2_NOTMASKPEN

顯示的顏色是畫筆顏色和屏幕顏色的交集的取反值,即:~R2_MASKPEN

R2_NOTMERGEPEN

顯示的顏色是畫筆顏色和屏幕顏色的並集的取反值,即:~R2_MERGEPEN

R2_NOTXORPEN

顯示的顏色是畫筆顏色和屏幕顏色的異或結果的取反值,即:~R2_XORPEN

R2_WHITE

顯示的顏色老是白色

R2_XORPEN

顯示的顏色是畫筆顏色和屏幕顏色的異或結果,即:R2_COPYPEN ^ 屏幕顏色



返回值:
1. 若是函數調用成功,返回值是先前的混合模式(繪圖模式);
2. 若是函數調用失敗,返回值是 0。

備註:
1. 當使用一個畫筆進行繪製時,其實是在將畫筆的像素顏色和目標顯示錶面的像素顏色按位進行布爾運算。
2. 對像素顏色執行一個按位布爾運算稱爲「光柵操做」(Raster Operation, ROP),簡稱「ROP」,由於只涉及兩種像素顏色(即畫筆和屏幕),因此這裏的布爾運算就被稱爲「二元光柵操做」,或者「ROP2」。
3. 混合模式(繪圖模式)僅支持光柵設備,並不支持矢量設備。

 

 

 

 

91:GetROP2

 

函數功能:

GetROP2 函數用於獲取指定設備環境的前景色混合模式(繪圖模式)。GDI 使用前景色混合模式,將畫筆的顏色和畫線顯示區域的顏色混合後顯示出來。


API 函數原型:

註釋:_In_ 說明該參數是輸入的。

int GetROP2(

  _In_  HDChdc

);

 



參數解析:

參數

含義

hdc

指定設備環境句柄


返回值:
1. 若是函數調用成功,返回值是指定設備環境的前景色混合模式;
2. 若是函數調用失敗,返回值是 0。

備註:

前景色混合模式能夠是如下值:

混合模式

含義

R2_BLACK

顯示的顏色老是黑色

R2_COPYPEN

顯示當前畫筆的顏色

R2_MASKNOTPEN

顯示的顏色是畫筆顏色的取反值和屏幕顏色的交集,即:R2_NOTCOPYPEN & 屏幕顏色

R2_MASKPEN

顯示的顏色是畫筆顏色和屏幕顏色的交集,即:R2_COPYPEN & 屏幕顏色

R2_MASKPENNOT

顯示的顏色是畫筆顏色和屏幕顏色的取反值的交集,即:R2_COPYPEN & R2_NOT

R2_MERGENOTPEN

顯示的顏色是畫筆顏色的取反值和屏幕顏色的並集,即:R2_NOTCOPYPEN | 屏幕顏色

R2_MERGEPEN

顯示的顏色是畫筆顏色和屏幕顏色的並集,即:R2_COPYPEN | 屏幕顏色

R2_MERGEPENNOT

顯示的顏色是畫筆顏色和屏幕顏色的取反值的並集,即:R2_COPYPEN | R2_NOT

R2_NOP

不操做,顏色保持不變

R2_NOT

顯示的顏色是屏幕顏色的取反值

R2_NOTCOPYPEN

顯示的顏色是當前畫筆顏色的取反值

R2_NOTMASKPEN

顯示的顏色是畫筆顏色和屏幕顏色的交集的取反值,即:~R2_MASKPEN

R2_NOTMERGEPEN

顯示的顏色是畫筆顏色和屏幕顏色的並集的取反值,即:~R2_MERGEPEN

R2_NOTXORPEN

顯示的顏色是畫筆顏色和屏幕顏色的異或結果的取反值,即:~R2_XORPEN

R2_WHITE

顯示的顏色老是白色

R2_XORPEN

顯示的顏色是畫筆顏色和屏幕顏色的異或結果,即:R2_COPYPEN ^ 屏幕顏色



 

 

 

92:Polygon

 

函數功能:

Polygon 函數用於繪製一個由直線相連的兩個以上頂點組成的多邊形。該函數用當前畫筆繪製多邊形的輪廓,用當前畫刷和多邊形填充模式填充多邊形。


API 函數原型:

註釋:_In_ 說明該參數是輸入的。

BOOL Polygon(

  _In_  HDChdc,

  _In_  constPOINT *lpPoints,

  _In_  intnCount

);



參數解析:

參數

含義

hdc

指定設備環境句柄

lpPoints

指向用於指定多邊形頂點的 POINT結構數組的指針

nCount

指定數組中頂點的個數,此值必須大於等於 2



返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。

備註:
1. 該函數會自動鏈接最後一個頂點和第一個頂點,構成一個閉合的多邊形(Polyline 函數不會這麼作)。
2. 該函數並不會使用和改變當前位置。

 

 

 

 

93:PolyPolygon 

 

函數功能:

PolyPolygon 函數用於一系列多邊形。該函數用當前畫筆繪製多邊形的輪廓,用當前畫刷和多邊形填充模式填充多邊形。

該函數繪製的多邊形能夠重疊。

API 函數原型:

註釋:_In_ 說明該參數是輸入的。

BOOL PolyPolygon(

  _In_  HDChdc,

  _In_  constPOINT *lpPoints,

  _In_  constINT *lpPolyCounts,

  _In_  intnCount

);



參數解析:

參數

含義

hdc

指定設備環境句柄

lpPoints

指向用於指定全部多邊形頂點的 POINT結構數組的指針

lpPolyCounts

1. 一個指向數組的指針,數組中每一個元素用於指定相應多邊形的頂點的數量
2. 每一個數組元素的值必須大於等於 2

nCount

總共繪製多邊形的數量



返回值:
1. 若是函數調用成功,返回值是非 0;
2. 若是函數調用失敗,返回值是 0。

備註:
1. 該函數並不會使用和改變當前位置。

 

 

 

 

94:SetPolyFillMode

 

函數功能:

SetPolyFillMode 函數設置多邊形的填充模式,用於填充多邊形。

API 函數原型:

註釋:_In_ 說明該參數是輸入的。

int SetPolyFillMode(

  _In_  HDChdc,

  _In_  intiPolyFillMode

);



參數解析:

參數

含義

hdc

指定設備環境句柄

iPolyFillMode

指定新的填充模式



iPolyFillMode 參數指定的填充模式能夠是如下值之一:

含義

ALTERNATE

交替模式(GDI 填充每條掃描線從多邊形的奇數邊到偶數邊之間的區域)

WINDING

螺旋模式(GDI 填充全部可以一筆完成的多邊形)



返回值:
1. 若是函數調用成功,返回值是先前的填充模式;
2. 若是函數調用失敗,返回值是 0。


備註:
1. 在一般狀況下,兩種模式僅在繪製複雜、重疊的多邊形纔會有不一樣的顯示(例如五角星)。

 
2. 當填充模式爲 ALTERNATE,GDI 填充每條掃描線從多邊形的奇數邊到偶數邊之間的區域。也就是說,GDI 依次填充多邊形的第1、第二條邊之間的區域,接着填充第3、第四條邊之間的區域(第2、第三條邊之間的區域留空),以此類推。
3. 當填充模式爲 WINDING,GDI 填充全部可以一筆完成的多邊形。

 

 

 

 

95:GetBkMode

 

函數功能:

GetBkMode 函數用於得到字符、陰影畫刷和非實線畫筆的背景模式。

API 函數原型:

註釋:_In_ 說明該參數是輸入的。

int GetBkMode(

  _In_  HDChdc

);

參數解析:

參數

含義

hdc

指定設備環境句柄



返回值:
1. 若是函數調用成功,返回值是指定設備環境當前的背景模式(OPAQUE 或 TRANSPARENT);
2. 若是函數調用失敗,返回值是 0。

 

 

 

 

 

 

 

 

96: GetPolyFillMode 

 

函數功能:

GetPolyFillMode 函數用於得到當前的多邊形填充模式。


API 函數原型:

註釋:_In_ 說明該參數是輸入的。

int GetPolyFillMode(

  _In_  HDChdc

);



參數解析:

參數

含義

hdc

指定設備環境句柄



返回值:
1. 若是函數調用成功,返回值是指定設備環境的多邊形填充模式;
2. 若是函數調用失敗,返回值是 0。

備註:
1. 多邊形的填充模式能夠是如下值之一:

含義

ALTERNATE

交替模式(GDI 填充每條掃描線從多邊形的奇數邊到偶數邊之間的區域)

WINDING

選擇螺旋模式(GDI 填充全部可以一筆完成的多邊形)


2. 關於兩種填充模式的區別,請看 SetPolyFillMode 函數。

 

 

 

97:CreateSolidBrush

 

函數功能:

CreateSolidBrush 函數用於建立一個指定顏色的邏輯畫刷。


API 函數原型:

註釋:_In_ 說明該參數是輸入的。

HBRUSH CreateSolidBrush(

  _In_  COLORREFcrColor

);



參數解析:

參數

含義

crColor

1. 指定畫刷的 RGB 顏色
2. RGB 顏色使用 RGB生成 COLORREF 結構


返回值:
1. 若是函數調用成功,返回值是新畫刷的句柄;
2. 若是函數調用失敗,返回值是 NULL。

備註:
1. 若是你不再須要該畫刷,可使用 DeleteObject 函數將其刪除。
2. 實心畫刷實際上就是指系統用來繪製要填充圖形的內部區域的位圖。
3. 調用該函數建立新畫刷以後,可使用 SelectObject 函數將新畫刷選入設備環境中。
4. 當要使用系統畫刷的時候,應用程序應該使用 GetSysColorBrush(iIndex) 代替CreateSolidBrush(GetSysColor(nIndex))。由於GetSysColorBrush 函數會使用緩存好的畫刷而不用從新建立一個新的。

ICM:在建立刷子時沒有顏色操做。然而,當把該刷子選入ICM許可的設備環境中時,將進行顏色管理。

 

 

 

 

98:LOGBRUSH 結構

LOGBRUSH 結構定義了邏輯畫刷的樣式,顏色和圖案。CreateBrushIndirect 函數和 ExtCreatePen 函數須要使用到該結構。

結構原型:

typedef struct tagLOGBRUSH {

  UINT     lbStyle;

  COLORREF  lbColor;

  ULONG_PTR lbHatch;

} LOGBRUSH, *PLOGBRUSH;


成員解析:

成員

含義

lbStyle

指定畫刷的樣式,該成員決定着 Windows 如何解釋另外的兩個成員:

含義

BS_DIBPATTERN

1. 帶圖案的刷子,由設備無關位圖(DIB)來定義
2. lbHatch 成員應該是 DIB 的句柄

BS_DIBPATTERN8X8

同 BS_DIBPATTERN

BS_DIBPATTERNPT

1. 帶圖案的刷子,由設備無關位圖(DIB)來定義
2. lbHatch 成員應該是指向 DIB 的指針

BS_HATCHED

陰影畫刷

BS_HOLLOW

空畫刷

BS_NULL

同 BS_HOLLOW

BS_PATTERN

由內存位圖定義的畫刷

BS_PATTERN8X8

同 BS_PATTERN

BS_SOLID

實心畫刷

lbColor

1. 指定畫刷的顏色
2. 若是 lbStyle 成員的值是 BS_HOLLOW 或 BS_PATTERN,該值被忽略
3. 若是 lbStyle 成員的值是 BS_DIBPATTERN 或 BS_DIBPATTERNPT,該值的低 8 位指定 BITMAPINFO 結構中的 bmiColors 成員,包含明確的 RGB 值或當前調色板的索引值:

含義

DIB_PAL_COLORS

包含了當前使用的邏輯調色板中的 16 位索引數組的顏色表

DIB_RGB_COLORS

包含了明確的 RGB 值的顏色表

4. 若是 lbStyle 成員的值是 BS_HATCHED 或 BS_SOLID,該值是一個 COLORREF 類型的顏色值(使用 RGB建立 COLORREF 類型)

lbHatch

1. 指定畫刷的陰影樣式
2. 若是 lbStyle 成員的值是 BS_DIBPATTERN,該值是一個 DIB 的句柄。爲了得到這個句柄,應用程序須要調用 GlobalAlloc 函數(GMEM_MOVEABLE 標誌)或調用 LocalAlloc 函數(LMEM_MOVEABLE 標誌)分配內存塊,而後填充 DIB。
3. 若是 lbStyle 成員的值是 BS_DIBPATTERNPT,該值是一個指向 DIB 的指針。該指針指向經過調用 LocalAlloc 函數(LMEM_FIXED 標誌)或 GlobalAlloc 函數(GMEM_FIXED 標誌)建立的內存塊,或經過調用 LocalLock (handle_to_the_dib) 函數返回。
4. 若是 lbStyle 成員的值是 BS_HATCHED,該值指定陰影的樣式:

含義

HS_BDIAGONAL

45 度向上,從左至右的陰影

HS_CROSS

水平和垂直交叉陰影

HS_DIAGCROSS

45 度交叉陰影

HS_FDIAGONAL

45 度向下,自左至右陰影

HS_HORIZONTAL

水平陰影

HS_VERTICAL

垂直陰影

5. 若是 lbStyle 成員的值是 BS_PATTERN,該值是一個定義圖案位圖的句柄(該位圖不能是 CreateDIBSection 函數建立的 DIB 位圖)
6. 若是 lbStyle 成員的值是 BS_SOLID 或 BS_HOLLOW,該值被忽略



備註:
1. DIB(設備無關位圖文件格式)包含 BITMAPINFO 結構以及緊跟着的存儲像素陣列的數組。
2. 儘管 lbColor 成員指定了陰影畫刷的前景色,但調用 SetBkMode 函數和 SetBkColor 函數能夠控制背景顏色。

 

 

 

99:CreateHatchBrush

 

函數功能:

CreateHatchBrush 函數用於建立一個具備指定陰影樣式和顏色的邏輯刷子。

API 函數原型:

註釋:_In_ 說明該參數是輸入的。

HBRUSH CreateHatchBrush(

  _In_  intfnStyle,

  _In_  COLORREFclrref

);


參數解析:

參數

含義

fnStyle

指定畫刷的陰影樣式(具體請看下方)

clrref

1. 指定用於畫刷陰影的前景色
2. RGB 顏色使用 RGB生成 COLORREF 結構



fnStyle 參數指定畫刷的陰影樣式以下:

含義

HS_BDIAGONAL

45 度向上,從左至右的陰影

HS_CROSS

水平和垂直交叉陰影

HS_DIAGCROSS

45 度交叉陰影

HS_FDIAGONAL

45 度向下,自左至右陰影

HS_HORIZONTAL

水平陰影

HS_VERTICAL

垂直陰影



 返回值:
1. 若是函數調用成功,返回值是新畫刷的句柄;
2. 若是函數調用失敗,返回值是 NULL。

備註:
1. 陰影畫刷實際上就是指系統用來繪製要填充圖形的內部區域的位圖。
2. 調用該函數建立新畫刷以後,可使用 SelectObject函數將新畫刷選入設備環境中。
3. 調用 SetBkColor 函數能夠修改畫刷圖案的背景色。 
4. 調用 SetBkMode 函數能夠影響搞該陰影畫刷的渲染效果(若是是 OPAQUE 模式,背景顏色被用來填充線與線之間的空隙;若是是 TRANSPARENT模式,Windows 就只畫出陰影線,不填充它們之間的空隙)。
5. 若是應用程序使用帶陰影的刷子,用合適的顏色填充父窗口和子窗口的背景,那麼在繪刷子窗口的背景以前,有可能須要設置刷子的起始點。要作到這一點,能夠在應用程序中調用 SetBrushOrgEx 函數。
6. 若是你不再須要該畫刷,可使用 DeleteObject 函數將其刪除。 ICM:在建立刷子時沒有顏色,然而在把該刷子選入到ICM許可的設備環境中時,將會完成顏色管理。

相關文章
相關標籤/搜索