青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Windows程序內(nèi)部運行機制 收藏

Windows程序內(nèi)部運行機制

1,windows程序設(shè)計是種事件驅(qū)動方式的程序設(shè)計,主要基于消息的。當用戶需要完成某種功能時,需要調(diào)用OS某種支持,然后OS將用戶的需要包裝成消息,并投入到消息隊列中,最后應(yīng)用程序從消息隊列中取走消息并進行響應(yīng)。
2,消息結(jié)構(gòu):
typedef struct tagMSG {     // msg
    HWND   hwnd;     //接收消息的窗口句柄。和哪個窗口相關(guān)聯(lián)。
    UINT   message; //消息標識。消息本身是什么。
    WPARAM wParam;   //消息的附加信息。具體取決于消息本身。  
    LPARAM lParam;
    DWORD time;     //消息投遞時間。
    POINT pt;       //消息投遞時,光標在屏幕上的位置。
} MSG;

3,消息隊列:
每個應(yīng)用程序OS都為它建立一個消息隊列,消息隊列是個先進先出的緩沖區(qū),其中每個元素都是一個消息,OS將生成的每個消息按先后順序放進消息隊列中,應(yīng)用程序總是取走當前消息隊列中的第一條消息,應(yīng)用程序取走消息后便知道用戶的操作和程序的狀態(tài),然后對其處理即消息響應(yīng),消息響應(yīng)通過編碼實現(xiàn)。

4,使用VC編程除了良好的C基礎(chǔ)外還需要掌握兩方面:
一,消息本身。不同消息所代表的用戶操作和應(yīng)用程序的狀態(tài)。
二,對于某個特定的消息來說,要讓OS執(zhí)行某個特定的功能去響應(yīng)消息。

5,Window程序入口:
int WINAPI WinMain(
HINSTANCE hInstance, // 當前事例句柄。
HINSTANCE hPrevInstance, // 先前事例句柄。
LPSTR lpCmdLine,      // 命令行指針
int nCmdShow          // (窗口)顯示的狀態(tài)
);
說明:WinMain函數(shù)是Windows程序入口點函數(shù),由OS調(diào)用,當OS啟動應(yīng)用程序的時候,winmain函數(shù)的參數(shù)由OS傳遞的。

6,創(chuàng)建一個完整的窗口需要經(jīng)過下面四個操作步驟:
一,設(shè)計一個窗口類;如:WNDCLASS wndcls;
二,注冊窗口類;    如:RegisterClass(&wndcls);
三,創(chuàng)建窗口;      如:CreateWindow(),CreateWindowEX();
四,顯示及更新窗口。如:ShowWindow(),UpdateWindow();

說明:創(chuàng)建窗口的時候一定要基于已經(jīng)注冊的窗口類.

7,Windows提供的窗口類:
typedef struct _WNDCLASS {
    UINT    style;        //窗口的類型
    WNDPROC lpfnWndProc; //窗口過程函數(shù)指針(回調(diào)函數(shù))
    int     cbClsExtra; //窗口類附加字節(jié),為該類窗口所共享。通常0。
    int     cbWndExtra; //窗口附加字節(jié)。通常設(shè)為0。
    HANDLE hInstance; //當前應(yīng)用程序事例句柄。
    HICON   hIcon;      //圖標句柄 LoadIcon();
    HCURSOR hCursor;    //光標句柄 LoadCursor();
    HBRUSH hbrBackground; //畫刷句柄 (HBRUSH)GetStockObject();
    LPCTSTR lpszMenuName; //菜單名字
    LPCTSTR lpszClassName; //類的名字
} WNDCLASS;

8,窗口類注冊:
ATOM RegisterClass(
CONST WNDCLASS *lpWndClass   // address of structure with class
                               // data
);

