中文亚洲爆乳AV无码专区_亚洲成AV人片在线观看天堂无_菠萝蜜视频在线观看_欧美综合天天夜夜久久_粉嫩av观看成人网站_亚洲精品无码午夜福利中文字幕_女人被弄到高潮叫床免_VIDEOS日本多毛HD护士_日韩欧美成人免费观看

首頁(yè) > 編程 > Java > 正文

WinAPI簡(jiǎn)單入門

2019-09-06 23:33:14
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

                    不要覺得奇怪,雖然我們擁有眾多“所見即所得”的編程方式來(lái)開發(fā)眾多界面精美的應(yīng)
用程序,這些可視化的編程環(huán)境提供了大量的類庫(kù)和控件,但是在開發(fā)者享受方便的同時(shí),
他們的手腳已經(jīng)不知不覺的受到了限制,有很多深入到Windows內(nèi)部的操作它們無(wú)法完成,
為什么?因?yàn)樗玫念悗?kù)不支持。

  事實(shí)上這些類庫(kù)與控件都是架構(gòu)在Window API的基礎(chǔ)上面的,API即 Application
Programming Interface -- 應(yīng)用編程接口 的縮寫,它不僅為應(yīng)用程序所調(diào)用,同時(shí)也是
Windows的一部分,Windows自身的運(yùn)行也調(diào)用這些API函數(shù)。要了解如何使用API就必須了
解一些Windows的運(yùn)行機(jī)制。

  簡(jiǎn)單地說(shuō),Windows是由事件驅(qū)動(dòng)的搶占式多任務(wù)操作系統(tǒng)。事件驅(qū)動(dòng)是相對(duì)于過(guò)程驅(qū)
動(dòng)而言的,它改變了原來(lái)文件的順序執(zhí)行方式;Windows既然是多任務(wù)系統(tǒng),就必須能同時(shí)
處理多個(gè)事件,系統(tǒng)為應(yīng)用程序生成一個(gè)消息隊(duì)列,消息在上面被張貼和發(fā)送,應(yīng)用程序只
要從其消息隊(duì)列中取出消息,然后一一執(zhí)行就可以了。

  現(xiàn)在,我將使用最最基本的范例程序 HelloWin 來(lái)說(shuō)明WIN32 API的運(yùn)行機(jī)制

首先,一個(gè)程序一定要有進(jìn)入點(diǎn),Win32 App的進(jìn)入點(diǎn)函數(shù)的名稱是WinMain,它的原型如下
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine,int nCmdShow)


hInstance是所謂的“實(shí)例句柄”,它是一個(gè)數(shù)值,當(dāng)程序在Windows下運(yùn)行的時(shí)候,它被用
來(lái)唯一的標(biāo)示這個(gè)程序,雖然用戶可能同時(shí)運(yùn)行多個(gè)同一個(gè)程序,即運(yùn)行多個(gè)“實(shí)例”,我
們可以看到,每一個(gè)實(shí)例都有不同的hInstance值。

hPrevInstance,簡(jiǎn)單地說(shuō)就是沒用…它是存在于16位Windows程序中的,在編寫
Windows 9x/NT/2000 程序的時(shí)候,總應(yīng)該是NULL。

szCmdLine是一個(gè)指針,指向一個(gè)以0為終結(jié)的字串,里面包含傳給該程序的命令行參數(shù),
如果想要讓程序處理命令行,那么這個(gè)參數(shù)就有用了。

iCmdShow參數(shù)是一個(gè)數(shù)值,指示窗口將如何被顯示,這個(gè)數(shù)值由在Windows下運(yùn)行該程序的
程序所決定,通常是SW_SHOWNORMAL。

接下來(lái)是注冊(cè)一個(gè)窗口類,窗口總是從窗口類的基礎(chǔ)上創(chuàng)建的,窗口類用以標(biāo)示處理窗口消
息的窗口過(guò)程,注冊(cè)窗口類時(shí)使用 RegisterClassEx() 函數(shù),它只需要一個(gè)參數(shù),一個(gè)指向
類型為 WNDCLASSEX 的結(jié)構(gòu)指針。

具體注冊(cè)初始是這樣的:
WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);     //結(jié)構(gòu)的大小

