欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2014年09月04日 16:53:16   投稿:shichen2014  
這篇文章主要介紹了實例分析一個簡單的Win32程序,對于Win32應用程序的原理、執(zhí)行流程、實現(xiàn)方法主要環(huán)節(jié)都做了較為詳細的分析,有助于讀者深入理解Windows應用程序設計,需要的朋友可以參考下

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

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

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

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

二、了解MSG的結構和組成

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

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

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

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

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

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

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

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

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

三、了解WinMain函數(shù)

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

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

下面我們來分析一下這個函數(shù):

HINSTANCE hInstance:hInstance是一個指向當前應用程序?qū)嵗囊粋€句柄。實例就是一個運行中的程序。

HINSTANCE hPrevInstance:hPrevInstance是一個指向之前應用程序?qū)嵗囊粋€句柄。

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

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

WinMain與main函數(shù)一樣,是由操作系統(tǒng)進行調(diào)用的,所以這些參數(shù)也是由操作系統(tǒng)來賦值。

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

四、創(chuàng)建一個窗口

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

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

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

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

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

五、建立消息循環(huán)

現(xiàn)在窗口是創(chuàng)建出來了,但是之前我們就說過,Windows程序是基于消息觸發(fā)和處理的程序,那么我們?nèi)绾巫尦绦蜃屜到y(tǒng)知道我們的操作呢?例如點擊了一下鼠標,按了一下鍵盤,那就要建立我們的消息循環(huán)了,建立方法如下。
首先,我們定義一個MSG類型的變量,如MSG msg;
然后執(zhí)行如下的循環(huán):

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

解釋:

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

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

DispatechMessage函數(shù),用于把收到的消息傳到窗口回調(diào)函數(shù)進行分析和處理。即將消息傳遞給操作系統(tǒng),讓操作系統(tǒng)調(diào)用窗口回調(diào)函數(shù),來對信息進行處理。

六、回調(diào)函數(shù)(窗口過程函數(shù))

首先來看看它的定義:

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

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

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

相關文章

  • OpenCV實現(xiàn)圖像膨脹

    OpenCV實現(xiàn)圖像膨脹

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)圖像膨脹,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語言實現(xiàn)高精度加減法

    C語言實現(xiàn)高精度加減法

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)高精度加減法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 一道超經(jīng)典的C++結構體的題目

    一道超經(jīng)典的C++結構體的題目

    以下小編就為大家介紹一道超經(jīng)典的關于C++結構體的題目。需要的朋友可以過來參考下
    2013-09-09
  • 基于C++實現(xiàn)TCP聊天室功能

    基于C++實現(xiàn)TCP聊天室功能

    這篇文章主要為大家詳細介紹了基于C++實現(xiàn)TCP聊天室功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C語言學習之柔性數(shù)組詳解

    C語言學習之柔性數(shù)組詳解

    結構體的最后一個元素允許是未知大小的數(shù)組,這就叫柔性數(shù)組。這篇文中主要為大家詳細介紹了C語言中柔性數(shù)組的相關知識,需要的可以了解一下
    2023-03-03
  • C語言 數(shù)據(jù)結構平衡二叉樹實例詳解

    C語言 數(shù)據(jù)結構平衡二叉樹實例詳解

    這篇文章主要介紹了C語言 數(shù)據(jù)結構平衡二叉樹實例詳解的相關資料,需要的朋友可以參考下
    2017-06-06
  • 基于C++實現(xiàn)酒店管理系統(tǒng)

    基于C++實現(xiàn)酒店管理系統(tǒng)

    這篇文章主要為大家詳細介紹了基于C++實現(xiàn)酒店管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言實現(xiàn)投票系統(tǒng)

    C語言實現(xiàn)投票系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)投票系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 深入理解C++移位運算符

    深入理解C++移位運算符

    下面小編就為大家?guī)硪黄钊肜斫釩++移位運算符。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • opencv3機器學習之EM算法示例詳解

    opencv3機器學習之EM算法示例詳解

    這篇文章主要介紹了opencv3機器學習之EM算法的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06

最新評論