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

何苦做程序?!

業(yè)精于勤,荒于嬉;行成于思,毀于隨! I believe , I can flying! 勿在浮砂筑高臺(tái)!

C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
  4 Posts :: 1 Stories :: 14 Comments :: 0 Trackbacks
 孫鑫VC講座筆記--WINDOWS程序內(nèi)部運(yùn)行原理

聲明:

        本人最近也在看孫老師的視頻,為了加強(qiáng)理解,所以想一些讀書筆記。但是在CSDN上一搜索,發(fā)現(xiàn)已經(jīng)有朋友做了相關(guān)筆記。根據(jù)面向?qū)ο蟮摹袄^承”觀點(diǎn),為了解決勞動(dòng)力,所以我打算在他們的基礎(chǔ)上添加、修改。應(yīng)該不涉及著作權(quán)什么的東東吧?!

        我在BLOG.CSDN.NET/LEWISLAU上搜索了下 ,有兩位朋寫了相關(guān)筆記(而且都是一樣的)。不知道誰才是原作者,所以列出兩位BLOG地址:

http://blog.csdn.net/hhitjsj021                                http://blog.csdn.net/d007879

以后我會(huì)在前輩的基礎(chǔ)上修改、發(fā)文!呵呵!繼承嘛!

 

 

 

 

windows程序設(shè)計(jì)是種事件驅(qū)動(dòng)方式的程序設(shè)計(jì),主要基于消息的。當(dāng)用戶需要完成某種功能時(shí),需要調(diào)用OS某種支持,然后OS將用戶的需要包裝成消息,并投入到消息隊(duì)列中,最后應(yīng)用程序從消息隊(duì)列中取走消息并進(jìn)行響應(yīng)。

 

MSG Structure

--------------------------------------------------------------------------------

The MSG structure contains message information from a thread's message queue.

Syntax

typedef struct {
    HWND hwnd;   //指示一個(gè)窗口的句柄,改消息和那個(gè)窗口相關(guān)聯(lián)。
    UINT message;  //具體的消息,用無符號(hào)整形表示
    WPARAM wParam; //關(guān)于消息的附加參數(shù)
    LPARAM lParam; //同上
    DWORD time; //32位整數(shù),表示消息被投遞出去的時(shí)間
    POINT pt; //表示光標(biāo)位置
} MSG, *PMSG;

 句柄,資源的標(biāo)識(shí),操作系統(tǒng)通過句柄指到資源。常見的句柄有圖標(biāo)句柄(HICON),光標(biāo)句柄(HCURSOR),窗口句柄(HWND),應(yīng)用程序句柄(HINSTANCE)
 
例如:當(dāng)按下按鍵會(huì)發(fā)送出WM_CHAR消息   通過消息的附加參數(shù),保存對應(yīng)的ASCII碼,即可知道按下的是那個(gè)鍵。

 

 


消息隊(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)。

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


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啟動(dòng)應(yīng)用程序的時(shí)候,winmain函數(shù)的參數(shù)由OS傳遞的。

 

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

 

 

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,*PWNDCLASS;


窗口類型style為一個(gè)變量,該變量每一位對應(yīng)著一種特性。對應(yīng)為1時(shí),有該種特性;對應(yīng)為0時(shí),無該種特性。為了方便記憶,用一些宏對應(yīng)一些特征,通過取反(~)和相與(&)可以取消一些特性。  通常設(shè)置為"CS_HREDRAW | CS_VREDRAW"表示垂直重繪和水平重繪。

HICON可以由LoadIcon 賦值(它有兩個(gè)參數(shù)HINSTANCE和LPCTSTR,通常第一個(gè)參數(shù)為空,只對第二個(gè)參數(shù)賦值,即圖標(biāo)的ID)
HCURSOR同HICON
HBRUSH 使用GetStockObject函數(shù),它可以用來獲取筆、畫刷、字符、調(diào)試板的畫刷。使用時(shí)要用HBRUSH做一直強(qiáng)制轉(zhuǎn)化。因?yàn)镚etStockObject返回值和HBRUSH不同。

窗口類注冊:
ATOM RegisterClass(
  CONST WNDCLASS *lpWndClass   // address of structure with class
                              // data
);
//注意,是使用地址符

 


創(chuàng)建窗口:
HWND CreateWindow(
  LPCTSTR lpClassName,  //注冊窗口類名,用引號(hào)
  LPCTSTR lpWindowName, //窗口標(biāo)題,用引號(hào)
  DWORD dwStyle,        //窗口類型(風(fēng)格)通常為(WS_OVERLAPPEDWINDOW)
  int x,                // 窗口X坐標(biāo)
  int y,                // 窗口X坐標(biāo)
  int nWidth,           // 寬度
  int nHeight,          // 高度
  HWND hWndParent,      // 指向父窗口的句柄
  HMENU hMenu,          // 菜單句柄
  HANDLE hInstance,     // 當(dāng)前實(shí)例的句柄,由WINMAIN傳遞
  LPVOID lpParam        // WM_CREATE附加參數(shù)傳入指針
);
創(chuàng)建窗口的時(shí)候會(huì)發(fā)送WM_CREATE消息


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


