日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

MFC的常用结构

發布時間:2023/12/20 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC的常用结构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄:

?

1:MessageBox??????? -------------------------------- 1

2:MessageBox??????? ---------------------------------4

3:MessageBox??????? -------------------------------- 6

4:ShowWindow??????? ---------------------------------9

5:?UpdateWindow__更新窗口? -------------------------11

6:MSG 消息結構???----------------------------------11

7:?GetMessage???? ----------------------------------12

8:TranslateMessage? --------------------------------13

9:?DispatchMessage? --------------------------------14

10:PAINTSTRUCT 結構? -------------------------------14
11:RECT 結構?????----------------------------------15
12:BeginPaint???? ----------------------------------16

13:GetClientRect? ----------------------------------17

14:DrawText?????? ----------------------------------17

15:EndPaint?????? --------------------------------- 20

16:PostQuitMessage?? -------------------------------21

17:DefWindowProc???? -------------------------------22

18:?DestroyWindow??------------------------------- 23

19:TextOut??????? --------------------------------- 23

20:GetTextAlign??--------------------------------- 24

21:SetTextAlign??? -------------------------------- 26

22:wsprintf???? ----------------------------------- 28

23:StringCchPrintf?? ------------------------------ 28

24:strlen????? ------------------------------------30

25:SUCCEEDED 和FAILED 宏?------------------------ 31

26:StringCchLength?? ------------------------------ 31

27:StringCchCat???-------------------------------- 33

28:?lstrcat????? ---------------------------------- 34

29:StringCchCopy??? ------------------------------- 35

30:lstrcpy???? ------------------------------------ 36

31:GET_X_LPARAM和 GET_Y_LPARAM 宏? --------------- 37

32:TEXTMETRIC 結構??? ----------------------------- 37

33:?GetTextMetrics??? ----------------------------? 39

34:GetSystemMetrics?? ----------------------------- 40

35:SetScrollRange??? -----------------------------? 46

36:GetScrollPos????? -----------------------------? 47

37:GetScrollRange?? ------------------------------- 48

38:?LOWORD 和HIWORD 宏? --------------------------50

39:?WM_SIZE 消息??? ------------------------------- 50

40:WM_VSCROLL 消息?? -----------------------------? 51

41:WM_HSCROLL 消息? ------------------------------- 52

42:InvalidateRect? -------------------------------- 54

43:SCROLLINFO 結構? -------------------------------? 55

44:SetScrollInfo??? -------------------------------- 56

45:?GetScrollInfo?? -------------------------------- 57

46:ScrollWindow???? -------------------------------- 59

47:ScrollWidnowEx? --------------------------------- 66

48:RGB 宏??? --------------------------------------- 68

49:SetPixel??? -------------------------------------- 69

50:GetRValue、GetGValue和 GetBValue 宏 ------------ 70

51:GetPixel? --------------------------------------- 71

52:SetPixelV?? ------------------------------------- 72

53:GetDC??? ---------------------------------------- 73

54:ReleaseDC? -------------------------------------- 74

55:?GetWindowDC?? ---------------------------------? 75

56:CreateDC???------------------------------------- 76

57:CreateCompatibleDC? ----------------------------- 77

58:CreateMetaFile?? -------------------------------- 78

59:?CloseMetaFile?? -------------------------------- 79

60:MoveToEx?? -------------------------------------- 79

61:LineTo?? ---------------------------------------? 80

62:POINT 結構?? -----------------------------------? 81

63:GetCurrentPositionEx? --------------------------- 82

64:Polyline?? -------------------------------------- 82

65:PolylineTo??-----------------------------------?83

66:PolyPolyline?? ---------------------------------? 84

67:GetDeviceCaps?---------------------------------- 85

68:PolyBezier??------------------------------------ 91

69:?PolyBezierTo? ---------------------------------? 92

70:Rectangle?-------------------------------------- 93

71:Ellipse??--------------------------------------- 94

72:RoundRect?-------------------------------------- 95

73:Arc?? -------------------------------------------96

74:Chord??----------------------------------------?98

75:Pie??? -----------------------------------------100

76:GetStockObject?-------------------------------- 101

77:SelectObject? -----------------------------------103

78:CreatePen?? ------------------------------------ 105

79:LOGPEN 結構? ----------------------------------- 106

80:?CreatePenIndirect? ---------------------------- 107

81:?DeleteObject? --------------------------------- 108

82:GetObject? ------------------------------------- 109

83:?GetCurrentObject? ----------------------------- 110

84:SetDCBrushColor? ------------------------------- 111

85:SetDCPenColor---------------------------------- 112