9,創(chuàng)建窗口:
HWND CreateWindow(
LPCTSTR lpClassName, // pointer to registered class name
LPCTSTR lpWindowName, // pointer to window name
DWORD dwStyle,        // window style
int x,                // horizontal position of window
int y,                // vertical position of window
int nWidth,           // window width
int nHeight,          // window height
HWND hWndParent,      // handle to parent or owner window
HMENU hMenu,          // handle to menu or child-window identifier
HANDLE hInstance,     // handle to application instance
LPVOID lpParam        // pointer to window-creation data
);

10,顯示和更新窗口窗口:
BOOL ShowWindow(
HWND hWnd,     // handle to window
int nCmdShow   // show state of window
);
BOOL UpdateWindow(
HWND hWnd   // handle of window
);

11,消息循環(huán):
MSG msg;
while(GetMessage(&msg,...))    //從消息隊列中取出一條消息
{
TranslateMessage(&msg); //進行消息(如鍵盤消息)轉(zhuǎn)換
DispatchMessage(&msg); //分派消息到窗口的回調(diào)函數(shù)處理,(OS調(diào)用窗口回調(diào)函數(shù)進行處理)。
}

其中:
//**The GetMessage function retrieves a message from the calling thread's message queue and places it in the specified structure.
//**If the function retrieves a message other than WM_QUIT, the return value is nonzero.If the function retrieves the WM_QUIT message, the return value is zero. If there is an error, the return value is -1.

BOOL GetMessage(
LPMSG lpMsg,         // address of structure with message
HWND hWnd,           // handle of window
UINT wMsgFilterMin, // first message
UINT wMsgFilterMax   // last message
);


//The TranslateMessage function translates virtual-key messages into character messages. The character messages are posted to the calling thread's message queue, to be read the next time the thread calls the GetMessage or PeekMessage function.
BOOL TranslateMessage(
CONST MSG *lpMsg   // address of structure with message
);

//The DispatchMessage function dispatches a message to a window procedure.
LONG DispatchMessage(
CONST MSG *lpmsg   // pointer to structure with message
);


12,窗口過程函數(shù)(回調(diào)函數(shù))原型:
The WindowProc function is an application-defined function that processes messages sent to a window. The WNDPROC type defines a pointer to this callback function. WindowProc is a placeholder(占位符) for the application-defined function name.

LRESULT CALLBACK WindowProc( //這里WindowProc是個代號名字。
HWND hwnd,      // handle to window
UINT uMsg,      // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam   // second message parameter
);

說明:兩種函數(shù)調(diào)用約定(__stdcall 和 __cdecl):
#define CALLBACK    __stdcall
//__stdcall 標準調(diào)用預(yù)定,是PASCAL 調(diào)用約定,象DELPHI使用的就是標準調(diào)用約定
#define WINAPIV     __cdecl
// __cdecl 是C 語言形式的調(diào)用約定。


主要區(qū)別:函數(shù)參數(shù)傳遞順序 和 對堆棧的清除上。
問題:除了那些可變參數(shù)的函數(shù)調(diào)用外,其余的一般都是__stdcall約定。但 C/C++編譯默然的是__cdecl約定。所以如果在VC等環(huán)境中調(diào)用__stdcall約定的函數(shù),必須要在函數(shù)聲明的時加上 __stdcall 修飾符,以便對這個函數(shù)的調(diào)用是使用__stdcall約定(如使用DELPHI編寫的DLL時候)。
(VC中可通過這途徑修改:project|settings..|c/c++|...)


在窗口過程函數(shù)中通過一組switch語句來對消息進行處理:
如:
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam  
)
{
    switch(uMsg)
    {
case WM_PAINT:
   ...
   break;
case ...
   break;
case WM_CLOSE:
   //DestroyWindow(hwnd);
    //銷毀窗口,并發(fā)送WM_DESTROY消息。
   break;
case WM_DESTROY:
   //PostQuitMessage(0);
   //發(fā)送WM_QUIT消息到消息隊列中,請求終止。
         //GetMessage()取到WM_QUIT消息后,返回0,退出消息循                //   環(huán),從而終止應(yīng)用程序。
   break;
default:
   return DefWindowProc(hwnd,uMsg,wParam,lParam);
//用缺省的窗口過程處理我們不感興趣的消息(其它消息)。
//這是必須的。
    }//switch
return 0;
}//WindowProc

