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

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

Windows程序內(nèi)部運(yùn)行機(jī)制

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

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

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

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

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

說明:創(chuàng)建窗口的時(shí)候一定要基于已經(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; //當(dāng)前應(yīng)用程序事例句柄。
    HICON   hIcon;      //圖標(biāo)句柄 LoadIcon();
    HCURSOR hCursor;    //光標(biāo)句柄 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,...))    //從消息隊(duì)列中取出一條消息
{
TranslateMessage(&msg); //進(jìn)行消息(如鍵盤消息)轉(zhuǎn)換
DispatchMessage(&msg); //分派消息到窗口的回調(diào)函數(shù)處理,(OS調(diào)用窗口回調(diào)函數(shù)進(jìn)行處理)。
}

其中:
//**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是個(gè)代號名字。
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 標(biāo)準(zhǔn)調(diào)用預(yù)定,是PASCAL 調(diào)用約定,象DELPHI使用的就是標(biāo)準(zhǔn)調(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ù)聲明的時(shí)加上 __stdcall 修飾符,以便對這個(gè)函數(shù)的調(diào)用是使用__stdcall約定(如使用DELPHI編寫的DLL時(shí)候)。
(VC中可通過這途徑修改:project|settings..|c/c++|...)


在窗口過程函數(shù)中通過一組switch語句來對消息進(jìn)行處理:
如:
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消息到消息隊(duì)列中,請求終止。
         //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句柄獲取:
a)使用BeginPaint(),EndPaint()對。注意只能在響應(yīng)WM_PAINT消息時(shí)使用。
b)使用GetDc(),ReleaseDC()對。注意他們不能在響應(yīng)WM_PAINT中使用。

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


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


導(dǎo)航

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

統(tǒng)計(jì)

常用鏈接

