達內(nèi)視屏201341代碼_第1頁
達內(nèi)視屏201341代碼_第2頁
達內(nèi)視屏201341代碼_第3頁
達內(nèi)視屏201341代碼_第4頁
達內(nèi)視屏201341代碼_第5頁
已閱讀5頁,還剩152頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

C/C++教學(xué)課程Win32核心編程Points無法顯示該圖片。Windows編程基礎(chǔ)Windows消息和消息機制Windows繪圖和字體Windows控件Windows資源管理Windows文件處理Windows內(nèi)存管理Windows的進程和線程Windows編程基礎(chǔ)Windows應(yīng)用程序的類型控制臺程序ConsoleDOS程序,本身沒有窗口,通過Windows

DOS窗口執(zhí)行窗口程序擁有自己的窗口,可以與用戶交互庫程序存放代碼、數(shù)據(jù)的程序,執(zhí)行文件可以從中取出代碼執(zhí)行和獲取數(shù)據(jù)-靜態(tài)庫程序擴展名LIB,在執(zhí)行文件執(zhí)行時從中獲取代碼-動態(tài)庫程序擴展名DLL,在編譯鏈接程序時,將函數(shù)地址放入到執(zhí)行文件中Windows編程基礎(chǔ)三種應(yīng)用程序的對比-入口函數(shù)控制臺程序-main窗口程序-WinMain動態(tài)庫程序-DllMain

靜態(tài)庫程序-無入口函數(shù)-文件存在方式控制臺程序、窗口程序-EXE文件動態(tài)庫程序-DLL文件靜態(tài)庫程序-LIB文件-執(zhí)行方式控制臺程序-在DOS窗口內(nèi)執(zhí)行。窗口程序-擁有自己的窗口在自己的窗口內(nèi)執(zhí)行.動態(tài)庫程序-本身無法執(zhí)行,由可執(zhí)行程序或其他的DLL調(diào)用靜態(tài)庫程序-執(zhí)行是不存在,代碼會嵌入到可執(zhí)行文件或DLL等中。Windows開發(fā)環(huán)境Windows開發(fā)工具和庫開發(fā)工具 Visual

Studio

C++VC1.5

-

VC6.0

VC2005-VC2010(

10.0

)VC的編譯工具編譯器CL.EXE 將源代碼編譯成目標代碼鏈接器LINK.EXE 將目標代碼、庫鏈接生成最終文件資源編譯器RC.EXE 將資源編譯,最終通過鏈接器存入最終文件Windows開發(fā)環(huán)境–

Windows庫和頭文件-Windows庫kernel32.dll-提供了核心的API,例如進程、線程、內(nèi)存管理等。user32.dll

-提供了窗口、消息等APIgdi32.dll -繪圖相關(guān)的API-頭文件windows.h-所有windows頭文件的集合

windef.h-windows數(shù)據(jù)類型winbase.h-kernel32的APIwingdi.h-gdi32的APIwinuser.h-user32的APIwinnt.h-UNICODE字符集支持HelloWorld程序的相關(guān)函數(shù)int

WINAPI