wcex.style = CS_HREDRAW | CS_VREDRAW; //類風(fēng)格
wcex.lpfnWndProc = (WNDPROC)WndProc;  //窗口類的窗口過(guò)程
wcex.cbClsExtra = 0;            //在類結(jié)構(gòu)中預(yù)留的空間
wcex.cbWndExtra = 0;           //在Windows內(nèi)部保存的窗口結(jié)構(gòu)中預(yù)留的空間
wcex.hInstance = hInstance;        //程序的實(shí)例句柄
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_EXAMPLE);  //程序圖標(biāo)
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);         //結(jié)構(gòu)的大小
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);    //指定窗口的背景顏色
wcex.lpszMenuName = (LPCSTR)IDC_EXAMPLE;         //菜單
wcex.lpszClassName = szWindowClass;             //類名,和程序名相同
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);    //也是程序圖標(biāo)

return RegisterClassEx(&wcex);

接下來(lái),定義一個(gè)HWND,然后使用 CreateWindow() 函數(shù),原型如下:
HWND CreateWindow(
  LPCTSTR lpClassName,    // 窗口類名
  LPCTSTR lpWindowName,  // 窗口標(biāo)題
  DWORD dwStyle,       // 窗口風(fēng)格
  int x,             // 初始x
  int y,             // 初始y
  int nWidth,          // 窗口寬
  int nHeight,         // 窗口高
  HWND hWndParent,     // 父窗口句柄
  HMENU hMenu,       // 菜單句柄
  HINSTANCE hInstance,   // 實(shí)例句柄
  LPVOID lpParam       // 創(chuàng)建參數(shù)
);

在 CreateWindow() 調(diào)用返回之后,Windows內(nèi)部已經(jīng)創(chuàng)建了這窗口。但是窗口并為顯示,
還需要兩個(gè)調(diào)用,一個(gè)是 ShowWindow(hwnd, iCmdShow):第一個(gè)參數(shù)是剛剛創(chuàng)建的窗口
句柄,第二個(gè)參數(shù)是傳遞給WinMain的nCmdShow;另一個(gè)是 UpdateWindow(hwnd) ,導(dǎo)致
客戶區(qū)域被繪制。

接下來(lái),程序通過(guò)執(zhí)行一塊被稱為“消息循環(huán)”的代碼從消息隊(duì)列中取出消息

while (GetMessage(&msg, NULL, 0, 0))
{
  if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
}

消息循環(huán)以 GetMessage 開始,它從消息隊(duì)列中取出一條消息,只要從消息隊(duì)列中取出消
息的 Message 域不為 WM_QUIT,GetMessage 就返回一個(gè)非零值,否則將導(dǎo)致程序退出
消息循環(huán),然后程序中止,返回 msg 結(jié)構(gòu)的 wParam 參數(shù)。在循環(huán)中,TranslateMessage
將 msg 結(jié)構(gòu)的內(nèi)容進(jìn)行修改,而 DispatchMessage 找出準(zhǔn)備調(diào)用的窗口過(guò)程。

上面進(jìn)行的僅僅是準(zhǔn)備性工作:注冊(cè)窗口類、創(chuàng)建窗口、顯示窗口、進(jìn)入消息循環(huán)取出消息
而實(shí)際的動(dòng)作都發(fā)生在窗口過(guò)程中。

LRESULT CALLBACK WndProc(HWND hWnd, //剛剛創(chuàng)建的窗口句柄
  UINT message,           //得到的消息
  WPARAM wParam,
  LPARAM lParam           //消息的進(jìn)一步詳細(xì)的參數(shù)
)

在程序中窗口過(guò)程通常是命名為 WndProc 的函數(shù),其實(shí)窗口過(guò)程可以任意的命名,一個(gè)
Windows程序可以包含多個(gè)窗口過(guò)程,一個(gè)窗口過(guò)程總是與調(diào)用了 RegisterClassEx 注冊(cè)的
窗口類相關(guān)聯(lián),CreateWindow 函數(shù)根據(jù)窗口類來(lái)創(chuàng)建窗口,但是一個(gè)窗口類可以被用來(lái)創(chuàng)
建多個(gè)窗口。


消息收到之后,接下來(lái)應(yīng)該根據(jù)消息的不同來(lái)進(jìn)行處理
switch(message)
{
 case …:
 …
 …

HelloWin程序只需要處理兩條消息,即 WM_PAINT 和 WM_DESTROY。

WM_PAINT 消息在Windows程序中的地位極其重要,當(dāng)窗口客戶區(qū)的一部分或者全部變?yōu)?br />“無(wú)效”,必須進(jìn)行刷新的時(shí)候,將由這條消息通知程序。

為什么客戶區(qū)域會(huì)變得無(wú)效呢?在創(chuàng)建窗口的時(shí)候,整個(gè)客戶區(qū)都是無(wú)效的,因?yàn)檫€沒有畫
任何的東西。第一條 WM_PAINT 消息指示窗口過(guò)程在窗口上面畫一些東西;還有在用戶改
變了窗口的大小之后,客戶區(qū)域重新變得無(wú)效,除此之外最小化窗口之后再還原、窗口的一
部分被覆蓋,都會(huì)引發(fā)這條消息。