13,DestroyWindow()函數(shù)和PostQuitMessage()函數(shù)原型:
//**The DestroyWindow function destroys the specified window. The function sends WM_DESTROY and WM_NCDESTROY messages。

BOOL DestroyWindow(
HWND hWnd   // handle to window to destroy
);

//**The PostQuitMessage function indicates to the system that a thread has made a request to terminate (quit). It is typically used in response to a WM_DESTROY message.
//**The PostQuitMessage function posts a WM_QUIT message to the thread's message queue and returns immediately; the function simply indicates(預(yù)示,通知) to the system that the thread is requesting to quit at some time in the future.

When the thread retrieves the WM_QUIT message from its message queue, it should exit its message loop and return control to the system.

VOID PostQuitMessage(
int nExitCode   // exit code
);

14,關(guān)于DC句柄獲?。?br>a)使用BeginPaint(),EndPaint()對。注意只能在響應(yīng)WM_PAINT消息時使用。
b)使用GetDc(),ReleaseDC()對。注意他們不能在響應(yīng)WM_PAINT中使用。

posted on 2010-06-21 22:41 lhking 閱讀(143) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導(dǎo)航

<2010年6月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

統(tǒng)計

常用鏈接

留言簿

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美福利小视频| 葵司免费一区二区三区四区五区| 欧美大香线蕉线伊人久久国产精品| 国产亚洲欧洲997久久综合| 欧美与黑人午夜性猛交久久久| 亚洲影院色无极综合| 国产麻豆精品theporn| 久久国产欧美日韩精品| 久久久久综合| 一本色道久久综合亚洲精品按摩| av72成人在线| 国产日韩亚洲欧美精品| 美女福利精品视频| 欧美日本三级| 欧美一区二区三区四区高清 | 欧美一区二区网站| 欧美影院精品一区| 亚洲欧洲美洲综合色网| 亚洲免费激情| 国产亚洲精品资源在线26u| 免费一级欧美在线大片| 欧美日韩在线一区二区三区| 久久精品国产清高在天天线| 美女久久网站| 欧美一区永久视频免费观看| 免费不卡中文字幕视频| 午夜免费日韩视频| 蜜桃av一区二区三区| 亚洲综合精品一区二区| 久久男人资源视频| 亚洲一区二区成人在线观看| 久久成人久久爱| 亚洲一区二区四区| 久久人人爽人人| 欧美亚洲综合另类| 欧美激情综合色综合啪啪| 久久精品中文| 国产精品va在线播放| 亚洲第一级黄色片| 国产乱码精品一区二区三| 最新成人av网站| 激情久久一区| 亚洲欧美日韩国产精品| 中文一区二区在线观看| 蜜桃久久精品一区二区| 久久福利资源站| 国产精品久久国产精品99gif | 亚洲图片你懂的| 美日韩免费视频| 久久综合中文色婷婷| 国产日本欧洲亚洲| 亚洲在线黄色| 午夜伦欧美伦电影理论片| 欧美日韩精品一区| 亚洲精品乱码久久久久久黑人| 一区视频在线| 久久精品亚洲精品| 久久久久国产精品午夜一区| 国产精品久久久999| 一区二区三区四区蜜桃| 99视频超级精品| 欧美激情视频在线免费观看 欧美视频免费一 | 91久久线看在观草草青青| 欧美一激情一区二区三区| 午夜精品视频在线观看一区二区| 欧美人妖在线观看| 亚洲久久视频| 亚洲一区二区高清| 国产精品久久久久久久久| 99精品视频免费观看视频| 夜夜夜精品看看| 欧美日韩成人精品| 99视频在线精品国自产拍免费观看| 日韩视频在线一区| 欧美日韩精品久久| 亚洲视频在线观看视频| 性色一区二区| 国内精品久久国产| 美女精品国产| 99re66热这里只有精品4| 亚洲午夜精品视频| 国产欧美亚洲视频| 久久精品亚洲| 亚洲电影有码| 亚洲制服av| 国产亚洲综合在线| 免费亚洲电影在线观看| 亚洲精品极品| 亚洲欧美视频一区二区三区| 好看的日韩视频| 欧美国产综合一区二区| 一级日韩一区在线观看| 欧美在线电影| 亚洲精品视频一区| 国产精品人成在线观看免费| 久久国产一区| 日韩写真在线| 久久久欧美一区二区| 亚洲毛片视频| 国产日韩精品视频一区二区三区| 久久久久久网| 亚洲视频网在线直播| 毛片基地黄久久久久久天堂| 日韩西西人体444www| 国产一区二区三区久久久| 欧美激情一二区| 午夜久久一区| 亚洲精品国产无天堂网2021| 久久国产免费| 亚洲午夜精品福利| 怡红院精品视频在线观看极品| 欧美日韩第一区| 久久久久久国产精品一区| 日韩视频国产视频| 媚黑女一区二区| 欧美在线地址| 亚洲视频精选| 91久久亚洲| 国产一区二区三区在线观看视频| 欧美片在线观看| 免费成人黄色片| 欧美中文字幕第一页| 一区二区三区视频观看| 亚洲承认在线| 牛夜精品久久久久久久99黑人| 午夜精品福利视频| 99精品热视频只有精品10| 在线免费不卡视频| 国产日韩欧美麻豆| 国产精品久久影院| 欧美日韩在线三级| 欧美成人一区二区三区在线观看| 午夜视频在线观看一区二区三区| 一区二区三区四区五区精品| 亚洲日本va午夜在线影院| 欧美r片在线| 久久综合久久美利坚合众国| 久久se精品一区二区| 亚洲欧美区自拍先锋| 亚洲视频观看| 一本久道久久综合中文字幕| 亚洲九九爱视频| 99国产精品国产精品久久 | 国产精品久久久久久影院8一贰佰 国产精品久久久久久影视 | 亚洲国产三级在线| 欧美成人免费小视频| 久热爱精品视频线路一| 久久久久久尹人网香蕉| 久久精品成人一区二区三区| 欧美在线亚洲在线| 久久激情中文| 久久一区国产| 欧美国产三级| 日韩午夜电影在线观看| 99国产精品99久久久久久| 一区二区日韩伦理片| 亚洲午夜成aⅴ人片| 亚洲在线国产日韩欧美| 午夜精品三级视频福利| 久久久久成人精品免费播放动漫| 久久成人资源| 麻豆精品网站| 欧美日韩午夜剧场| 国产精品自拍在线| 伊人久久亚洲影院| 亚洲最新视频在线| 午夜视频在线观看一区二区| 久久精品国产一区二区三区免费看| 久久免费黄色| 最新国产拍偷乱拍精品| 一区二区三区偷拍| 久久超碰97人人做人人爱| 久久综合99re88久久爱| 欧美另类久久久品| 国产视频一区欧美| 亚洲精品国产品国语在线app| 一区二区三区四区五区精品视频 | 亚洲人线精品午夜| 午夜精品成人在线视频| 猛男gaygay欧美视频| 99精品久久久| 玖玖国产精品视频| 欧美性一区二区| 在线看无码的免费网站| 亚洲欧美在线x视频| 美女图片一区二区| 一区二区三区黄色| 久热这里只精品99re8久| 国产精品高潮呻吟久久av无限 | 在线观看的日韩av| 亚洲专区欧美专区| 欧美激情精品久久久六区热门| 亚洲永久视频| 欧美精品免费在线观看| 狠狠色噜噜狠狠色综合久| 亚洲一区二区视频在线观看| 欧美成人精品1314www| 亚洲欧美综合另类中字| 欧美女同在线视频| 亚洲黄色有码视频|