WinMain(HINSTANCE

hInstance,//當(dāng)前程序的實例句柄HINSTANCE

hPrevInstance,//當(dāng)前程序前一個實例句柄LPSTR

lpCmdLine,//命令行參數(shù)字符串int

nCmdShow//窗口的顯示方式);hPrevInstance-Win32下,一般為NULLint

MessageBox(HWND

hWnd,//父窗口句柄LPCTSTR

lpText,//顯示在消息框中的文字LPCTSTR

lpCaption,

//顯示在標題欄中的文字UINT

uType//消息框中的按鈕、圖標顯示類型);//返回點擊的按鈕ID編譯、鏈接和執(zhí)行

編譯環(huán)境準備

VC98\BIN\VCVARS32.BAT編譯程序-CLCL.EXE-?顯示CL的幫助/c

只編譯不鏈接/Tc編譯C文件/Tp編譯C++文件鏈接程序-LINK LINK.EXE

xxx.obj

xxx.lib執(zhí)行編寫第一個窗口程序(HelloWorld版)編寫窗口程序的步驟:定義WinMain函數(shù)定義窗口處理函數(shù)注冊窗口類創(chuàng)建窗口顯示窗口消息循環(huán)消息處理資源的使用編寫資源的文件-.rc資源腳本文件編譯rc文件-RC.EXE將資源鏈接到程序中-LINK.EXENMAKE和MakefileNMAKEMakefile的一個解釋執(zhí)行的工具,根據(jù)

Makefile文件中的定義,編譯和鏈接程序,最終生成目標文件.Makefile定義編譯和鏈接等操作的腳本文件(把項目的處理命令寫入),一般對整個項目進行處理。Makefile的語法HELLO:依賴行cl.exe

hellownd.c/c//命令行

rc.exe

hellownd.rc//命令行l(wèi)ink.exe

hellownd.obj

hellownd.res user32.lib//命令行Makefile文件中可以有多個依賴行。執(zhí)行方式NMAKE首先找到第一個依賴行檢查依賴行的依賴項,如果發(fā)現(xiàn)依賴項,首先執(zhí)行依賴項命令行執(zhí)行完所有依賴項命令后,再執(zhí)行自己的命令行。DBCS和UNICODE編碼的區(qū)別DBCS字符編碼:A

員01

0203

0405 0607

0809

0A0B但是解析時,可能為:01

02030405060708090A0B0102

030405060708090A0BUNICODE編碼:A

員00010203

0405 0607

0809

0A0B不存在解析的問題字符集的應(yīng)用寬字節(jié)字符wchar_t

每個字符占2個字節(jié)char 每個字符占1個字節(jié)wchar_t實際是unsignedshort類型,定義時,需要增加“L”,通知編譯器按照雙字節(jié)編譯字符串,采用UNICODE編碼。需要使用支持wchar_t函數(shù)操作寬字節(jié)字符串。例如:wchar_t

*

pwszText

=

L"Hello

wchar";wprintf(

L"%s\n",

pwszText

);字符集的應(yīng)用TCHAR#ifdef

UNICODE //

r_winnttypedef

WCHAR

TCHAR,

*PTCHAR;#define

TEXT(quote)

L##quote#elsetypedef

char

TCHAR,

*PTCHAR;#define

TEXT(quote)

quote#endifUNICODE字符打印printf對UNICODE字符打印支持不完善。在Windows下使用WriteConsoleAPI打印UNICODE字符窗口程序的創(chuàng)建窗口程序的創(chuàng)建步驟:定義WinMain入口函數(shù)定義窗口處理函數(shù)WindowProc注冊窗口類

RegisterClass創(chuàng)建窗口

CreateWindow顯示窗口

ShowWindow/UpdateWindow消息循環(huán)GetMessageTranslateMessageDisptachMessage消息處理窗口的注冊窗口類窗口類包含了窗口的各種參數(shù)信息的數(shù)據(jù)結(jié)構(gòu)。每個窗口都具有窗口類,基于窗口類創(chuàng)建窗口。每個窗口類都具有一個名稱,使用前必須注冊到系統(tǒng)。窗口類的分類-系統(tǒng)窗口類系統(tǒng)已經(jīng)定義好的窗口類,所有應(yīng)用程序都可以直接使用。-應(yīng)用程序全局窗口類由用戶自己定義,當(dāng)前應(yīng)用程序所有模塊都可以使用。-應(yīng)用程序局部窗口類由用戶自己定義,當(dāng)前應(yīng)用程序中本模塊可以使用系統(tǒng)窗口類的注冊不需要注冊,直接使用窗口類即可。系統(tǒng)已經(jīng)定義好相應(yīng)名稱,例如:按鈕 -BUTTON編輯框-EDIT應(yīng)用程序全局窗口類的注冊RegisterClass/RegisterClassExATOM

RegisterClass(CONST

WNDCLASS

*lpWndClass//窗口類的數(shù)據(jù));注冊成功后,返回一個數(shù)字標識。ATOM

RegisterClassEx(CONST

WNDCLASSEX

*lpwcx

//窗口類的數(shù)據(jù));應(yīng)用程序全局窗口類的注冊hIcon;//窗口圖標句柄

hCursor;//鼠標的句柄hbrBackground;//繪制窗口背景的畫刷句柄

lpszMenuName;//窗口菜單的資源ID字符串

lpszClassName;//窗口類的名稱typedef

struct

_WNDCLASSEX

{UINT cbSize;//結(jié)構(gòu)體的大小UINT

style;

//窗口類的風(fēng)格WNDPROC lpfnWndProc;//窗口處理函數(shù)int cbClsExtra;//窗口類的附加數(shù)據(jù)int cbWndExtra;//窗口的附加數(shù)據(jù)HINSTANCE hInstance;//當(dāng)前模塊的實例句柄HICONHCURSORHBRUSHLPCTSTRLPCTSTRHICON hIconSm;//窗口的小圖標句柄}

WNDCLASSEX,

*PWNDCLASSEX;應(yīng)用程序全局窗口類的注冊應(yīng)用程序全局窗口類的注冊,需要在窗口類的風(fēng)格中增加CS_GLOBALCLASS,例如:WNDCLASSEX

wce

=

{0};wce.style

=CS_GLOBALCLASS;應(yīng)用程序局部窗口類在注冊窗口類時,不添加

CS_GLOBALCLASS風(fēng)格。窗口類的風(fēng)格CS_GLOBALCLASS-應(yīng)用程序全局窗口類

CS_BYTEALIGNCLIENT-窗口客戶區(qū)的水平位置8倍數(shù)對齊

CS_BYTEALIGNWINDOW-窗口的水平位置8倍數(shù)對齊

CS_HREDRAW-當(dāng)窗口水平變化時,窗口重新繪制

CS_VREDRAW-當(dāng)窗口垂直變化時,窗口重新繪制

CS_CLASSDC-該類型的窗口,都是有同一個繪圖(DC)設(shè)備

CS_PARENTDC-該類型的窗口,使用它的父窗口的繪圖(DC)設(shè)備

CS_OWNDC-該類型的窗口,每個窗口都使用自己的繪圖(DC)設(shè)備CS_SAVEBITS-允許窗口保存成圖(位圖),提高窗口的繪圖效率,但是耗費內(nèi)存資源CS_DBLCLKS-允許窗口接收鼠標左鍵雙擊

CS_NOCLOSE-窗口沒有關(guān)閉按鈕窗口類的查找過程系統(tǒng)根據(jù)傳入的窗口類名稱,在應(yīng)用程序局部窗口 類中查找,如果找到執(zhí)行2,如果未找到執(zhí)行3。比較局部窗口類與創(chuàng)建窗口時傳入的HINSTANCE變量。如果發(fā)現(xiàn)相等,創(chuàng)建和注冊的窗口類在同一模塊,創(chuàng)建窗口返回。如果不相等,繼續(xù)執(zhí)行3。在應(yīng)用程序全局窗口類,如果找到,執(zhí)行4,如果 未找到執(zhí)行5。使用找到的窗口類的信息,創(chuàng)建窗口返回。在系統(tǒng)窗口類中查找,如果找到創(chuàng)建窗口返回,否 則創(chuàng)建窗口失敗。相關(guān)APIRegisterClass/RegisterClassEx注冊GetClassInfo獲取信息UnregisterClass卸載窗口的創(chuàng)建CreateWindow/CreateWindowExHWND

CreateWindowEx(DWORD

dwExStyle,//窗口的擴展風(fēng)格LPCTSTR

lpClassName,

//已經(jīng)注冊的窗口類名稱LPCTSTR

lpWindowName,//窗口標題欄的名字DWORD

dwStyle,//窗口的基本風(fēng)格int

x,//窗口左上角水平坐標位置int

y,//窗口左上角垂直坐標位置int

nWidth,//窗口的寬度int

nHeight,//窗口的高度HWND

hWndParent,//窗口的父窗口句柄HMENU

hMenu,//窗口菜單句柄HINSTANCE

hInstance,//應(yīng)用程序?qū)嵗浔鶯PVOID

lpParam//窗口創(chuàng)建時附加參數(shù));創(chuàng)建成功返回窗口句柄子窗口的創(chuàng)建創(chuàng)建時要設(shè)置父窗口句柄創(chuàng)建風(fēng)格要增加WS_CHILD|WS_VISIBLE窗口類和窗口的附加數(shù)據(jù)作用注冊窗口時,可以設(shè)置這兩個數(shù)據(jù)內(nèi)存空間的大小。int

cbClsExtra;//窗口類的附加數(shù)據(jù)大小intcbWndExtra;//窗口的附加數(shù)據(jù)大小可以提供窗口類和窗口存放自己的數(shù)據(jù)的空間。Windows消息機制程序執(zhí)行機制過程驅(qū)動-程序的執(zhí)行過程是按照預(yù)定好的順序執(zhí)行。事件驅(qū)動-程序的執(zhí)行是無序,用戶可以根據(jù)需要隨機觸發(fā)相應(yīng)的事件。Win32窗口程序就是采用事件驅(qū)動方式執(zhí)行,也就是消息機制。什么是消息?當(dāng)系統(tǒng)通知窗口工作時,就采用消息的方式派發(fā)給窗口。消息組成:窗口句柄消息ID消息的兩個參數(shù)消息產(chǎn)生的時間消息產(chǎn)生時的鼠標位置窗口處理函數(shù)和消息每個窗口都必須具有窗口處理函數(shù)。LRESULT

CALLBACK

WindowProc(HWND

hwnd,//窗口句柄UINT

uMsg,

//消息IDWPARAM

wParam,

//消息參數(shù)LPARAM

lParam //消息參數(shù));當(dāng)系統(tǒng)通知窗口時,會調(diào)用窗口處理函數(shù)同時,將消息ID和消息參數(shù)傳遞給窗口處理函數(shù)。在窗口處理函數(shù)中,不處理的消息,使用缺省窗口處理函數(shù),例如DefWindowProc。消息相關(guān)函數(shù)1

GetMessage-獲取消息。BOOL

GetMessage(LPMSG

lpMsg,//存放獲取到的消息BUFFHWND

hWnd,//窗口句柄UINT

wMsgFilterMin,//獲取消息的最小IDUINT

wMsgFilterMax

//獲取消息的最大ID);lpMsg-當(dāng)獲取到消息后,將消息的參數(shù)存放到MSG結(jié)構(gòu)中。

hWnd-獲取到hWnd所指定窗口的消息。

wMsgFilterMin和wMsgFilterMax-只能獲取到由它們指定的消息范圍內(nèi)的消息,如果都為0,表示沒有范圍。消息相關(guān)函數(shù)2

TranslateMessage-翻譯消息。將按鍵消息,翻譯成字符消息。BOOL

TranslateMessage(CONST

MSG

*lpMsg//要翻譯的消息地址);檢查消息是否是按鍵的消息,如果不是按鍵消息,不做任何處理,繼續(xù)執(zhí)行。3

DispatchMessage-派發(fā)消息。將消息派發(fā)到該消息所屬窗口的窗口處理函數(shù)上。LRESULT

DispatchMessage(CONST

MSG

*lpmsg//要派發(fā)的消息);Windows常用消息WM_DESTROY-窗口被銷毀時的消息,無消息參數(shù)。常用于在窗口被銷毀之前,做相應(yīng)的善后處理,例

如資源、內(nèi)存等。WM_SYSCOMMAND-系統(tǒng)命令消息,當(dāng)點擊窗口

的最大化、最小化、關(guān)閉等命令時,收到這個消息。常用在窗口關(guān)閉時,提示用戶處理。wParam-具體命令,例如關(guān)閉SC_CLOSE等.

lParam-鼠標位置LOWORD低字-水平位置

HIWORD高字-垂直位置Windows常用消息WM_CREATE-在窗口創(chuàng)建成功還未顯示之前,收到這個消息。常用于初始化窗口的參數(shù)、資源等等,包括創(chuàng)建子窗口等。WPARAM-不使用LPARAM-是CREATESTRUCT結(jié)構(gòu)的指針,保存了

CreatWindowEx中的12個參數(shù)。WM_SIZE-在窗口的大小發(fā)生變化后,會收到WM_SIZE。常用于窗口大小變化后,調(diào)整窗口內(nèi)各個部分的布局。

WPARAM-窗口大小變化的原因。LPARAM-變化窗口客戶區(qū)的大小

LOWORD-變化后的寬度

HIOWORD-變化后的高度Windows常用消息WM_QUIT-用于結(jié)束消息循環(huán)處理。

wParam-PostQuitMessage函數(shù)傳遞的參數(shù)。

lParam-不使用當(dāng)GetMessage收到這個消息后,會返回FALSE,結(jié)束while處理,退出消息循環(huán)。WM_PAINT-繪圖消息鍵盤消息鼠標消息

定時器消息消息的獲取GetMessage-從系統(tǒng)獲取消息,將消息從系統(tǒng)中移除,阻塞函數(shù)。當(dāng)系統(tǒng)無消息時,GetMessage會等候下一條消息。PeekMessage-以查看的方式從系統(tǒng)獲取消息,可以不將消息從系統(tǒng)移除,非阻塞函數(shù)。當(dāng)系統(tǒng)無消息時,返回FALSE,繼續(xù)執(zhí)行后續(xù)代碼。BOOL

PeekMessage(LPMSG

lpMsg,

//message

informationHWND

hWnd,

//handle

to

windowUINTwMsgFilterMin,

//first

message

UINTwMsgFilterMax,

//lastmessage

UINT

wRemoveMsg//移除標識);消息的發(fā)送SendMessage-發(fā)送消息,會等候消息處理的結(jié)果。PostMessage-投遞消息,消息發(fā)出后立刻返回,不等候消息執(zhí)行結(jié)果。BOOL

SendMessage/PostMessage(HWND

hWnd,//消息發(fā)送的目的窗口

UINT

Msg,//消息IDWPARAMwParam,

//消息參數(shù)LPARAM

lParam //消息參數(shù));消息的分類1系統(tǒng)消息-ID范圍0-0x03FF由系統(tǒng)定義好的消息,可以在程序中直接使用。

2用戶自定義消息-ID范圍0x0400-0x7FFF由用戶自己定義,滿足用戶自己的需求。由用戶自己發(fā)出消息,并響應(yīng)處理。自定義消息宏:WM_USER3應(yīng)用程序消息-ID范圍0x8000-0xBFFF程序之間通訊時使用的消息。應(yīng)用程序消息宏:WM_APP4系統(tǒng)注冊消息-ID范圍0xC000-0xFFFF在系統(tǒng)注冊并生成相應(yīng)消息,然后可以在各個程序中使用這個消息。消息隊列消息隊列用于存放消息的一個隊列,消息在隊列中先入先出。所有窗口程序都具有消息隊列。程序可以從隊列中獲取消息。消息隊列的類型系統(tǒng)消息隊列-由系統(tǒng)維護的消息隊列。存放系統(tǒng)產(chǎn)生的消息,例如鼠標、鍵盤等。程序消息隊列-屬于每一個應(yīng)用程序(線程)的消息隊列。由應(yīng)用程序(線程)維護。消息隊列的關(guān)系當(dāng)鼠標、鍵盤產(chǎn)生消息時,會將消息存放到系統(tǒng)消息隊列系統(tǒng)會根據(jù)存放的消息,找到對應(yīng)窗口的消息隊列。將消息投遞到程序的消息隊列中。消息和消息隊列根據(jù)消息和消息隊列之間使用關(guān)系,將消息分成兩類:隊列消息-消息的發(fā)送和獲取,都是通過消息隊列完成。非隊列消息-消息的發(fā)送和獲取,是直接調(diào)用消息的窗口處理完成。隊列消息-消息發(fā)送后,首先放入隊列,然后通過消息循環(huán),從隊列當(dāng)中獲取。GetMessage-從消息隊列中獲取消息

PostMessage-將消息投遞到消息隊列常見隊列消息:WM_PAINT、鍵盤、鼠標、定時器。非隊列消息-消息發(fā)送時,首先查找消息接收窗口的窗口處理函數(shù),直接調(diào)用處理函數(shù),完成消息。SendMessage-直接將消息發(fā)送給窗口的處理函數(shù),并等候處理結(jié)果。常見消息:WM_CREATE、WM_SIZE等。消息的獲取消息循環(huán)GetMessage/PeekMessage從程序的消息隊列當(dāng)中,獲取到消息。TranslateMessage檢查獲取到的消息,如果發(fā)現(xiàn)是按鍵消息,產(chǎn)生一個字符消息,并放入程序的消息隊列。DispatchMessage根據(jù)消息,找到窗口處理函數(shù),調(diào)用窗口處理函數(shù),完成消息的處理。GetMessage/PeekMessage次序在程序(線程)消息隊列查找消息,如果隊列有消息,檢查消 息是否滿足指定條件(HWND,ID范圍),不滿足條件就不會取出 消息,否則從隊列取出消息返回。如果程序(線程)消息隊列沒有消息,向系統(tǒng)消息隊列獲取屬 于本程序的消息。如果系統(tǒng)隊列的當(dāng)前消息屬于本程序,系統(tǒng) 會將消息轉(zhuǎn)發(fā)到程如果系統(tǒng)消息隊列也沒有消息,檢查當(dāng)前窗口的需要重新繪制的 區(qū)域,如果發(fā)現(xiàn)有需要繪制的區(qū)域,產(chǎn)生WM_PAINT消息,取 得消息返回處理。如果沒有重新繪制區(qū)域,檢查定時器如果有到時的定時器,產(chǎn) 生WM_TIMER,返回處理執(zhí)行。如果沒有到時的定時器,整理程序的資源、內(nèi)存等等。GetMessage會繼續(xù)等候下一條消息。PeekMessage會返回

FALSE,交出程序的控制權(quán)。注意:GetMessage如果獲取到是WM_QUIT,函數(shù)會返回FALSE。消息的發(fā)送SendMessage發(fā)送消息到指定的窗口,并等候?qū)Ψ綄⑾⑻幚?,然后消息?zhí)行結(jié)果,用于非隊列消息的發(fā)送。PostMessage將消息放到消息隊列中,立刻返回,用于隊列消息的發(fā)送。無法獲知消息是否被對方處理。繪圖消息-WM_PAINTWM_PAINT當(dāng)窗口需要繪制的時候,會發(fā)送窗口處理函數(shù)。窗口無效區(qū)域被聲明成需要重新繪制的區(qū)域。

BOOLInvalidateRect(HWNDhWnd,

//窗口句柄CONST

RECT*

lpRect,

//區(qū)域的矩形坐標BOOLbErase

//重繪前是否先擦除);在程序中,如果需要繪制窗口,調(diào)用函數(shù)聲明窗口無效區(qū)域。繪圖消息-WM_PAINTWM_PAINT參數(shù)

WPARAM-不使用

LPARAM-不使用消息處理步驟開始繪圖處理

HDC

BeginPaint(HWND

hwnd,//繪圖窗口LPPAINTSTRUCT

lpPaint//繪圖參數(shù)的BUFF);返回繪圖設(shè)備句柄HDC繪圖結(jié)束繪圖處理

BOOL

EndPaint(HWND

hWnd,//繪圖窗口CONST

PAINTSTRUCT

*lpPaint

//繪圖參數(shù)的指針BeginPaint返回);鍵盤消息1鍵盤消息WM_KEYDOWN-按鍵被按下時產(chǎn)生

WM_KEYUP-按鍵被放開時產(chǎn)生WM_SYSKEYDOWN

-

系統(tǒng)鍵按下時產(chǎn)生 比如ALT、F10WM_SYSKEYUP

-

系統(tǒng)鍵放開時產(chǎn)生WM_CHAR-字符消息2消息參數(shù)按鍵消息:WPARAM-按鍵的Virtual

KeyLPARAM-按鍵的參數(shù),例如按下次數(shù)WM_CHAR消息:

WPARAM-輸入的字符LPARAM-按鍵的相關(guān)參數(shù)鍵盤消息消息的使用

KEYDOWN可以重復(fù)出現(xiàn),KEYUP只能在按鍵松開時出現(xiàn)1次

TranslateMessage在轉(zhuǎn)換WM_KEYDOWN消息時,對于可見字符可以產(chǎn)生WM_CHAR,不可見字符無此消息。

WM_KEYDOWN/UP的wParam是表示的按鍵,

WM_CHAR是表示輸入的字符。鼠標消息鼠標消息基本鼠標消息WM_LBUTTONDOWN-鼠標左鍵按下

WM_LBUTTONUP-鼠標左鍵抬起

WM_RBUTTONDOWN-鼠標右鍵按下

WM_RBUTTONUP-鼠標右鍵抬起

WM_MOUSEMOVE-鼠標移動消息雙擊消息WM_LBUTTONDBLCLK-鼠標左鍵雙擊

WM_RBUTTONDBLCLK-鼠標右鍵雙擊滾輪消息WM_MOUSEWHEEL-鼠標滾輪消息鼠標消息基本鼠標消息消息參數(shù)WPARAM-其他按鍵的狀態(tài),例如Ctrl/Shift等LPARAM-鼠標的位置,窗口客戶區(qū)坐標系。LOWORD

X坐標位置

HIWORD

Y坐標位置鼠標消息使用一般情況鼠標按下/抬起成對出現(xiàn)。在鼠標移動過程中,會根據(jù)移動速度產(chǎn)生一系列的

WM_MOUSEMOVE消息。鼠標消息雙擊鼠標消息消息參數(shù)WPARAM-其他按鍵的狀態(tài),例如Ctrl/Shift等LPARAM-鼠標的位置,窗口客戶區(qū)坐標系。LOWORD

X坐標位置

HIWORD

Y坐標位置使用時需要在注冊窗口類的時候添加CS_DBLCLKS風(fēng)格。消息產(chǎn)生順序以WM_LBUTTONDBLCLK為例:WM_LBUTTONDOWNWM_LBUTTONUPWM_LBUTTONDBLCLKWM_LBUTTONUP鼠標消息鼠標滾輪WM_MOUSEWHEEL消息參數(shù)

WPARAM:LOWORD-其他按鍵的狀態(tài)HIWORD-滾輪的偏移量,是120的倍數(shù),通過正負值表示表示滾動方向。正:向前滾動負:向后滾動LPARAM:鼠標當(dāng)前的位置,屏幕坐標系

LOWORD-X坐標HIWORD-Y坐標使用通過偏移量,獲取滾動的方向和倍數(shù)。定時器消息1定時器消息可以在程序中設(shè)置定時器,當(dāng)?shù)竭_時間間隔時,定時器會向程序發(fā)送一個

WM_TIMER消息。定時器的精度是毫秒,但是準確度很低。例如設(shè)置時間間隔為1000ms,但是會在非1000毫秒到達。2消息的參數(shù)WPARAM-定時器IDLPARAM-定時器處理函數(shù)的指針定時器消息3定時器使用創(chuàng)建定時器

UINT_PTR

SetTimer(HWND

hWnd,//定時器窗口句柄

UINT

nIDEvent,//定時器IDUINT

uElapse,//時間間隔TIMERPROC

lpTimerFunc//定時器處理函數(shù)指針);創(chuàng)建成功,返回非0。使用窗口處理函數(shù),做為定時器處理函數(shù),lpTimerFunc為NULL使用定時器處理函數(shù)處理定時器消息。消息處理

WM_TIMER關(guān)閉定時器

BOOL

KillTimer(HWND

hWnd,//定時器窗口句柄

UINT

uIDEvent//定時器ID);附:GetClientRect獲取窗口客戶區(qū)大小菜單的使用菜單的分類窗口的頂層菜單彈出式菜單系統(tǒng)菜單HMENU類型表示菜單,菜單每一項有相應(yīng)的ID。菜單的使用窗口的頂層菜單創(chuàng)建菜單HMENU

CreateMenu(VOID);//創(chuàng)建成功返回菜單句柄增加菜單項BOOL

AppendMenu(HMENU

hMenu,//菜單句柄

UINT

uFlags,//菜單項風(fēng)格UINT_PTR

uIDNewItem,//菜單項IDLPCTSTR

lpNewItem//菜單項的名稱);設(shè)置到窗口

BOOL

SetMenu(HWNDhWnd,

//窗口句柄

HMENU

hMenu//菜單句柄);菜單的使用彈出式菜單Popup菜單的創(chuàng)建HMENUCreatePopupMenu(VOID);//創(chuàng)建成功返回菜單句柄加入頂層菜單BOOL

AppendMenu(HMENU

hMenu,//菜單句柄UINT

uFlags,//菜單項增加選項,MF_POPUPUINT_PTR

uIDNewItem,//彈出式菜單的句柄

LPCTSTR

lpNewItem//菜單項的名稱);菜單的使用菜單命令處理

WM_COMMAND消息

WPARAM:HIWORD-對于菜單為0LOWORD-菜單項的IDLPARAM-對于菜單為NULL命令處理過程獲取WPARAM菜單ID,根據(jù)ID處理。菜單的使用菜單項的狀態(tài)在增加菜單項可以設(shè)置菜單項的狀態(tài)。可以使用菜單API

修改狀態(tài)CheckMenuItemEnableMenuItem函數(shù)使用時,需要通過設(shè)置MF_BYPOSITION或者

MF_BYCOMMAND,確定使用菜單索引或者菜單ID。WM_INITMENUPOPUP在菜單被激活但是未顯示,窗口會收到這個消息

WPARAM-菜單句柄LPARAM-LOWORD是菜單索引HIWORD是窗口菜單標識系統(tǒng)菜單的使用系統(tǒng)菜單的獲取HMENU

GetSystemMenu(HWND

hWnd,//窗口句柄

BOOL

bRevert//重置選項);返回獲取到的系統(tǒng)菜單句柄bRevert:TRUE-刪除舊菜單,恢復(fù)到默認的系統(tǒng)菜單

FALSE-返回當(dāng)前的系統(tǒng)菜單句柄。系統(tǒng)菜單的修改AppendMenuDeleteMenu系統(tǒng)菜單命令響應(yīng)通過WM_SYSCOMMAND響應(yīng)菜單命令。

WPARAM的LOWORD是命令I(lǐng)D右鍵菜單ContextMenu的使用1創(chuàng)建菜單右鍵菜單是一個彈出式菜單,使用CreatePopupMenu創(chuàng)建。2顯示菜單BOOL

TrackPopupMenu(HMENU

hMenu,//菜單句柄

UINT

uFlags,//顯示方式int

x,//水平位置,屏幕坐標系

int

y,//垂直位置,屏幕坐標系int

nReserved,//保留,必須0HWND

hWnd,//處理菜單消息的窗口句柄

CONST

RECT

*prcRect

//NULL,忽略);TrackPopupMenu是阻塞函數(shù)右鍵菜單ContextMenu的使用3命令處理WM_COMMAND,與窗口菜單一致如果Track設(shè)置了TPM_RETURNCMD選項,那么點擊的菜單項ID通過函數(shù)的返回值獲取。4菜單項的狀態(tài)WM_INITMENUPOPUP,按照彈出菜單處理右鍵菜單ContextMenu的使用菜單處理位置鼠標右鍵抬起WM_RBUTTONUP鼠標右鍵消息窗口坐標系坐標,要使用需要轉(zhuǎn)換成屏幕坐標系ClientToScreenScreenToClientWM_CONTEXTMENUWParam-右鍵點擊的窗口句柄LPARAM-LOWORD

X坐標,屏幕坐標系

HIWORD

Y坐標,屏幕坐標系WM_CONTEXTMENU消息是在WM_RBUTTONUP消息之后產(chǎn)生。資源的使用資源相關(guān)資源腳本文件:*.rc文件編譯器:RC.EXE菜單資源的使用添加菜單資源加載菜單資源在注冊時設(shè)置菜單資源加載菜單資源,設(shè)置到窗口

HMENU

LoadMenu(HINSTANCE

hInstance, //

handle

to

moduleLPCTSTR

lpMenuName //

menu

name

or

resourceidentifier);CreateWindow/ExSetMenu資源的使用圖標資源ICON的使用1添加資源注意圖標的大小,一個圖標文件中,可以有多個不同大小的圖標。

2加載HICON

LoadIcon(HINSTANCE

hInstance,

//

handle

to

applicationinstanceLPCTSTR

lpIconName //

namestring

orresourceidentifier);成功返回HICON句柄

3設(shè)置注冊窗口類WM_SETICON消息4繪制DrawIcon資源的使用光標資源的使用添加光標的資源光標的大小默認是32X32像素,每個光標有HotSpot,是當(dāng)前鼠標的熱點使用資源HCURSOR

LoadCursor(HINSTANCE

hInstance, //

handletoapplicationinstanceLPCTSTR

lpCursorName //

name

or

resource

identifier); hInstance-可以為NULL,獲取系統(tǒng)默認的Cursor在注冊窗口時,設(shè)置光標使用SetCursor設(shè)置光標

HCURSOR

SetCursor(HCURSOR

hCursor //

handletocursor);資源的使用光標資源的使用3

WM_SETCURSOR消息參數(shù)WPARAM-當(dāng)前使用的光標句柄LPARAM-LOWORD當(dāng)前區(qū)域的代碼(Hit-Test

code)

HIWORD-當(dāng)前鼠標消息ID字符串資源1添加字符串資源添加字符串表,在表中增加字符串

2字符串資源的使用int

LoadString(HINSTANCE

hInstance,

//handle

to

resourcemoduleUINT

uID,//字符串IDLPTSTR

lpBuffer,//存放字符串BUFFint

nBufferMax//字符串BUFF長度);成功返回字符串長度,失敗0資源的使用加速鍵資源的使用添加 資源添加加速鍵表,增加命令I(lǐng)D對應(yīng)的加速鍵。使用加載加速鍵HACCEL

LoadAccelerators(HINSTANCE

hInstance, //

handle

to

moduleLPCTSTR

lpTableName //

accelerator

table

name);返回加速鍵句柄處理加速鍵消息int

TranslateAccelerator(HWND

hWnd,//處理消息的窗口句柄HACCEL

hAccTable, //加速鍵句柄LPMSG

lpMsg

//消息);如果是加速鍵,返回非零。在WM_COMMAND中相應(yīng)消息,消息參數(shù)WPARAM

-

HIWORD

為1,表示加速鍵為0,表示菜單LWORD 為命令I(lǐng)D資源的使用加速鍵資源的使用TranslateAccelerator處理過程檢測消息是否是

WM_KEYDOWN\WM_SYSKEYDOW,獲取按鍵狀態(tài)根據(jù)按鍵狀態(tài),從HACCEL中查找對應(yīng)命令I(lǐng)D找到對應(yīng)ID,發(fā)送WM_COMMAND消息,處理

ID所對應(yīng)的命令。Windows繪圖1繪圖相關(guān)繪圖設(shè)備DC(DeviceContext),HDC-DC句柄,表示繪圖設(shè)備GDI-Windows

graphics

device

interfaceWin32提供的繪圖API2顏色顏色的表示電腦使用紅、綠、藍,

R-0~255G-0~255B

-

0~255每一個點顏色是3個字節(jié)24位保存0-2^2416位:5,5,632位:8,8,8,8繪圖或透明度Windows繪圖顏色的使用COLORREF-實際DWORD,例如:

COLORREF

nColor=0;賦值使用RGB宏,例如:

nColor=RGB(255,0,0);獲取RGB值,

GetRValue/GetGValue/GetBValue例如:BYTE

nRed

=

GetRValue(

nColor);Windows繪圖點的使用GetPixel獲取指定點的顏色

COLORREF

GetPixel(HDC

hdc, //

handletoDCint

nXPos, //

x-coordinate

of

pixelintnYPos

//

y-coordinate

of

pixel);SetPixel設(shè)置指定點的顏色

COLORREF

SetPixel(HDC

hdc,//DC句柄

int

X,//X坐標int

Y,//Y坐標COLORREF

crColor//設(shè)置的顏色);返回點原來的顏色Windows繪圖線的使用(直線、圓形、弧線)MoveTo-移動當(dāng)前點到指定點LineTo-從當(dāng)前點到指定點繪制一條直線當(dāng)前點:上一次繪圖時的最后一點,初始為(0,0)點。封閉圖形

Rectangle EllipseGDI繪圖對象-畫筆畫筆的作用線的顏色、線型、線粗。

HPEN-畫筆句柄畫筆的使用1創(chuàng)建畫筆HPEN

CreatePen(int

fnPenStyle,//畫筆的樣式

int

nWidth,//畫筆的粗細COLORREF

crColor//畫筆的顏色);創(chuàng)建成功返回句柄PS_SOILD-實心線,可以支持多個像素寬其他線型只能是一個像素寬。GDI繪圖對象-畫筆將畫筆應(yīng)用到DC中HGDIOBJ

SelectObject(HDC

hdc,//繪圖設(shè)備句柄HGDIOBJ

hgdiobj

//GDI繪圖對象句柄,畫筆句柄);返回原來的GDI繪圖對象句柄注意保存原來DC當(dāng)中畫筆。繪圖取出DC中的畫筆將原來的畫筆,使用SelectObject函數(shù),放入到設(shè)備DC中,就會將我們創(chuàng)建的畫筆取出。釋放畫筆BOOL

DeleteObject(HGDIOBJ

hObject

//GDI繪圖對象句柄,畫筆句柄);只能刪除不被DC使用的畫筆,所以在釋放前,必須將畫筆從DC中取出。GDI繪圖對象-畫刷畫刷相關(guān)畫刷-封閉圖形的填充的顏色、圖案

HBRUSH-畫刷句柄畫刷的使用創(chuàng)建畫刷CreateSolidBrush-創(chuàng)建實心畫刷

CreateHatchBrush-創(chuàng)建填充畫刷將畫刷應(yīng)用到DC中 SelectObject繪圖將畫刷從DC中取出

SelectObject刪除畫刷

DeleteObjectGDI繪圖對象-畫刷其他可以使用GetStockObject函數(shù)獲取系統(tǒng)維護的畫刷、畫筆等。如果不使用畫刷填充,需要使用NULL_BRUSH參數(shù),獲取不填充的畫刷。GetStockObject返回的畫刷不需要

DeleteObjectGDI繪圖對象-位圖位圖相關(guān)光柵圖形-記錄圖像中每一點的顏色等信息。矢量圖形-記錄圖像算法、繪圖指令等。HBITMAP-位圖句柄位圖的使用在資源中添加位圖資源從資源中加載位圖LoadBitmap創(chuàng)建一個與當(dāng)前DC相匹配的DCHDCCreateCompatibleDC(HDChdc

//當(dāng)前DC句柄,可以為NULL(使用屏幕DC));返回創(chuàng)建好的DC句柄將位圖放入匹配的DC中

SelectObjectGDI繪圖對象-位圖5繪制位圖BOOL

BitBlt(HDC

hdcDest,//目的DCint

nXDest,//目的左上X坐標

int

nYDest,//目的左上Y坐標

int

nWidth,//目的寬度int

nHeight,//目的高度

HDC

hdcSrc,//源DCint

nXSrc,

//

源左上X坐標int

nYSrc, //

源左上Y坐標DWORD

dwRop

//繪制方法);GDI繪圖對象-位圖縮放繪制BOOL

StretchBlt(HDC

hdcDest,

//handle

to

destination

DCint

nXOriginDest,

//

x-coord

of

destination

upper-left

cornerint

nYOriginDest,

//

y-coord

of

destination

upper-left

cornerintnWidthDest,

//

width

of

destination

rectangleint

nHeightDest,

//

heightof

destination

rectangleHDC

hdcSrc,

//

handle

to

source

DCint

nXOriginSrc,//x-coord

of

source

upper-left

cornerint

nYOriginSrc,//y-coord

of

source

upper-left

cornerintnWidthSrc,//源DC寬intnHeightSrc,//源DC高DWORD

dwRop

//

raster

operation

code);GDI繪圖對象-位圖6取出位圖SelectObject7釋放位圖DeleteObject8釋放匹配的DCDeleteDC其他使用GetObject獲取位圖信息。坐標系坐標系分類設(shè)備坐標系以像素為單位,以設(shè)備左上角為原點,X右為正,

Y下為正的坐標系。屏幕坐標系-以當(dāng)前屏幕左上角為原點坐標系。窗口坐標系-以窗口左上角為原點坐標系??蛻魠^(qū)坐標系-以窗口的客戶區(qū)左上角為原點的坐標系。邏輯坐標系在GDI繪圖中,都是使用邏輯坐標繪圖。邏輯坐標系可以設(shè)置坐標系單位。坐標系坐標系映射映射模式邏輯坐標系和設(shè)備坐標系單位之間映射關(guān)系。設(shè)備坐標系的單位是由設(shè)備決定,大小固定。邏輯坐標系的單位,可以通過程序設(shè)置,int

SetMapMode(HDC

hdc,//DC句柄int

fnMapMode//映射模式);返回舊的映射模式

fnMapMode映射模式如下:文字和字體文字的繪制TextOut-將文字繪制在指定坐標位置。

int

DrawText(HDChDC,

//DC句柄

LPCTSTR

lpString,//字符串int

nCount,LPRECT

lpRect,UINTuFormat//字符數(shù)量//繪制文字的矩形框//繪制的方式);文字和字體文字的繪制

BOOL

ExtTextOut(HDC

hdc,

//DC句柄int

X,

//輸出X位置int

Y,

//輸出Y位置UINTfuOptions,

//輸出選項CONST

RECT*

lprc,//輸出的矩形框

LPCTSTR

lpString,//字符串UINTcbCount,

//字符數(shù)量

CONST

INT*

lpDx //字符間距的數(shù)組);文字和字體文字顏色和背景 文字顏色

SetTextColor文字背景色

SetBkColor文件背景模式

SetBkMode……..字體相關(guān)Window常用的字體格式為TureType字體字體名-標識字體類型HFONT-字體句柄文字和字體字體的使用1創(chuàng)建字體HFONT

CreateFont(int

nHeight,

//字體高度int

nWidth, //字體寬度int

nEscapement,//字符串傾斜角度

int

nOrientation,//字符旋轉(zhuǎn)角度int

fnWeight,//字體的粗細DWORD

fdwItalic,//斜體DWORD

fdwUnderline,//字符下劃線

DWORD

fdwStrikeOut,//刪除線

DWORD

fdwCharSet,//字符集DWORD

fdwOutputPrecision,//輸出精度

DWORD

fdwClipPrecision,//剪切精度

DWORD

fdwQuality,//輸出質(zhì)量DWORD

fdwPitchAndFamily,//匹配字體

LPCTSTR

lpszFace//字體名稱);文字和字體應(yīng)用字體到DCSelectObject繪制文字DrawTextExtTextOut取出字體SelectObject刪除字體DeleteObject對話框窗口對話框的分類模式對話框-當(dāng)對話框顯示時,會禁止其他窗口的輸入等用戶交互操作。無模式對話框-在對話框顯示后,其他窗口同樣可以接收輸入等用戶交互操作。對話框基本使用對話框窗口處理函數(shù)注冊窗口類(可選,基本不使用)創(chuàng)建對話框?qū)υ捒虻年P(guān)閉對話框窗口模式對話框的使用1對話框窗口處理函數(shù)INT_PTR

CALLBACK

DialogProc(HWNDhwndDlg,

//窗口句柄UINTuMsg,

//消息IDWPARAM

wParam,

//消息參數(shù)LPARAM

lParam //消息參數(shù));返回TRUE-表示DialogProc函數(shù)中處理了這個消息,缺省處理函數(shù)不需要處理。返回FALSE-表示DialogProc函數(shù)未處理這個消息,交給缺省處理函數(shù)處理。不需要調(diào)用缺省對話框窗口處理函數(shù)。對話框窗口2創(chuàng)建對話框INT_PTR

DialogBox(HINSTANCE

hInstance,//應(yīng)用程序?qū)嵗浔?/p>

LPCTSTR

lpTemplate,//對話框模板資源IDHWND

hWndParent,//對話框父窗口

DLGPROC

lpDialogFunc//對話框窗口處理函數(shù));需要添加對話框資源。

DialogBox是一個阻塞函數(shù),只有當(dāng)對話框關(guān)閉后,才會返回,繼續(xù)執(zhí)行后續(xù)代碼。返回值是通過EndDialog設(shè)置。對話框窗口對話框的關(guān)閉BOOL

EndDialog(HWND

hDlg,//關(guān)閉的對話框窗口句柄

INT_PTR

nResult//關(guān)閉的返回值);關(guān)閉模式對話框,只能使用EndDialog,不能使用

DestroyWindow等函數(shù)。nResult是DialogBox函數(shù)退出時的返回值。對話框的消息WM_INITDIALOG-對話框創(chuàng)建之后顯示之前,通知對話框窗口處理函數(shù),可以完成自己的初始化相關(guān)的操作。對話框窗口無模式對話框?qū)υ捒虼翱谔幚砗瘮?shù)

DialogProc創(chuàng)建對話框HWNDCreateDialog(HINSTANCE

hInstance,

//應(yīng)用程序?qū)嵗浔鶯PCTSTRlpTemplate,

//模板資源IDHWNDhWndParent,

//父窗口DLGPROC

lpDialogFunc

//窗口處理函數(shù));非阻塞函數(shù),創(chuàng)建成功返回窗口句柄,需要使用

ShowWindow函數(shù)顯示對話框。對話框的關(guān)閉關(guān)閉時使用DestroyWindow銷毀窗口,不能使用

EndDialog關(guān)閉對話框。對話框窗口4對話框的消息WM_INITDIALOG-對話框創(chuàng)建之后顯示之前,通知對話框窗口處理函數(shù),可以完成自己的初始化相關(guān)的操作。對話框VS普通窗口1創(chuàng)建模式對話框-DialogBox,阻塞函數(shù)無模式對話框-CreateDialog普通窗口-CreateWindow/Ex2窗口處理函數(shù)對話框-DialogProc普通窗口-WindowProc,需要調(diào)用缺省窗口處理函數(shù)

3窗口消息普通窗口-WM_CREATE對話框 -

WM_INITDIALOG4窗口關(guān)閉模式對話框-EndDialog無模式對話框/普通窗口-DestroyWindow子控件子控件系統(tǒng)已經(jīng)定義窗口類型,相應(yīng)窗口的處理函數(shù)等都已經(jīng)由系統(tǒng)完成。例如編輯框、按鈕等等。子控件的創(chuàng)建不需要注冊,直接使用CreateWindow/Ex創(chuàng)建該類的窗口。子控件創(chuàng)建時,每個控件都具有一個ID號??丶南⒊绦蚝妥涌丶g交互,都是通過消息完成??丶拇翱谙?程序可以使用SendMessage向控件發(fā)送消息,獲取控件的信息或設(shè)置控件。控件的通知消息-控件有相應(yīng)的事件發(fā)生后,會向所在的父窗口發(fā)送通知消息,父窗口可以根據(jù)通知消息的ID,做相應(yīng)的處理。靜態(tài)框靜態(tài)框相關(guān)常用于顯示文字和圖標等。窗口類名稱“STATIC”。文字靜態(tài)框-顯示文字圖標靜態(tài)框-顯示圖標,設(shè)置SS_ICON/SS_BITMAP靜態(tài)框的使用1創(chuàng)建CreateWindow/

CreateWindowEx風(fēng)格圖標靜態(tài)框使用SS_ICON/SS_BITMAP風(fēng)格如果創(chuàng)建圖標靜態(tài)框,那么窗口的名稱要設(shè)置成圖標

ID例如:CreateWindowEx(

0,"STATIC","#101");靜態(tài)框窗口消息SendMessage發(fā)送到控件即可。例如:STM_SETICON通知消息需要在創(chuàng)建時增加SS_NOTIFY風(fēng)格。通知消息通過WM_COMMAND消息傳遞附:WM_COMMANDWPARAM:LOWORD-菜單項、加速鍵、控件的IDHIWORD-對于菜單項,為0對于加速鍵,為1對于控件,是Notify-CodeLPARAM:對于菜單項、加速鍵為NULL對于控件,為控件窗口句柄按鈕1按鈕相關(guān)根據(jù)按鈕的風(fēng)格,將按鈕分成4類下壓式按鈕:BS_PUSHBUTTON/BS_DEFPUSHBUTTON分組框:BS_GROUPBOX復(fù)選框:BS_CHECKBOX/BS_AUTOCHECKBOXBS_3STATE/BS_AUTO3STATE單選框:BS_RADIOBUTTON/BS_AUTORADIOBUTTON窗口類名稱BUTTON2下壓式按鈕創(chuàng)建按鈕窗口消息通知消息3分組框常用于界面上的控件分組顯示,提高界面友好性。按鈕4復(fù)選框風(fēng)格和創(chuàng)建BS_CHECKBOX-點擊選擇時,需要自己維護選擇狀態(tài)

BS_AUTOCHECKBOX-點擊選擇時,系統(tǒng)自動維護選擇狀態(tài)窗口消息獲取和設(shè)置選擇狀態(tài)

BM_SETCHECKBM_GETCHECK通知消息BN_CLICKED按鈕被點擊按鈕5單選按鈕風(fēng)格和創(chuàng)建BS_RADIOBUTTON-自己維護狀態(tài)

BS_AUTORADIOBUTTON-系統(tǒng)自動維護狀態(tài)窗口消息獲取和設(shè)置選擇狀態(tài)

BM_SETCHECKBM_GETCHECK每組單選框中只能同時有1個被選擇。通知消息BN_CLICKED其他單選框分組,可以使用WS_GROUP風(fēng)格分組。從當(dāng)前具有WS_GROUP風(fēng)格的單選框,到下一個WS_GROUP風(fēng)格單選框之前,為1組單選框編輯框1編輯框相關(guān)從風(fēng)格可以將編輯框分成幾類:單行編輯框-只能處理一行文字多行編輯框-可以顯示多行文字密碼編輯框-密碼輸入ES_PASSWORD...2編輯框的使用創(chuàng)建窗口類名稱EDIT窗口消息通知消息EN_CHANGE當(dāng)編輯框內(nèi)的文字被修改,通知父窗口。組合框1組合框相關(guān)組合框的分類簡單組合框 -CBS_SIMPLE下拉式組合框-可以輸入,CBS_DROPDOWN下拉列表式組合框-只能從選項中選擇CBS_DROPDOWNLIST組合框窗口類-COMBOBOX2組合框的使用創(chuàng)建組合框選項的添加CB_ADDSTRING-WPARAM不使用LPARAM字符串指針

CB_INSERTSTRING選項的刪除CB_DELETESTRING-刪除指定項

CB_RESETCONTENT-清除所有項組合框獲取和設(shè)置選擇項

CB_GETCURSEL-獲取選擇項

CB_SETCURSEL-設(shè)置當(dāng)前被選擇項查找選擇項CB_FINDSTRING-根據(jù)字符串,查找選擇項,從選項的起始字符查找包含字符串CB_FINDSTRINGEXACT-匹配查找的字符串

CB_SELECTSTRING-查找并設(shè)置成當(dāng)前被選擇項獲取選項的字符CB_GETLBTEXTLEN-獲取選項的字符長度

CB_GETLBTEXT-獲取選項的字符內(nèi)容輸入的字符串

WM_GETTEXT組合框2.8選項的附加數(shù)據(jù)在每個選項中,可以保存自定義的數(shù)據(jù)

CB_SETITEMDATA-將數(shù)據(jù)保存到指定選項CB_GETITEMDATA-從指定選項獲取數(shù)據(jù)

3通知消息CBN_SELCHANGE-當(dāng)前被選擇項發(fā)生變化后,通知父窗口。CBN_EDITCHANGE-當(dāng)輸入發(fā)生變化后Windows庫程序靜態(tài)庫程序-運行時不獨立存在,會被鏈接到可執(zhí)行文件或者動態(tài)庫中,目標程序的歸檔。文件擴展名:LIB動態(tài)庫程序-運行時獨立存在,不會被鏈接到可執(zhí)行文件或其他動態(tài)庫中。文件擴展名:DLLWindows庫程序靜態(tài)庫程序靜態(tài)庫特點1)運行時不獨立存在2)鏈接到可執(zhí)行文件或者動態(tài)庫中3)目標程序的歸檔C語言靜態(tài)庫靜態(tài)庫的使用建立一個C文件,可以在文件中直接使用C庫函數(shù),不需要頭文件。

C編譯器只是根據(jù)庫函數(shù)名稱,在庫中找到對應(yīng)的函數(shù)代碼,進行鏈接。靜態(tài)庫的創(chuàng)建1)建項目2)添加庫程序,源文件使用C文件庫的路徑設(shè)置1)項目的“Setting”中設(shè)置庫的路徑2)可以使用pragma關(guān)鍵字設(shè)置#pragma

comment(

lib,"..\\lib\\clib.lib")Windows庫程序C++語言的靜態(tài)庫靜態(tài)庫的建立建立項目添加庫程序,源文件使用CPP文件庫的導(dǎo)入項目的“Setting”中設(shè)置庫的路徑

2)可以使用pragma關(guān)鍵字設(shè)置注意在CPP環(huán)境使用C靜態(tài)庫,庫中函數(shù)原型定義要增加extern

“C”,例如:extern"C"int

Add(...);Windows庫程序動態(tài)庫程序1動態(tài)庫特點運行時獨立存在不會鏈接到執(zhí)行程序使用時加載與靜態(tài)庫的比較:由于靜態(tài)庫是將代碼嵌入到使用程序中,多個程序使用時,會有多份代碼,所以代碼體積會增大。動態(tài)庫的代碼只需要存在一份,其他程序通過函數(shù)地址使用,所以代碼體積小。靜態(tài)庫發(fā)生變化后,新的代碼需要重新鏈接嵌入到執(zhí)行程序中。動態(tài)庫發(fā)生變化后,如果庫中函數(shù)的定義(或地址)未變化,其他使用DLL的程序不需重新鏈接。2動態(tài)庫的創(chuàng)建)建立項目)添加庫程序)庫程序?qū)С觯峁┙o使用者庫中的函數(shù)等信息。Windows庫程序動態(tài)庫的使用隱式鏈接顯式鏈接動態(tài)庫的函數(shù)實現(xiàn)動態(tài)庫的函數(shù)庫函數(shù)的導(dǎo)出C++的導(dǎo)出使用_declspec(dllexport)導(dǎo)出函數(shù)注意:動態(tài)庫編譯鏈接后,也會有LIB文件,是作為動態(tài)庫函數(shù)映射使用,與靜態(tài)庫不完全相同。C的導(dǎo)出方式 extern

“C”

_declspec(dllexport)

intSub(...);3)模塊定義文件

.def例如:LIBRARY

DLLFunc

//庫EXPORTS

//庫導(dǎo)出表DLL_Mul

@1

//導(dǎo)出的函數(shù)Windows庫程序庫函數(shù)的使用隱式鏈接1)頭文件和函數(shù)原型可以在函數(shù)原型的定義前,增加declspec(dllimport),例如_declspec(dllimport)

int

DLL_Add(

...

);如果庫函數(shù)使用C格式導(dǎo)出,需要在函數(shù)定義增加extern

“C”2)導(dǎo)入動態(tài)庫的LIB文件3)在程序中使用函數(shù)4)隱式鏈接的情況,DLL可以存放的路徑:(1)與執(zhí)行文件中同一個目錄下(2)當(dāng)前工作目錄(3)Windows目錄Windows/System32目錄Windows/System環(huán)境變量PATH指定目錄注意:高版本VC的配置文件Windows庫程序4.3.2顯式鏈接1)定義函數(shù)指針類型2)加載動態(tài)庫

HMODULE

LoadLibrary(LPCTSTR

lpFileName

//動態(tài)庫文件名或全路徑);返回DLL的實例句柄(HINSTANCE)3)獲取函數(shù)地址FARPROC

GetProcAddress(//DLL句柄//函數(shù)名稱//DLL的實例句柄HMODULE

hModule,LPCSTR

lpProcName);成功返回函數(shù)地址

4)使用函數(shù)5)卸載動態(tài)庫

BOOL

FreeLibrary(HMODULE

hModule);Windows庫程序4.3.3兩種鏈接方式對比在庫函數(shù)的定義不變情況下:隱式鏈接,由于庫函數(shù)地址是在程序編譯鏈接時設(shè)置,所以當(dāng)動態(tài)庫變化后,使用程序需要重新編譯鏈接。

顯式鏈接,由于庫函數(shù)地址是在程序執(zhí)行時,動態(tài)的從庫中查詢,所以庫變化后,不需要重新編譯鏈接。動態(tài)庫加載隱式鏈接,動態(tài)庫是在程序啟動時就被加載,當(dāng)DLL不存在,程序無法啟動顯式鏈接,動態(tài)庫只在使用LoadLibrary函數(shù),才會被加載。Windows庫程序DLL中類的使用DLL中類的導(dǎo)出在類名稱前增加_declspec(dllexport)定義,例如:

class

_declspec(dllexport)

CMath{...};通常使用預(yù)編譯開關(guān)切換類的導(dǎo)入導(dǎo)出定義,例如:

#ifdef

DLLCLASS_EXPORTS#define

EXT_CLASS

_declspec(dllexport)//DLL#else#define

EXT_CLASS

_declspec(dllimport)//使用者

#endifclass

EXT_CLASS

CMath{...};Windows庫程序使用DLL中的類導(dǎo)入DLL的LIb類的定義使用類動態(tài)庫的程序入口入口程序不是DLL必須的。常用于DLL內(nèi)部初始化或善后處理。

BOOL

WINAPI

DllMain(HINSTANCE

hinstDLL,

//動態(tài)庫實例句柄DWORDfdwReason,

//被調(diào)用的原因LPVOID

lpvReserved

//保留值);返回TRUE,表示動態(tài)庫加載成功。動態(tài)庫的加載或卸載時會被調(diào)用。例如:使用LoadLibrary或FreeLibrary時會被調(diào)用。Windows文件系統(tǒng)Windows文件1創(chuàng)建或打開Windows文件

HANDLECreateFile(LPCTSTR

lpFileName,

//文件名稱DWORD

dwDesiredAccess,//訪問權(quán)限D(zhuǎn)WORD

dwShareMode,

//共享方式LPSECURITY_ATTRIBUTES

lpSecurityAttributes,//安全屬性,默認為NULLDWORDdwCreationDisposition,

//創(chuàng)建方式

DWORD

dwFlagsAndAttributes,//文件屬性HANDLE

hTemplateFile//文件句柄模板,默認為NULL);成功返回文件句柄。Windows文件系統(tǒng)寫數(shù)據(jù)BOOL

WriteFile(HANDLE

hFile,//文件句柄

LPCVOID

lpBuffer,//數(shù)據(jù)BUFFDWORD

nNumberOfBytesToWrite,//數(shù)據(jù)長度LPDWORD

lpNumberOfBytesWritten,//返回實際寫入的數(shù)據(jù)LPOVERLAPPED

lpOverlapped

//默認為NULL);讀數(shù)據(jù)BOOL

ReadFile(HANDLE

hFile,

//文件句柄LPVOID

lpBuffer,

//數(shù)據(jù)BUFFDWORD

nNumberOfBytesToRead,

//要讀的字節(jié)數(shù)LPDWORD

lpNumberOfBytesRead,

//實際讀到字節(jié)數(shù)LPOVERLAPPED

lpOverlapped

//默認為NULL);Windows文件系統(tǒng)關(guān)閉文件BOOL

Clos

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論