亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

實例分析一個簡單的Win32程序

2020-01-26 15:21:08
字體:
來源:轉載
供稿:網友

本文較為詳細的分析了一個Win32程序的組成、結構、實現方法及運行原理,對于進行Windows程序設計有很好的借鑒參考價值。分享給大家供大家參考之用。具體分析如下:

一、Windows程序與普通C或C++程序的不同

學過C或C++等語言的人都知道,我們寫的程序都一個入口,main函數,但是在Win32程序里,我們的入口函數又是什么呢?它是怎么樣運行的,跟我們用C或C++寫的控制臺程序又有什么不同呢?

我們先說Win32程序跟我們控制臺的程序的一個很重要的不同點,就是Win32程序是一個消息響應程序,例如點擊了一個按鈕,就會產生一個消息onButoon,然后會這個消息會進入我們程序所維護的一個消息隊列,程序運行過程中不斷地取出隊列中的消息,并作出相應的處理。直到取出的是結束程序的消息。

二、了解MSG的結構和組成

首先,既然Windows的程序是基于消息觸發的,那么Windows是如何定義一個消息的呢?下面是在MSDN上說明文檔上的定義:

typedef struct tagMSG {   // msg   HWND hwnd;  UINT message;  WPARAM wParam;  LPARAM lParam;  DWORD time;  POINT pt;} MSG;

下面我們來分析一下這個結構體:

HWND hwnd:hwnd是一個窗口的句柄,用來唯一標識一個窗口資源;至于什么是一個句柄,它有點類似對C或C++中的指針,句柄是資源的標識,根據資源的類型,又可將句柄細分成圖標句柄(HICON),光標句柄(HCURSOR),窗口句柄(HWND),應用程序實例句柄(HINSTANCE)等等各種類型的句柄。操作系統給每一個窗口指定的一個唯一的標識號即窗口句柄。
 
UINT message:message是一個UINT(即C或C++中的unsign int)類型的變量,它用來標識一個具體的消息,如按鍵盤的消息。message用一個整數來表示,但是一個整數通常不好記憶,所以在VC++中就用微軟給我們定義的一些宏來表示,如WM_KEYDOWN。

WPARAM wParam:整型參數,用來指示message的附加信息。

LPARAM lParam:跟wParam一樣,是一個整型參數,用來指示message的附加信息。與wParam一樣,多用來區分同一個消息的不同情況。

DWORD time:DWORD其實是C或C++中的unsigned long類型,time標識了一個消息產生時的時間。

POINT pt:POINT是一個結構體,表示現實世界里的一個點,里面有兩個LONG類型的成員x和y,用來表示產生這個消息產時光標或鼠標的坐標。

由此可知一個MSG的變量所包含的信息是相當多和詳細的。

三、了解WinMain函數

然后,像C或C++控制臺程序的入口是main函數一樣,Win32程序的入口也是main函數,不過它叫WinMain函數,它的定義如下:

int WINAPI WinMain( HINSTANCE hInstance,   // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine,     // command line int nCmdShow       // show state);

下面我們來分析一下這個函數:

HINSTANCE hInstance:hInstance是一個指向當前應用程序實例的一個句柄。實例就是一個運行中的程序。

HINSTANCE hPrevInstance:hPrevInstance是一個指向之前應用程序實例的一個句柄。

LPSTR lpCmdLine:lpCmdLine是一個指向字符串的指針,表示一個命令行參數,什么是命令行參數呢?就是我們C或C++中的main函數中的參數char *argv[]。

int nCmdShow:用來表示一個窗口的顯示,表示它是要最大化顯示,最小化顯示,正常大小顯示還是隱藏顯示。

WinMain與main函數一樣,是由操作系統進行調用的,所以這些參數也是由操作系統來賦值。

WINAPI是什么呢?其實它是一個宏,它代表的是__stdcall,表示的是參數傳遞的順序,但是在VC中,參數的默認傳遞順序為__cdecl。

四、創建一個窗口

那我們應該怎樣設計一個窗口呢?要設計一個窗口,實際上是要設計一個窗口類,用來標記一個窗口的各種屬性,在VC中已經有這樣類(更正確地說是一個結構體)WNDCLASS。它的定義如下,后面的注釋說明了它們的用處:

typedef struct _WNDCLASS {  UINT style;       //用于指定類的類型,即窗口類的類型 WNDPROC lpfnWndProc;  //指定一個窗口回調函數,是一個函數的指針  int cbClsExtra;     //類的附加內存,通常數情況下為0 int cbWndExtra;     //窗口附加內存,通常情況下為0 HANDLE hInstance;  //當前實例句柄,用WinMain中的形參給它賦值 HICON hIcon;     //圖標句柄,用于指示應用程序所用的是什么圖標,用函數LoadIcon進行賦值 HCURSOR hCursor; //光標句柄,用于指示鼠標進入應用程序窗口區域時的顯示,用函數LoadCursor進行賦值 HBRUSH hbrBackground;   //用于指示程序的背景顏色,用函數(HBRUSH)GetStockObject賦值。 LPCTSTR lpszMenuName;   //指定菜單的名字 LPCTSTR lpszClassName;   //指定類的名字 } WNDCLASS;

注:類型窗口的過程函數,也稱回調函數,原理是,當應用程序收到給某一窗口的消息時,就應該調用某一函數來處理這條消息。這一調用過程不用應用程序自己來實施,而由操作系統來完成,但是,回調函數本身的代碼必須由應用程序自己完成。對于一條消息,操作系統調用的是接受消息的窗口所屬的類型中的lpfnWndProc成員指定的函數。每一種不同類型的窗口都有自己專用的回調函數,該函數就是通過lpfnWndProc成員指定的。

在VC里或寫Windows程序時,我們會經常用到一類變量,這個變量里的每一位(bit)都對應某一種特性。當該變量的某位為1時,表示有該位對應的那種特性,當該位為0時,即沒有該位所對應的特性。當變量中的某幾位同時為1時,就表示同時具有幾種特性的組合。一個變量中的哪一位代表哪種意義,不容易記憶,所以我們經常根據特征的英文拼寫的大寫去定義一些宏,該宏所對應的數值中僅有與該特征相對應的那一位(bit)為1,其余的bit都為0。其實這些宏是一個UINT類型的一個數值,所以我們可以用|運算符來把多個特性結合在一起,用&~來去掉一個特性。

所以要創建一個窗口,首先我們在WinMain函數中創建一個WNDCLASS變量,并對WNDCLASS變量中的成員賦值之后,就可以注冊這個窗口,可調用函數RegisterClass(&wndcls)來注冊一個窗口,它需要一個WNDCLASS類型變量的地址。然后定義一個窗口的句柄HWND hwnd;然后調用函數CreateWindow,把返回值賦給hwnd。最后調用函數ShowWindow(hwnd,SW_SHOWNORMAL);UpdateWindow(hwnd);來顯示窗口。

五、建立消息循環

現在窗口是創建出來了,但是之前我們就說過,Windows程序是基于消息觸發和處理的程序,那么我們如何讓程序讓系統知道我們的操作呢?例如點擊了一下鼠標,按了一下鍵盤,那就要建立我們的消息循環了,建立方法如下。
首先,我們定義一個MSG類型的變量,如MSG msg;
然后執行如下的循環:

while(GetMessage(&msg,NULL,0,0)) {  TranslateMessage(&msg);  DispatchMessage(&msg);  }

解釋:

GetMessage函數從我們的消息隊列中取出消息,第一個參數為MSG變量,它出會自動幫我們填充msg中的成員變量;第二個參數是一個窗口句柄,NULL表示接受屬于調用線程的所有消息;第三個參數指定消息的最小值;第四個參數指定消息的最大值。這兩個參數若設為0,則獲取所有在消息隊列中的消息。它的返回值為BOOL型,只有在取出的消息為WM_QUIT時,返回FALSE;即除非關閉程序,否則將是一個死循環,一直對我們的操作進行處理。

TranslateMessage函數,用于翻譯、處理和轉換消息并把新消息投放到消息隊列中,并且此過程不會影響原來的消息隊列。

DispatechMessage函數,用于把收到的消息傳到窗口回調函數進行分析和處理。即將消息傳遞給操作系統,讓操作系統調用窗口回調函數,來對信息進行處理。

六、回調函數(窗口過程函數)

首先來看看它的定義:

LRESULT CALLBACK WinSunProc(  HWND hwnd, // 窗口句柄  UINT uMsg, // 消息標志符 WPARAM wParam, // MSG第一附加參數  LPARAM lParam // MSG第二附加參數 );

CALLBACK是一個宏表示前面所說的_stdcall,LRESULT是一個long型參數。
調用時,把窗口類WNDCLASS的參數傳遞過來,里面有一個switch語句,用來判斷要處理的消息類型,并作出相應的處理,注意switch語句里一定有一個default:return DefWindowProc(hwnd,uMsg,wParam,lParam);表示沒有在case中出現的消息將按默認處理方式來處理,不然窗口運行會出錯,連窗口都不能創建和顯示出來。

通過上述分析還原了一個Win32應用程序的完整執行流程,相信本文所述對大家的Windows應用程序設計有一定的借鑒價值。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线播放日韩专区| 国产精品久久综合av爱欲tv| 97碰碰碰免费色视频| 国产精品∨欧美精品v日韩精品| 久久久电影免费观看完整版| 国产精品亚洲欧美导航| 911国产网站尤物在线观看| 国产深夜精品福利| 国产精品对白刺激| 中文字幕日韩欧美在线视频| 成人午夜激情免费视频| 欧美美女操人视频| 欧美第一黄网免费网站| 欧美激情亚洲自拍| 久久久久久久久久久久av| 欧美日韩国产在线看| 欧美激情喷水视频| 日韩视频第一页| 亚洲在线www| 色婷婷久久av| 国产精品视频色| 亚洲在线免费观看| 欧美视频免费在线| 2020久久国产精品| 日韩毛片在线观看| 国产综合色香蕉精品| 成人在线小视频| 亚洲天堂2020| 4444欧美成人kkkk| 岛国av一区二区在线在线观看| 日本一区二区不卡| 国产在线一区二区三区| 久久久之久亚州精品露出| 色在人av网站天堂精品| 亚洲人线精品午夜| 性色av一区二区咪爱| 成人疯狂猛交xxx| 精品久久久香蕉免费精品视频| 久久久久久av| 亚洲一区二区久久久| 日韩欧美成人精品| 欧美性高潮床叫视频| 5566成人精品视频免费| 久热99视频在线观看| 777国产偷窥盗摄精品视频| 国产成人精品亚洲精品| 亚洲第一精品久久忘忧草社区| 成人亚洲综合色就1024| 国产精品青草久久久久福利99| 欧美主播福利视频| 欧美日产国产成人免费图片| 中文字幕日本精品| 欧美日韩精品在线观看| 欧美日韩亚洲视频一区| 欧美日韩激情视频8区| 国产日韩欧美综合| 亚洲天堂男人天堂女人天堂| 欧美又大又硬又粗bbbbb| 欧美亚洲国产精品| 国产精品久久久久久av| 日本精品va在线观看| 91精品久久久久久久久久另类| 羞羞色国产精品| 国产激情视频一区| 精品国产91久久久| 国产激情综合五月久久| 欧美精品电影在线| 国产成人在线精品| 成人免费淫片视频软件| 欧美有码在线视频| 久久天天躁狠狠躁夜夜躁2014| 久久人人97超碰精品888| 亚洲视频视频在线| 久久久亚洲福利精品午夜| 欧美黑人巨大xxx极品| 亚洲激情中文字幕| 亚洲人成在线电影| 一区二区欧美日韩视频| 欧美日韩国产一区中文午夜| 久久国产天堂福利天堂| 欧美日韩国产色视频| 日韩成人av网| 亚洲精品国产精品国产自| 日韩成人中文字幕| 亚洲国产日韩欧美在线图片| 97碰碰碰免费色视频| 国产在线视频欧美| 亚洲欧美激情在线视频| 亚洲第一福利在线观看| 国产精品久久久久久久久久久新郎| 久久免费高清视频| 欧美色另类天堂2015| 精品国内产的精品视频在线观看| 欧美在线观看网址综合| 2019国产精品自在线拍国产不卡| 国产精品视频中文字幕91| 中文字幕精品在线视频| www欧美xxxx| 中文字幕亚洲一区二区三区五十路| 欧美肥臀大乳一区二区免费视频| 国产精品成人av在线| 色悠久久久久综合先锋影音下载| 日本成人在线视频网址| 日韩精品免费电影| 日韩在线欧美在线国产在线| 91久久精品国产91性色| 欧美激情中文网| 成人在线一区二区| 亚洲xxxx做受欧美| 中文字幕日韩在线观看| 欧美小视频在线观看| 亚洲美女黄色片| 成人女保姆的销魂服务| 亚洲sss综合天堂久久| 久久人人爽亚洲精品天堂| 中文字幕视频一区二区在线有码| 亚洲四色影视在线观看| 中文字幕无线精品亚洲乱码一区| 久久视频国产精品免费视频在线| 91在线视频一区| 在线日韩av观看| 欧美在线不卡区| 亚洲丁香婷深爱综合| 狠狠色噜噜狠狠狠狠97| 亚洲黄色av女优在线观看| 欧美日韩激情视频8区| 精品精品国产国产自在线| 97香蕉久久夜色精品国产| 亚洲激情 国产| 91久久久久久| 久久天天躁夜夜躁狠狠躁2022| 91精品久久久久久久久久| 最新69国产成人精品视频免费| 亚洲精品国产福利| 国产中文欧美精品| 亚洲护士老师的毛茸茸最新章节| 一个人看的www欧美| 深夜成人在线观看| 亚洲激情视频在线播放| 久久久人成影片一区二区三区| 国产精品中文久久久久久久| 国产精品久久久999| 国产日韩精品电影| 日本成熟性欧美| 人九九综合九九宗合| 91免费精品视频| 亚洲美女自拍视频| 日韩av在线免费观看一区| 国产97人人超碰caoprom| 精品国产依人香蕉在线精品| 国产精品夜色7777狼人| 久久久久久久网站| 日韩精品极品毛片系列视频| 欧美大尺度电影在线观看| 国产精品白嫩初高中害羞小美女| 福利一区视频在线观看| 国外日韩电影在线观看| 亚洲精选一区二区| 日韩美女在线观看一区| 亚洲精品影视在线观看| 国产69精品久久久| 国产精品视频白浆免费视频| 国产精国产精品| 国产91色在线播放|