WM_DESTROY消息則是當(dāng)用戶按下“關(guān)閉”按鈕的時(shí)候被觸發(fā),標(biāo)準(zhǔn)的處理方法是調(diào)用
PostQuitMessage 將一條 WM_QUIT 消息插入消息隊(duì)列,這將使得 GetMessage 函數(shù)調(diào)用
返回0,從而退出消息循環(huán),結(jié)束整個(gè)程序。

其實(shí),從上面可以看出,Windows程序的這種運(yùn)行機(jī)制并不是很難理解,真正困難的是不知
道調(diào)用什么函數(shù)去完成想要的操作,以及怎樣調(diào)用那些函數(shù),從而靈活的進(jìn)行底層API程序
開發(fā),這是一個(gè)循序漸進(jìn)的積累過(guò)程,沒有捷徑可走的。請(qǐng)各位一定要記住。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

丁香五月缴情网站| 天美传媒MV在线看免费| 日本伊人精品一区二区三区| 人妻体体内射精一区二区| 日韩AV无码中文一区二区三区| 男女狂进狂出动态图| 欧美乱大交XXXXX疯狂俱乐部| 欧美精品成人A在线观看| 久久水蜜桃网国产欧美H版护士| 宝宝才两根手指就疼哭了怎么回事| 亚洲精品又大又粗| CSGO内射最强对手| 国产精品亚洲污污网站入口| 插花弄玉小说荔枝很甜作者卿凌| YYY6080韩国三级理论| 国产AV成人无码精品网站| 无码精品人妻一区二区三区涩爱| 玩弄肥美高大的熟妇| 久久亚洲日韩看片无码| 欧产日产国产精品| 色综合久久中文字幕无码| 日韩精品一区二区三区中文| 麻豆传播媒体2023最新网站| 欧美午夜一区二区福利视频| 日日摸夜夜添夜夜添视频| 忘忧草社区在线影视| 里番本子库绅士ACG全彩无码| 久久久久久亚洲精品中文字幕| 让女人受不了19种新姿势| 亚洲AV片无码久久尤物| 亚洲AV成人无码久久WWW| 野花社区日本韩国免费观看| 刺激战场老阿姨是谁啊| 伊人久久大香线蕉AV一区| 粉嫩av一区二区三区| 久碰人澡人澡人澡人澡人视频| 午马视频影院1区2区3区4区| 野花香高清在线观看视频播放免费 | 妺妺窝人体色WWW聚色窝丿| 欧美乱强伦XXXXXXXXXX| 色YEYE香蕉凹凸视频在线观看| 外国操逼全黄视频| 日本日本熟妇中文在线视频| 欧美国产综合欧美视频| 女人与公拘交酡ZOZO| 人妻精品一区二区| 日韩精品视频一区二区| 荫蒂添的好舒服小说短篇| 国产调教性奴在线观看W| 国产女人的高潮国语对白| 欧美XXXX做受欧美| 少妇人妻在线视频| 一区二区三区四区黄色网站| 国产精品-区区久久久狼| 免费专区SM美脚践踏调教视频| 日韩一区二区三区无码人妻视频 | 久久午夜福利无码1000合集| 老汉粗大不带套怀孕| 欧美大成色WWW永久网站婷| 亚洲精品国产成人99久久| 精品亚洲国产成人小电影 | 亚洲中文字幕永久在线不卡| 爸的比老公大两倍儿媳妇怎么称呼| 妓女妓女影院妓女影库妓女网| 国产精品无码久久久久| 人人爽天天碰天天躁夜夜躁| 亚洲VA久久久噜噜噜久久男同| YELLOW在线观看| 漂亮人妻沦陷精油按摩| 一女多男3根一起进去爽吗| 国产精品自产拍高潮在线观看| 久久亚洲AV成人无码一区二区| 少妇伦子伦情品无吗| www.五月丁香| 久久婷婷综合缴情亚洲狠狠| 免费看B站直播APP下载| 我的风流岳每2部集第| 中国少妇XXXX做受| 麻豆国产成人AV在线播放| 亚洲精品无码AMM毛片| 国产成人精品一区二区三区无码 | 精品人妻少妇嫩草AV无码专区| 午夜影视啪啪体验区入口| 公又粗又大又长挺进我的| 亚洲 欧美 激情 小说 另类| 免费全部高H视频无码| 国产成人18黄网站免费观看| 一本到无码AV专区无码不卡| 人妻丰满妇岳av无码区HD| 国产精品另类激情久久久免费| 日韩免费无码人妻波多野| FREEXXXX国产HD中文对白| 内射爆草少妇精品视频| JAPANESE娇小侵犯| 年轻漂亮的人妻被公侵犯BD免费| 中中文日产幕无线码一区| 内射毛片内射国产夫妻| 亚洲AV成人片无码网站网8X| 99西方37大但人文艺术| 黑人入室强丰满人妻| 熟妇av一区二区| 办公室扒开奶罩揉吮奶头AV| 久久亚洲精品无码AⅤ电影| 一本无码人妻在中文字幕| 老师的兔子好多软水好多动漫| 亚洲国产成人无码网站大全| 国产精品国产三级国产AV主播| 先の欲求不満な人妻无码| 51福利国产在线观看午夜天堂| 找老女人泻火对白自拍| 久久99精品国产麻豆婷婷| 亚洲成AV人在线观看| 国产伦久视频免费观看视频| 他趴在两腿中间舔我私密有事| 成熟丰满熟妇高潮XXXXX91| 任你躁X7X7X7X7在线观看| 锕锕锕锕锕~好深啊免费软件| 欧美人妻一区二区| A级毛片毛片免费观看丝瓜| 女邻居的大乳中文字幕理论 | 国产乱子伦精品无码专区| 婷婷久久综合九色综合97| 国产成人久久精品| 玩弄老太婆BBW视频| 国产精品白丝JK白祙喷水视频| 熟妇人妻中文字幕| 国产成人无码AA精品一区| 我和亲妺妺乱的性视频| 国产精品人人妻人色五月| 无码人妻一区二区三区AV| 国产无遮挡18禁无码网站| 亚洲AⅤ日韩久久久久久| 韩漫网站在线看免费无删减漫画| 亚洲丰满少妇自摸| 久久精品国产一区二区电影| 一二三四在线观看免费高清视频| 久久午夜无码免费| 51精产国品一二三产区| 欧洲美女黑人粗性暴交视频| А√最新版资源在线官网| 日韩乱码人妻无码中文字幕视频| 丰满少妇被猛烈进入高清APP| 未成18不能看的视频| 国内揄拍国内精品少妇| 亚洲熟伦熟女新五十路熟妇| 乱码精品一区二区三区| 97国语精品自产拍在线观看一 | 久久国产精品一国产精品金尊 | 性啪啪CHINESE东北女人| 极品无码AV国模在线观看| 一道本在线视频不卡| 欧美精品中文字幕亚洲专区| 波多野结衣好大好紧好爽 | 亚洲欧美日韩综合久久久| 老头的大龟挺进秀婷小说| A∨天堂亚洲区无码先锋影音| 日韩欧美一区二区三区视频| 国产精品麻豆欧美日韩WW | CHINESE熟女老女人HD视| 视频二区精品中文字幕| 国产在线拍揄自揄拍免费下载| 亚洲一区精品无码| 欧美精品双插重口在线播放| 大学生无套流白浆视频大全| 小东西几天没做又紧了| 久久精品中文闷骚内射| BGMBGMBGM老太太俄罗斯| 丝袜足控一区二区三区| 狠狠无码人妻精品一区二区蜜桃| 一区适合晚上一个人看B站| 人妻少妇乱子伦无码视频专区| 国产电影在免费播放在线观看| 亚洲精品自产拍在线观看| 欧美V亚洲V综合Ⅴ国产V| 东北老熟女疯狂作爱视频| 亚洲AV无码久久精品蜜桃| 免费光看午夜请高视频| 粉嫩AV精品一区二区三区| 亚洲国产成人久久综合人| 女人私密紧致手术视频| 国产成人亚洲精品无码AV大片| 亚洲欧洲专线一区| 日本VA欧美VA精品发布| 国内自拍视频一区二区三区| 最新在线精品国产福利| 天干天干啦夜天干天天爽| 精品久久亚洲中文字幕| GV天堂GV无码男同在线观看| 无人区码一码二码三码区别在哪里 | 免费看无码自慰一区二区| 高H闺蜜老公1V1| 亚洲一区二区三区日本久久九| 让人爽到湿的小黄书软件下载| 国产色婷婷精品综合在线| 中文字幕亚洲乱码熟女1区2区| 日产无人区一线二线三线小说 | 国产成人麻豆亚洲综合无码精品| 亚洲中文无码AV永久不收费| 色又黄又爽18禁免费网站| 久久精品久久精品久久39|