消息循環(huán)
MSG msg;
while(GetMessage(&msg,...))    //從消息隊(duì)列中取出一條消息
{
 TranslateMessage(&msg); //進(jìn)行消息(如鍵盤消息)轉(zhuǎn)化。轉(zhuǎn)化過程不會(huì)影響原消息,只會(huì)創(chuàng)建新的消息。
 DispatchMessage(&msg); //分派消息到窗口的回調(diào)函數(shù)處理,(OS調(diào)用窗口回調(diào)函數(shù)進(jìn)行處理)。
}

BOOL GetMessage(
  LPMSG lpMsg,         // 消息結(jié)構(gòu)體變量
  HWND hWnd,           // 句柄,那個(gè)一個(gè)窗口?為NULL則為所有窗口句柄
  UINT wMsgFilterMin,  // 最小消息值,為0時(shí)返回所有消息
  UINT wMsgFilterMax   // 最大消息值
);

 

回調(diào)原理:當(dāng)應(yīng)用程序受到給某個(gè)窗口的消息時(shí),就應(yīng)調(diào)用某一函數(shù)來處理這條消息。這一消息有操作系統(tǒng)自動(dòng)完成。

注:函數(shù)名可以用以表示函數(shù)代碼的首地址(函數(shù)指針),額外數(shù)據(jù)通常為0。