留言簿

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲视频一起| 久久精品一区二区三区四区| 国产精品毛片一区二区三区| 免费观看一区| 欧美精品免费观看二区| 欧美日韩免费高清| 欧美精品日韩一本| 欧美日韩国产在线一区| 欧美久久久久| 国产精品久久午夜夜伦鲁鲁| 国产一区在线播放| 在线观看av一区| 亚洲美女91| 一二美女精品欧洲| 久久久久高清| 欧美黄色精品| 亚洲午夜精品福利| 欧美在线观看视频一区二区三区 | 亚洲国产成人av在线| 亚洲电影天堂av| 一本色道**综合亚洲精品蜜桃冫| 日韩一级黄色大片| 亚洲欧美在线看| 久久综合九色99| 亚洲伦理网站| 久久激情五月丁香伊人| 老司机午夜免费精品视频 | 国产精品网站视频| 红桃视频国产一区| 99日韩精品| 亚洲欧美综合一区| 久久久久久久久久久久久女国产乱| 久久免费视频一区| 亚洲精品欧美激情| 午夜精品久久| 欧美激情精品久久久| 国产精品日韩高清| 亚洲高清不卡av| 午夜精品久久99蜜桃的功能介绍| 久久精品国产亚洲aⅴ| 亚洲九九精品| 欧美91视频| 亚洲东热激情| 久久午夜激情| 亚洲永久在线| 欧美天堂亚洲电影院在线观看| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 18成人免费观看视频| 久久国产精品久久久久久| 亚洲国产欧美一区二区三区同亚洲 | 亚洲在线观看| 欧美日韩国产另类不卡| 国内成人精品视频| 午夜欧美理论片| 一区二区高清在线观看| 欧美激情中文字幕一区二区 | 欧美体内谢she精2性欧美| 亚洲美女在线视频| 欧美国产精品| 免费看亚洲片| 亚洲人成7777| 亚洲美女黄色| 欧美午夜精品久久久久久浪潮| 中日韩美女免费视频网址在线观看| 亚洲国产日韩欧美| 欧美激情亚洲激情| 亚洲午夜视频在线观看| 在线中文字幕一区| 国产乱码精品一区二区三区忘忧草| 亚洲网站在线| 亚洲欧美精品一区| 国模精品娜娜一二三区| 麻豆国产精品777777在线| 免费在线成人| 一区二区三区导航| 亚洲一级二级| 黄色av日韩| 亚洲区在线播放| 国产精品毛片在线看| 久久经典综合| 久色婷婷小香蕉久久| 日韩亚洲欧美高清| 亚洲综合国产激情另类一区| 国产一区二区0| 欧美国产在线观看| 欧美性开放视频| 久久免费黄色| 欧美区一区二| 欧美一区二区三区免费在线看| 欧美一级淫片播放口| 亚洲日本免费电影| 亚洲视频欧洲视频| 国自产拍偷拍福利精品免费一| 亚洲电影在线观看| 国产精品你懂的在线| 欧美成人嫩草网站| 国产精品另类一区| 欧美国产第一页| 国产精品综合久久久| 欧美大尺度在线观看| 欧美日韩一区二区三区免费看| 久久国产一区二区| 欧美人与性动交a欧美精品| 亚洲欧美偷拍卡通变态| 久久综合九色综合欧美就去吻 | 国产亚洲成av人片在线观看桃| 亚洲电影免费观看高清完整版| 亚洲一区二区三区影院| 久久精品99久久香蕉国产色戒| 中文日韩在线| 久久免费国产精品1| 欧美一区二区三区四区在线观看| 美女精品网站| 看欧美日韩国产| 国产日韩精品在线播放| 日韩西西人体444www| 亚洲国产一二三| 久久久国产精品一区二区中文 | 欧美一区二区三区啪啪| 欧美日本三级| 欧美激情一区二区三区高清视频| 国产日韩欧美日韩大片| 一区二区三区欧美成人| 日韩一区二区精品葵司在线| 久久精品一区二区三区不卡牛牛| 99av国产精品欲麻豆| 久久躁日日躁aaaaxxxx| 久久久99精品免费观看不卡| 国产精品亚洲第一区在线暖暖韩国| 亚洲欧洲日本在线| 亚洲精品国产欧美| 免费观看成人| 黄色成人av| 小黄鸭精品aⅴ导航网站入口 | 欧美激情精品久久久| 在线观看精品| 久久久免费观看视频| 麻豆精品在线观看| 在线成人亚洲| 老司机精品视频网站| 欧美国产精品久久| 亚洲黄页一区| 欧美全黄视频| 中文亚洲字幕| 久久国产精品72免费观看| 国产一区二区欧美日韩| 久久国产精品久久精品国产| 狂野欧美激情性xxxx欧美| 91久久精品一区| 欧美日韩精品在线| 亚洲综合欧美| 免费成人av| 日韩视频在线一区二区| 欧美三日本三级少妇三2023| 亚洲专区在线视频| 久久视频这里只有精品| 亚洲激情视频在线播放| 欧美日韩精品久久久| 香蕉久久国产| 欧美激情a∨在线视频播放| 一区二区三区四区五区在线| 国产噜噜噜噜噜久久久久久久久 | 男女av一区三区二区色多| 亚洲人成在线观看| 午夜精品亚洲一区二区三区嫩草| 国产亚洲欧美一区在线观看| 久久夜色精品国产欧美乱| 日韩视频一区二区在线观看| 欧美一进一出视频| 亚洲日本va午夜在线影院| 欧美午夜宅男影院在线观看| 国产精品免费电影| 欧美一区二区三区精品| 欧美777四色影视在线| 中日韩视频在线观看| 国外成人性视频| 欧美午夜免费电影| 久久偷窥视频| 亚洲自拍三区| 亚洲激情亚洲| 久久久久久黄| 亚洲欧美日韩国产成人| 在线精品一区| 国产精品网站视频| 欧美日韩国产一区二区| 久久精品一二三区| 午夜国产精品影院在线观看| 亚洲精品一区二区三区99| 久久综合五月| 久久精品一区蜜桃臀影院 | 久久综合九九| 午夜精品久久久久久久久| 亚洲精品国产精品国自产观看浪潮 | 欧美亚洲视频一区二区| 99精品热视频| 亚洲国产你懂的| 猛男gaygay欧美视频| 久久精品欧美| 欧美在线观看你懂的| 亚洲免费视频网站|