86:?GetDCBrushColor------------------------------- 113

87:GetDCPenColor? -------------------------------- 114

88:SetBkColor? ----------------------------------- 115

89:SetBkMode? ------------------------------------ 116

90:SetROP2?? ------------------------------------- 116

91:GetROP2?-------------------------------------- 118

92:Polygon?? ------------------------------------- 119

93:PolyPolygon? ---------------------------------- 120

94:SetPolyFillMode? ------------------------------ 121

95:GetBkMode?------------------------------------ 123

96:?GetPolyFillMode? ----------------------------- 124

97:CreateSolidBrush? ----------------------------- 124

98:LOGBRUSH 結構? -------------------------------- 125

99:CreateHatchBrush ------------------------------ 127

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

1:MessageBox

?

函數功能:

MessageBox 函數用于顯示一個模態對話框,其中包含一個系統圖標、 一組按鈕和一個簡短的特定于應用程序消息,如狀態或錯誤的信息。
??? 消息框中返回一個整數值,該值指示用戶單擊了哪個按鈕。

API 函數原型:

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

?

int WINAPI MessageBox(

??_In_opt_??HWNDhWnd,

??_In_opt_??LPCTSTRlpText,

??_In_opt_??LPCTSTRlpCaption,

??_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。

UpdateWindow,?WindowsSDK,?WindowsAPI,?SDK教程,?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<

總結

以上是生活随笔為你收集整理的MFC的常用结构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久草精品资源 | 天天操天 | 新av在线| 欧美精品三级 | 亚洲一级片av | 97精品一区 | 日日夜夜添 | 91亚洲精品久久久中文字幕 | 亚洲精品国产精品乱码在线观看 | 日本一区二区高清不卡 | 天干啦夜天干天干在线线 | 日日夜夜噜噜噜 | 日韩精品一区二区三区免费观看 | 99久久www免费 | 久久国产精彩视频 | 色在线视频 | 中文字幕在线视频第一页 | 久久私人影院 | 欧美性脚交| 黄色国产在线观看 | 成人av免费在线播放 | 日本乱视频 | 亚洲香蕉视频 | 亚洲精品国久久99热 | 免费看av在线 | 国产麻豆精品95视频 | 激情丁香月| 久久人人爽人人人人片 | 国产亚洲精品久久久久久久久久久久 | 欧美成人理伦片 | 成人在线播放免费观看 | 欧美伦理一区二区 | 国产女教师精品久久av | 菠萝菠萝在线精品视频 | 精品国产乱码久久久久久1区2匹 | 欧美男同视频网站 | 国产精品女同一区二区三区久久夜 | 免费特级黄毛片 | 五月婷婷婷婷婷 | 9久久精品| 久久久久久久久久免费 | 亚洲视频久久 | 国产精品成人一区二区三区吃奶 | 婷婷丁香激情五月 | 中文字幕最新精品 | 91在线视频导航 | 国产精品久久三 | 97碰碰碰 | 久久综合之合合综合久久 | 99精品视频网站 | 久久国产午夜精品理论片最新版本 | 93久久精品日日躁夜夜躁欧美 | 亚洲国产高清在线观看视频 | av成人在线电影 | 一区二区高清在线 | 六月丁香在线观看 | 免费看一级黄色 | 亚洲人成在线电影 | 国产日产高清dvd碟片 | 久草精品网 | 久久99热这里只有精品国产 | 夜夜操天天操 | 亚洲天天干 | 国产综合久久 | 久久av在线播放 | 国内少妇自拍视频一区 | 亚洲精品高清在线 | 国产分类视频 | 国产99久久久精品视频 | 亚洲 欧洲 国产 精品 | 亚洲精品视频免费在线观看 | 久草com | 91一区在线观看 | 一区二区不卡 | 亚洲最大成人免费网站 | 婷婷中文在线 | 国产一区二区三区免费在线观看 | 国产91在线观看 | 天天久久综合 | 日韩中文字幕免费在线观看 | 五月天婷亚洲天综合网鲁鲁鲁 | 97视频亚洲 | 麻豆一精品传二传媒短视频 | 天天干天天草天天爽 | 99人成在线观看视频 | 精品久久久久久综合日本 | 在线看成人片 | 成人免费看电影 | 婷婷久月| 成 人 黄 色 片 在线播放 | 一本之道乱码区 | 国产真实精品久久二三区 | 婷婷深爱网 | 在线观看中文字幕dvd播放 | av在线等 | 国产在线精品福利 | 日韩久久精品一区二区 | 国产在线观看 | 天堂麻豆 | 天天色天| 亚洲欧洲精品一区二区精品久久久 | 九九热在线视频 | 天天操天天是 | 深爱开心激情网 | 亚洲精品视频网站在线观看 | 欧美精品久久久久久久亚洲调教 | 欧美日韩在线播放 | 日本在线视频一区二区三区 | 久久久久久久久久影视 | 国产99re | 成人国产一区 | 中文字幕欲求不满 | 国产精品免费观看久久 | 色是在线视频 | 国产探花视频在线播放 | 91在线播放视频 | 国产精品高潮呻吟久久av无 | 免费av小说 | 国产精品二区三区 | 久久久久五月天 | 久久99久国产精品黄毛片入口 | 久久五月婷婷丁香社区 | 18国产精品福利片久久婷 | 天天噜天天色 | 国产一线二线三线在线观看 | 蜜臀久久99精品久久久酒店新书 | 久久人人爽爽人人爽人人片av | 在线一区二区三区 | 国产精品一区二区在线免费观看 | 91九色视频在线 | 91久久电影| 欧美亚洲一区二区在线 | av 一区二区三区 | 亚洲专区免费观看 | 91精品视频播放 | 亚洲男女精品 | 日本久草电影 | 亚洲天堂网站 | 亚洲一区不卡视频 | 香蕉视频在线免费 | 黄色亚洲| 国产在线观看午夜 | 日韩综合在线观看 | 久久精品一区二区国产 | 日本精品一区二区 | 久久久www| 久久伊人精品天天 | 91激情在线视频 | 国产成人亚洲在线观看 | 久久亚洲私人国产精品 | 天天操天天摸天天干 | 久99久中文字幕在线 | 一区二区三区韩国免费中文网站 | 97精产国品一二三产区在线 | 91精品999| 久久久久亚洲精品国产 | 91黄色在线视频 | 91一区二区在线 | 日韩国产精品久久久久久亚洲 | 四虎国产精品成人免费影视 | 91麻豆产精品久久久久久 | 丁香激情婷婷 | 友田真希x88av | 国产精品激情在线观看 | 午夜18视频在线观看 | 91av电影在线 | 成人黄色大片网站 | 婷婷 中文字幕 | 中文字幕激情 | 日韩有码在线播放 | 国产一级免费电影 | 久草9视频 | 久久精品视频4 | 久久免费看av | 激情偷乱人伦小说视频在线观看 | 国产成人久久av977小说 | 日韩中文字幕91 | 福利电影久久 | 国产一二三四在线视频 | 日韩免费在线一区 | 精品字幕| 精品亚洲成人 | 极品中文字幕 | 久久久久久国产精品免费 | 狠狠躁夜夜躁人人爽视频 | 国产精品久久综合 | 亚洲五月婷| 亚洲精品国偷自产在线91正片 | 免费麻豆| 日本精品在线视频 | 97在线免费 | 免费在线观看av片 | 久久久免费看片 | 免费av大片| 久草视频精品 | 国产一级片免费播放 | 国产精品99久久免费观看 | 一区二区三区高清不卡 | 一区二区三区中文字幕在线 | 国产精彩视频一区 | 六月丁香婷婷久久 | 欧美日韩69| 成人亚洲网 | 97超碰成人在线 | 中文字幕国产一区 | 在线精品视频免费播放 | 91视频中文字幕 | 在线免费av电影 | 日本xxxx.com | 在线亚洲观看 | 精品字幕 | 久久不射网站 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 日韩一级理论片 | 久精品在线观看 | 久久久国产精品人人片99精片欧美一 | 在线免费性生活片 | 99国产高清 | 蜜臀一区二区三区精品免费视频 | 最近中文字幕在线中文高清版 | 久久这里只有精品9 | 91污污 | 久久亚洲私人国产精品 | 黄色影院在线免费观看 | 深爱激情亚洲 | 亚洲精品播放 | 久热免费| 日韩视频一区二区三区在线播放免费观看 | 九九九视频精品 | 在线一区二区三区 | a在线观看免费视频 | 在线播放 日韩专区 | 国产中文字幕网 | 欧美日本在线观看视频 | 国产精品欧美一区二区 | 美女视频黄免费的久久 | 精品999在线观看 | www.com操| 日韩精品高清视频 | 久久综合婷婷国产二区高清 | 婷婷激情综合 | 精品成人国产 | 九九九热精品免费视频观看网站 | 99精品在线免费视频 | 日韩精品一区二区三区在线播放 | 97福利 | 亚洲成人黄 | 国产v在线播放 | 国产美女黄网站免费 | 久久久久久久久久久免费视频 | 中文字幕在线观看免费观看 | va视频在线观看 | 亚洲爽爽网 | 中文字幕一区二区三区四区在线视频 | www.天天成人国产电影 | 四虎永久免费在线观看 | 色综合久久88色综合天天人守婷 | 国产白浆视频 | 国产成人1区 | 黄色在线网站噜噜噜 | 人人干网| 欧美综合在线观看 | 亚洲欧美国产精品久久久久 | 色综合在 | avv天堂| 久久综合操 | 日韩a在线看| 一区二区三区手机在线观看 | 国产老熟 | 99精品国产一区二区三区不卡 | 免费在线观看av网址 | 久草在线最新 | 久久久久久久久久久久久久电影 | 五月婷婷视频在线 | 久草亚洲视频 | 五月婷婷久 | 久久在线精品 | 99亚洲视频 | 亚洲精品乱码久久久久 | 开心激情网五月天 | 午夜18视频在线观看 | 久久精品美女视频网站 | 亚洲精品国内 | 久久综合精品国产一区二区三区 | 亚洲精品国久久99热 | 深夜激情影院 | av中文字幕在线看 | 欧美日韩一级在线 | 中文字幕视频免费观看 | 在线电影 你懂得 | 久草在线手机观看 | 一级免费黄视频 | 国产精品观看在线亚洲人成网 | 69国产精品视频免费观看 | 日日夜夜91 | 久久好看免费视频 | 久久国产经典视频 | 国产精品久久久久久久久大全 | 中文字幕免费不卡视频 | 婷婷国产在线 | 懂色av懂色av粉嫩av分享吧 | 婷婷视频在线观看 | 久久久久久久综合色一本 | av免费电影网站 | 国产色女 | 欧美精品久久久久性色 | 亚洲开心色 | 亚洲精品欧美视频 | 精品国产免费看 | 五月天国产精品 | 伊人色综合网 | 国产破处在线视频 | 国产又黄又爽又猛视频日本 | 黄色a在线 | 午夜视频在线观看一区二区 | 在线精品视频在线观看高清 | 91中文字幕网 | 麻豆国产在线播放 | 中文av影院 | 精品视频97 | 久久av在线 | 久草在线最新 | 最新超碰在线 | 天天在线免费视频 | 91av视频免费在线观看 | 精品 一区 在线 | 亚洲激情在线播放 | 手机成人免费视频 | 91麻豆免费看 | 日韩一区二区三区高清在线观看 | av在线播放免费 | 久久国产精彩视频 | 久久成年人视频 | 久久视奸| 久久99视频免费观看 | 国产精品人人做人人爽人人添 | 久久久久久久福利 | 欧美激情第八页 | 欧美在线视频一区二区 | 免费看的av片 | 亚洲无线视频 | 午夜av免费在线观看 | 精品国产黄色片 | 狠狠插天天干 | 色国产精品一区在线观看 | 三级动图| 99福利影院 | 国产精品免费久久久 | 91成人小视频| 婷婷色六月天 | 91尤物国产尤物福利在线播放 | 337p日本欧洲亚洲大胆裸体艺术 | 日韩一区二区三区在线看 | 免费成人在线网站 | 亚洲高清在线 | 国产成人三级在线播放 | 亚洲综合激情小说 | 天天躁日日躁狠狠躁av麻豆 | 91av在线看 | 蜜臀久久99精品久久久无需会员 | 中文字幕电影网 | 最新av网址大全 | 中文字幕电影一区 | 亚洲视频网站在线观看 | 中文字幕在线观看免费观看 | 国产明星视频三级a三级点| 超级av在线 | 婷婷网站天天婷婷网站 | 国产一级性生活视频 | 欧美另类交人妖 | 天天操天天色天天射 | 国产精品久久久久久高潮 | 久久久久久久久网站 | 色婷婷激婷婷情综天天 | 日本激情视频中文字幕 | ,午夜性刺激免费看视频 | 亚洲欧美成人在线 | 国产精品成人免费精品自在线观看 | 麻豆视频网址 | 亚洲性少妇性猛交wwww乱大交 | 精品人人人人 | 天天操天天操天天操天天操 | 91在线精品观看 | 日韩综合一区二区 | 久久在线观看 | 国产女人免费看a级丨片 | 国产视频精品在线 | 玖玖视频| 日韩欧美在线高清 | 在线观看黄色大片 | 久久国产精品一国产精品 | 久黄色| 成人黄色小说在线观看 | 69久久99精品久久久久婷婷 | 在线观看a视频 | 亚洲伊人网在线观看 | 亚洲国产精彩中文乱码av | 在线小视频 | 成人黄色免费在线观看 | 99久久婷婷国产一区二区三区 | 国产高清在线一区 | 狠狠干免费| 热久久视久久精品18亚洲精品 | 国产精品 日韩精品 | 国产经典三级 | 99九九视频| 中文字幕成人在线观看 | 69国产成人综合久久精品欧美 | 2019中文字幕网站 | 日韩性网站 | 国产精品久久免费看 | 午夜视频欧美 | 国产一区二区视频在线 | 久久好看免费视频 | 在线免费中文字幕 | 久草在线久草在线2 | 国产另类xxxxhd高清 | 久久国产a| 欧美另类视频 | 亚洲伦理一区二区 | 91欧美在线| 日本中文不卡 | 一本一道久久a久久综合蜜桃 | 欧美一二区在线 | 999国产在线 | 香蕉视频一级 | 亚洲欧美经典 | 亚洲精品乱码久久久久久写真 | 五月婷婷在线视频观看 | 免费看的毛片 | 日韩欧美在线综合网 | 一本一本久久a久久精品综合妖精 | 欧美日韩99| 国产精品欧美久久久久无广告 | 国产精品久久久久久久久久久免费看 | 射射射av | 国产小视频免费在线网址 | 高清精品在线 | 婷婷色网址 | 丁香综合五月 | 制服丝袜一区二区 | 91av视频免费观看 | 五月天开心 | 中文字幕一区二区三区四区 | 2019久久精品 | 久久国产美女 | 青青草国产在线 | 99精品偷拍视频一区二区三区 | 国产四虎在线 | 亚洲 中文 欧美 日韩vr 在线 | 精油按摩av | 在线国产能看的 | 久久综合久久综合这里只有精品 | 久久综合成人 | 精品一区二区在线看 | 99视频免费观看 | 久久精品99国产精品亚洲最刺激 | 天天操天天干天天玩 | 久久久国产精品久久久 | 久久久免费高清视频 | av福利在线| 欧美性免费 | 伊人天天色 | 成人av影视 | 欧美日韩三级在线观看 | 国产区高清在线 | 亚洲欧美久久 | 欧美午夜a | 久草在线最新视频 | 国产视频在线观看一区 | 四虎国产精品成人免费4hu | 五月天综合婷婷 | 2019中文最近的2019中文在线 | 丝袜制服综合网 | www免费看片com | 精品久久久久久久久亚洲 | 天堂素人在线 | 人人干人人艹 | 午夜精品电影一区二区在线 | 天天草天天干天天 | 日韩成人精品 | 色网站在线观看 | 免费在线观看一区二区三区 | 色综合狠狠干 | 国产69精品久久久久久久久久 | 欧美三级免费 | 国产一区二区三区 在线 | 操操操av | 一区二区三区国 | 狠狠操操网 | 久久一久久 | 福利片视频区 | 在线观看日韩专区 | 日韩电影一区二区三区 | 亚洲视频在线观看网站 | 99精品国产福利在线观看免费 | 国内精品久久久久久久影视简单 | 91aaa在线观看 | 精品99免费| 日本中文字幕免费观看 | 精品国产一区二区在线 | 欧美久久久久久久 | 黄色片网站av | 婷婷九月激情 | 在线观看免费av片 | 日韩在线免费不卡 | av不卡网站| 免费视频xnxx com | 久99久中文字幕在线 | 国产精品爽爽爽 | 丁香六月在线观看 | 亚洲狠狠干 | 在线看成人| 99久久电影 | 国产色区 | 91成人免费视频 | 久久国产免费视频 | 一区中文字幕在线观看 | 色网站在线免费观看 | 丝袜精品视频 | 欧美 高跟鞋交 xxxxhd | 久操伊人| 亚洲最新av网址 | 九九在线精品视频 | av免费网 | 在线观看免费版高清版 | 少妇av片| 国产精品午夜av | 亚洲一区网 | 成人免费在线播放 | 免费一级特黄录像 | 久久一区二区免费视频 | 韩国av电影网| 欧洲一区二区在线观看 | 精品亚洲免费 | 一级黄色片毛片 | 国产色视频一区二区三区qq号 | 亚洲精品乱码久久久久久久久久 | 国产三级在线播放 | 色视频在线免费观看 | 四虎影视国产精品免费久久 | www毛片com| 久久尤物电影视频在线观看 | 少妇视频一区 | 国产免码va在线观看免费 | 精品麻豆| 成人午夜电影在线播放 | 日本精品中文字幕在线观看 | 992tv在线观看网站 | 亚洲美女免费视频 | 中文字幕第一页在线视频 | 91污视频在线观看 | 中文字幕黄色 | 国产色区 | 国产一区二区久久久 | 中文字幕a∨在线乱码免费看 | 综合天天色 | 欧美日韩国产在线 | 天堂中文在线视频 | 91看片黄色| www五月天| 视频在线观看入口黄最新永久免费国产 | 成人av视屏 | 天天操天天色天天 | 在线免费视频你懂的 | 国产精品免费麻豆入口 | 日韩大片在线 | 成人黄色电影在线 | 色丁香久久 | 91精品久久香蕉国产线看观看 | 久久久久国产精品一区 | 日韩精品一区二区三区第95 | 精品国产一二三四区 | 欧美激情精品 | 国产青青青 | 欧美analxxxx| 国产亚洲在线视频 | 成人a免费 | 九九热久久免费视频 | 国产精品久久久久婷婷二区次 | 亚洲视频免费视频 | 碰碰影院 | 免费在线激情电影 | 精品一区二区视频 | 久久xx视频 | 成人av免费| 婷婷国产视频 | 日本一区二区三区免费看 | 日韩欧美国产精品 | 99精彩视频| 免费网址你懂的 | 996久久国产精品线观看 | 6080yy精品一区二区三区 | 国产精品入口麻豆 | 日韩高清在线一区二区三区 | 国产涩涩网站 | 国产精品激情 | 国产成人av电影在线 | 99久久精品久久久久久清纯 | 91av在线国产 | 日韩中文字幕亚洲一区二区va在线 | 欧美成人xxxx | 婷婷四房综合激情五月 | 中文字幕免费 | 久久av在线播放 | 日本中文字幕网 | 91女神的呻吟细腰翘臀美女 | 久久99国产综合精品免费 | 日韩手机在线观看 | 亚洲国产一区二区精品专区 | 99999精品 | 成人在线免费观看网站 | 亚洲国产日韩一区 | 四虎国产免费 | 亚洲精品午夜久久久 | 亚洲专区欧美专区 | 国产精品麻豆视频 | 你操综合 | 久久免费电影网 | 又长又大又黑又粗欧美 | 在线 视频 一区二区 | 中文字幕专区高清在线观看 | 午夜久久影院 | 亚洲精品乱码久久久久久蜜桃不爽 | 特级黄录像视频 | 最近日本字幕mv免费观看在线 | 婷婷色六月天 | 国产一区二区三区免费观看视频 | 日韩久久视频 | 亚洲国产视频在线 | 色天天综合久久久久综合片 | 男女拍拍免费视频 | 色爽网站 | 亚洲综合色视频 | 狠狠狠色丁香婷婷综合久久五月 | 少妇高潮流白浆在线观看 | 91精品视频播放 | 国产精品久久嫩一区二区免费 | 久久精品视频免费播放 | 国产精品久久久久一区二区三区共 | 婷婷色伊人 | 69av视频在线观看 | 一区二区三区动漫 | 麻豆久久一区二区 | 婷婷激情5月天 | 亚洲国产人午在线一二区 | 最近日韩免费视频 | 久久不射影院 | 国产精品麻 | 日本福利视频在线 | 在线成人国产 | 999热视频 | 欧美激情综合色综合啪啪五月 | 超级碰碰碰免费视频 | 亚洲国产美女精品久久久久∴ | 五月婷婷激情综合 | 亚洲免费精品一区二区 | 国产精品一区二区三区四区在线观看 | 久久这里只有精品久久 | 成人国产精品入口 | 亚洲黄色在线免费观看 | 国产一级精品在线观看 | 久久只精品99品免费久23小说 | 久久欧美精品 | 特级a老妇做爰全过程 | 免费亚洲黄色 | av在线免费在线 | 在线天堂日本 | 亚洲精品国产精品国自 | 91大神精品视频在线观看 | 亚洲伊人婷婷 | 亚洲国产999 | 欧美日韩在线观看一区二区 | 深爱婷婷网 | 在线观看av中文字幕 | av三级在线看 | 婷婷丁香色综合狠狠色 | 五月婷网站 | 国产黄a三级三级三级三级三级 | 欧美aa级 | 国内精品小视频 | 偷拍精品一区二区三区 | 久久精品成人欧美大片古装 | 五月婷婷综合在线观看 | 999电影免费在线观看 | 日韩久久视频 | 黄色福利网站 | 日韩精品一区二区三区三炮视频 | 婷婷www | 一区二区在线影院 | 国产黄色精品网站 | 日韩久久久| 国产一区二区三区午夜 | 国产香蕉久久精品综合网 | 中文在线免费观看 | 国产精品一区二区三区观看 | 91av观看 | 奇米影视999 | 亚洲欧洲在线视频 | 欧美日韩视频在线观看免费 | 狠狠狠干 | 在线观看黄网站 | 欧美日韩国产在线观看 | 一区二区三区免费播放 | 日韩欧美一区二区三区在线观看 | 日韩综合在线观看 | 国产精品五月天 | 亚州免费视频 | 日韩在线三区 | 天天干天天操天天入 | 欧美日韩视频在线 | 国产成人在线综合 | 久久日本视频 | 国产在线不卡视频 | 91亚洲综合 | 久久精品视频在线观看免费 | 精品国产乱码久久久久久久 | 日韩在线视频线视频免费网站 | 91麻豆精品国产91 | 久久公开视频 | 高清不卡毛片 | 日韩精品在线观看视频 | 激情偷乱人伦小说视频在线观看 | 日韩在线色视频 | 在线黄av | 国产高清不卡一区二区三区 | 久草在线手机视频 | 探花视频在线观看+在线播放 | 国产麻豆精品久久 | 超碰激情在线 | 人人澡超碰碰97碰碰碰软件 | 很黄很色很污的网站 | 亚州中文av | 99精品国产一区二区三区麻豆 | 亚洲国产午夜 | 成人在线播放网站 | 国产高清亚洲 | 97超视频在线观看 | 欧美日韩国产三级 | 97在线观看免费高清完整版在线观看 | 精品免费| 中文字幕免 | 日韩久久精品一区 | 色网址99| 亚洲精品自在在线观看 | 97精品国产aⅴ | 欧美精品久久人人躁人人爽 | 黄色一级大片免费看 | 97超碰人人网 | 色中色资源站 | 婷婷亚洲五月色综合 | 国产一区二区三区免费视频 | 中文字幕av免费在线观看 | 91cn国产在线 | 国产精品自在线拍国产 | 国产黄色成人 | 久久亚洲视频 | 高潮毛片无遮挡高清免费 | 精品1区2区3区| 欧美日韩国产三级 | 色综合色综合久久综合频道88 | 久久久久免费精品国产 | 亚洲综合涩 | 色婷婷国产 | 亚洲精品乱码久久久一二三 | 丁香六月在线观看 | 中文字幕电影网 | 亚洲精品视频在线播放 | 午夜精品视频免费在线观看 | 亚洲精选视频在线 | 国产福利91精品 | 日韩欧美视频一区二区 | 深爱激情综合 | 在线观看视频国产 | 草久久久久 | 99久久久国产精品免费观看 | a亚洲视频 | 成人免费91| 久草视频在线新免费 | 91亚洲精品乱码久久久久久蜜桃 | 不卡av在线播放 | 精品久久久久久综合日本 | 麻豆91在线看 | 成人a在线 | 欧美三级高清 | 天天玩天天干天天操 | 三级黄免费看 | 国产美女视频免费观看的网站 | 亚洲成人国产 | 国产在线精品视频 | 在线观看一区二区精品 | 在线观看日本韩国电影 | 高清精品视频 | 日韩中文字幕91 | www91在线 | 久久久久久久久网站 | 国产视频每日更新 | 成人av影院在线观看 | a级国产乱理论片在线观看 特级毛片在线观看 | 久久亚洲美女 | 亚洲日b视频 | 午夜 免费 | 免费在线一区二区三区 | 久久精品日韩 | 亚洲最新在线视频 | 免费在线一区二区 | 国产精品永久在线 | 一区中文字幕电影 | 超级碰视频 | 天天干天天色2020 | 18久久久久 | 国产成人专区 | 日韩免费三级 | 日韩电影中文,亚洲精品乱码 | 午夜精品一二三区 | 国产在线专区 | 欧洲视频一区 | 久久久综合香蕉尹人综合网 | 国内外成人免费在线视频 | 天天爽天天爽天天爽 | 91高清完整版在线观看 | 人人草在线视频 | 精品久久久久亚洲 | 亚洲国产精品视频在线观看 | 91禁看片| 精品亚洲成a人在线观看 | 精品国产免费av | 国产69久久精品成人看 | 久一在线 | 欧美亚洲成人免费 | 波多野结衣在线视频免费观看 | 天天夜夜亚洲 | 亚洲一区二区视频在线播放 | 色av资源网 | 亚洲精品国产精品99久久 | 亚洲精品久 | 成年人免费观看国产 | 999电影免费在线观看 | 久久久私人影院 | 国产99久久 | 日韩在线电影一区二区 | 亚洲一区精品人人爽人人躁 | 色综合久久88色综合天天6 | www色| 中文字幕有码在线播放 | 午夜视频播放 | 日本99久久 | 亚洲精品男人天堂 | 91资源在线播放 | av免费黄色 | 久久全国免费视频 | 欧美一区二区日韩一区二区 | 日韩中文字幕免费电影 | 色亚洲网| 亚洲影院色 | 91自拍91| 中日韩欧美精彩视频 | 日本精品视频在线观看 | 国产精品久久久久久妇 | 色丁香综合 | 91香蕉视频黄色 | 久久久久国 | 一级α片 | 99国产精品久久久久久久久久 | 欧洲亚洲女同hd | 免费a级毛片在线看 | 一色av | 456免费视频 | 国产伦精品一区二区三区照片91 | 97国产情侣爱久久免费观看 | 超碰公开在线观看 | 国产精成人品免费观看 | 五月天狠狠操 | 亚洲激情在线观看 | 91在线小视频 | 91av影视| 天天天天色综合 | 久草免费色站 | 国产又粗又硬又长又爽的视频 | 久久久精品国产免费观看一区二区 | 天天插日日射 | 色婷婷国产精品一区在线观看 | 女人18片毛片90分钟 | 国内精品视频在线 | 欧美日韩精品区 | 精品美女视频 | 91av短视频 | 色视频在线看 | 一区三区视频 | 日韩精品视频一二三 | 911免费视频 | 久久黄色网址 | 亚洲免费不卡 | 国产黄色精品 | 91精品国产自产在线观看 | 国产精品视频免费在线观看 | 欧美一级激情 | 国产高清在线视频 | 亚洲视频第一页 | 欧美成人区| 国产精品毛片一区视频播 | 日韩欧美综合 | 国内精品久久久 | 麻豆视频观看 | 中文字幕一区二区三 | 亚洲一区二区精品在线 | 成人h动漫在线看 | 欧美激情视频一二三区 | 亚洲综合网站在线观看 | 六月丁香婷婷网 | 啪啪免费观看网站 | 精品久久国产一区 | 欧美另类巨大 | 六月丁香婷婷久久 | 草久在线观看视频 | 日日干天天干 | av天天干 | 欧美午夜久久久 | 久久av网| 天堂网av 在线 | 毛片888 | 波多野结衣视频一区 | 成人av在线电影 | 99精品国产视频 | av在线播放网址 | 国产精品福利视频 | 成人在线视频你懂的 | 成人a级免费视频 | 韩国av不卡 | 欧美性天天 | 偷拍精品一区二区三区 | 狠狠色丁香 | 在线播放 一区 | 久久爱导航 | 婷婷久久亚洲 | 99久久国产免费,99久久国产免费大片 | 亚洲一区视频免费观看 | 99色视频 | 婷婷精品视频 | 国产明星视频三级a三级点| 超碰九九| 亚洲男男gaygay无套 | 亚洲国产欧美在线看片xxoo | 91色国产| 久久久精品久久日韩一区综合 | 亚洲91中文字幕无线码三区 | 免费a v网站 | 天天插天天操天天干 | 91视频免费播放 | 欧美日韩aaaa | 色网站在线免费观看 | 婷婷亚洲综合五月天小说 | 国产欧美综合视频 | 超碰成人免费电影 | 国产一区自拍视频 | 亚洲成人免费 | 蜜臀久久99精品久久久久久网站 | 日韩在线播放欧美字幕 | 中文在线中文a | 青春草免费在线视频 | 看国产黄色片 | 亚洲美女视频在线观看 | 在线免费观看的av | 国产精品日韩高清 | 亚洲国产mv | 久久天天躁狠狠躁夜夜不卡公司 | 日韩精品一区二区三区免费视频观看 | 亚洲永久字幕 | 日韩精选在线观看 | 四虎成人网 | 中文字幕在线视频免费播放 | 亚洲欧美偷拍另类 | 亚洲一区日韩在线 | 特级西西444www高清大视频 | 国产区久久 | 久久丁香网 | 国产精品久久久久久久久搜平片 | 亚洲一级在线观看 | 国产精品资源 | 少妇性bbb搡bbb爽爽爽欧美 | 久久综合中文字幕 | 免费福利视频网 | 久久成人精品 | 在线观看色网 | 97在线超碰 | 天天操天天操天天操天天操天天操天天操 | 国产精品免费成人 | 四虎影视成人精品国库在线观看 | 欧美成年人在线视频 | 中文字幕乱码亚洲精品一区 | 最新中文字幕在线资源 | 久久久五月天 | 日韩美一区二区三区 | 97精品国产97久久久久久久久久久久 | 友田真希x88av | av免费看av| 色就色,综合激情 | 国产免费成人 |