窗口過程函數(shù)(回調(diào)函數(shù))原型:
LRESULT CALLBACK WindowProc(  //這里WindowProc是個(gè)代號(hào)名字。
  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


 響應(yīng)WM_DESTROY,調(diào)用PostQuitMessage(int)結(jié)束進(jìn)程。它會(huì)投遞一個(gè)WM_QUIT消息對消息隊(duì)列中。當(dāng)消息循環(huán)的GetMessage取到WM_QUIT消息,則返回0,程序結(jié)束。
 另外對于不感興趣的消息要景象缺省的處理,使用DefWindowProc()內(nèi)為窗口的參數(shù)。

 


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

posted on 2006-03-11 11:19 lewislau 阿木 閱讀(2704) 評論(1)  編輯 收藏 引用

評論

# re: 孫鑫VC講座筆記--WINDOWS程序內(nèi)部運(yùn)行原理 2006-03-18 18:34 hbyufan
是轉(zhuǎn)我的,筆記我停了,原因是我在研究ACE,精力都花在這上面了,歡迎在我筆記基礎(chǔ)上修改


筆記只做到第6講,技術(shù)內(nèi)幕好象只做到17章吧,后面都沒做,希望你或有心人接我后面繼續(xù)做完,到時(shí)候給我留言留下連接,把你的也轉(zhuǎn)過去

http://blog.csdn.net/hbyufan/  回復(fù)  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一区二区激情小说| 久久精品国产96久久久香蕉| 美女主播一区| 老司机aⅴ在线精品导航| 精品成人一区二区| 欧美激情第8页| 欧美日韩ab片| 欧美一区二区在线播放| 久久国产精品亚洲va麻豆| 亚洲二区在线| 99精品欧美一区二区三区| 国产精品www色诱视频| 欧美一区二区三区视频免费| 久久久久国产成人精品亚洲午夜| 亚洲高清在线播放| 99天天综合性| 伊人久久久大香线蕉综合直播| 欧美黄免费看| 国产精品日韩欧美一区二区| 久久亚洲高清| 欧美丝袜一区二区| 美女主播视频一区| 国产精品久久久久久av福利软件 | 久久资源在线| 欧美日本中文| 久久久噜噜噜久久人人看| 欧美成人福利视频| 欧美在线中文字幕| 欧美男人的天堂| 久久这里只有精品视频首页| 欧美日韩亚洲91| 美女黄网久久| 国产精品一区2区| 亚洲国产精品传媒在线观看 | 亚洲毛片播放| 欧美在线视频一区二区| 艳女tv在线观看国产一区| 欧美在线视频不卡| 亚洲一区二区三区在线视频| 久久女同互慰一区二区三区| 亚洲欧美日韩网| 欧美激情精品久久久| 久久人人爽人人爽| 国产精品久久久久久久久借妻 | 一区二区日韩欧美| 蜜臀va亚洲va欧美va天堂| 久久久久久久999| 国产精品素人视频| 亚洲欧美高清| 欧美91福利在线观看| 国产精品免费观看视频| 亚洲精品免费在线观看| 尤物在线观看一区| 久久国产欧美精品| 久久久999精品视频| 国产精品欧美在线| 在线亚洲自拍| 亚洲一区二区在线看| 欧美国产日韩在线观看| 欧美成人午夜免费视在线看片 | 欧美日韩精品久久| 亚洲国产综合在线| 亚洲青涩在线| 老鸭窝毛片一区二区三区 | 亚洲一区二区在线免费观看| 欧美日韩亚洲国产精品| 日韩一级精品视频在线观看| 99re视频这里只有精品| 欧美黄色大片网站| 亚洲三级色网| 亚洲午夜精品一区二区| 欧美日韩裸体免费视频| 一区二区电影免费观看| 亚洲综合好骚| 国产日产精品一区二区三区四区的观看方式 | 亚洲黄色在线观看| 99riav久久精品riav| 欧美国产视频在线观看| 亚洲福利国产精品| 在线一区二区三区四区| 国产精品看片你懂得| 欧美一区二区三区日韩| 免费一区二区三区| 日韩午夜中文字幕| 国产精品久久久久7777婷婷| 亚洲视频一区二区在线观看 | 亚洲二区在线视频| 欧美日韩精品免费观看视一区二区 | 蜜臀久久99精品久久久久久9 | 亚洲欧美制服中文字幕| 国产日韩综合一区二区性色av| 久久aⅴ乱码一区二区三区| 欧美jizzhd精品欧美喷水| 日韩一区二区精品| 国产日韩免费| 欧美本精品男人aⅴ天堂| 一本大道久久a久久综合婷婷| 久久国产日本精品| 亚洲精品国产精品乱码不99按摩 | 在线视频亚洲欧美| 欧美日韩大片一区二区三区| 亚洲欧美中日韩| 欧美不卡福利| 亚久久调教视频| 亚洲精品老司机| 国产日韩欧美一区二区三区在线观看 | 国产主播一区二区三区四区| 嫩草国产精品入口| 亚洲欧美综合v| 最新国产成人av网站网址麻豆| 新67194成人永久网站| 亚洲乱亚洲高清| 国语自产偷拍精品视频偷| 欧美涩涩网站| 欧美国产日韩一区二区三区| 久久gogo国模啪啪人体图| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 亚洲影院色无极综合| 91久久线看在观草草青青| 久久综合网hezyo| 午夜在线播放视频欧美| 日韩视频精品| 亚洲国产精品嫩草影院| 国产亚洲精品久久久| 国产精品视频在线观看| 欧美日韩免费区域视频在线观看| 久久久91精品国产一区二区精品| 亚洲一级特黄| 亚洲手机在线| 一区二区三区国产在线| 亚洲日本中文字幕区| 欧美高潮视频| 欧美成人日韩| 欧美电影资源| 欧美电影在线观看| 奶水喷射视频一区| 欧美91视频| 麻豆精品精品国产自在97香蕉| 久久国产主播精品| 久久精品国产免费| 久久99伊人| 久久精品一二三| 久久激情视频免费观看| 欧美专区在线观看| 久久久午夜精品| 美女主播视频一区| 欧美刺激性大交免费视频| 免费欧美电影| 欧美激情综合色| 亚洲靠逼com| 一本色道久久综合一区| 亚洲愉拍自拍另类高清精品| 亚洲欧美激情一区二区| 欧美亚洲系列| 美女精品国产| 欧美日韩国产一区| 国产精品乱看| 国产主播喷水一区二区| 亚洲高清一区二| 夜夜嗨av一区二区三区四季av | 亚洲精品之草原avav久久| 亚洲精品视频在线| 亚洲免费一区二区| 久久久噜噜噜久噜久久 | 欧美电影在线| 欧美三级小说| 国产日韩亚洲| 亚洲精品1区2区| 一区二区三区www| 欧美一区二区三区婷婷月色 | 亚洲午夜极品| 久久久久久亚洲综合影院红桃 | 一区二区三区日韩精品视频| 亚洲一区二区三区四区视频| 久久精品人人爽| 欧美日韩成人免费| 国产日韩欧美在线看| 亚洲清纯自拍| 久久超碰97中文字幕| 亚洲国产成人不卡| 亚洲欧美另类中文字幕| 免费一级欧美片在线播放| 国产精品夫妻自拍| 亚洲高清中文字幕| 性欧美暴力猛交69hd| 亚洲二区在线| 欧美中文在线视频| 国产精品v片在线观看不卡| 在线看日韩欧美| 欧美一级播放| 亚洲免费电影在线| 久久夜色精品国产| 国产精品久久久久久久9999| 亚洲激情网站免费观看| 久久精品国产一区二区三区| 亚洲精品亚洲人成人网| 久久亚洲春色中文字幕| 国产色产综合产在线视频| 在线视频免费在线观看一区二区| 噜噜噜久久亚洲精品国产品小说|