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

何苦做程序?!

業精于勤,荒于嬉;行成于思,毀于隨! I believe , I can flying! 勿在浮砂筑高臺!

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

聲明:

        本人最近也在看孫老師的視頻,為了加強理解,所以想一些讀書筆記。但是在CSDN上一搜索,發現已經有朋友做了相關筆記。根據面向對象的“繼承”觀點,為了解決勞動力,所以我打算在他們的基礎上添加、修改。應該不涉及著作權什么的東東吧?!

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

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

以后我會在前輩的基礎上修改、發文!呵呵!繼承嘛!

 

 

 

 

windows程序設計是種事件驅動方式的程序設計,主要基于消息的。當用戶需要完成某種功能時,需要調用OS某種支持,然后OS將用戶的需要包裝成消息,并投入到消息隊列中,最后應用程序從消息隊列中取走消息并進行響應。

 

MSG Structure

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

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

Syntax

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

 句柄,資源的標識,操作系統通過句柄指到資源。常見的句柄有圖標句柄(HICON),光標句柄(HCURSOR),窗口句柄(HWND),應用程序句柄(HINSTANCE)
 
例如:當按下按鍵會發送出WM_CHAR消息   通過消息的附加參數,保存對應的ASCII碼,即可知道按下的是那個鍵。

 

 


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

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


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

 

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

 

 

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


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

HICON可以由LoadIcon 賦值(它有兩個參數HINSTANCE和LPCTSTR,通常第一個參數為空,只對第二個參數賦值,即圖標的ID)
HCURSOR同HICON
HBRUSH 使用GetStockObject函數,它可以用來獲取筆、畫刷、字符、調試板的畫刷。使用時要用HBRUSH做一直強制轉化。因為GetStockObject返回值和HBRUSH不同。

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

 


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


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


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

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

 

回調原理:當應用程序受到給某個窗口的消息時,就應調用某一函數來處理這條消息。這一消息有操作系統自動完成。

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


窗口過程函數(回調函數)原型:
LRESULT CALLBACK WindowProc(  //這里WindowProc是個代號名字。
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);
說明:兩種函數調用約定(__stdcall 和 __cdecl):
#define CALLBACK    __stdcall
//__stdcall 標準調用預定,是PASCAL 調用約定,象DELPHI使用的就是標準調用約定
#define WINAPIV     __cdecl 
// __cdecl 是C 語言形式的調用約定。
主要區別:函數參數傳遞順序 和 對堆棧的清除上。
問題:除了那些可變參數的函數調用外,其余的一般都是__stdcall約定。但 C/C++編譯默然的是__cdecl約定。所以如果在VC等環境中調用__stdcall約定的函數,必須要在函數聲明的時加上 __stdcall 修飾符,以便對這個函數的調用是使用__stdcall約定(如使用DELPHI編寫的DLL時候)。
(VC中可通過這途徑修改:project|settings..|c/c++|...)
在窗口過程函數中通過一組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);
   //銷毀窗口,并發送WM_DESTROY消息。
  break;
 case WM_DESTROY:
  //PostQuitMessage(0);
  //發送WM_QUIT消息到消息隊列中,請求終止。
         //GetMessage()取到WM_QUIT消息后,返回0,退出消息循                //   環,從而終止應用程序。
  break;
 default:
  return DefWindowProc(hwnd,uMsg,wParam,lParam);
 //用缺省的窗口過程處理我們不感興趣的消息(其它消息)。
 //這是必須的。
    }//switch
 return 0;
}//WindowProc


 響應WM_DESTROY,調用PostQuitMessage(int)結束進程。它會投遞一個WM_QUIT消息對消息隊列中。當消息循環的GetMessage取到WM_QUIT消息,則返回0,程序結束。
 另外對于不感興趣的消息要景象缺省的處理,使用DefWindowProc()內為窗口的參數。

 


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

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

評論

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


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

http://blog.csdn.net/hbyufan/  回復  更多評論
  


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久国产精品一区| 欧美视频不卡| 99国产精品久久久久久久久久| 亚洲一区二区不卡免费| 99在线精品观看| 久久精品夜色噜噜亚洲a∨| 羞羞漫画18久久大片| 国产精品久久久久久妇女6080| 在线视频你懂得一区二区三区| 亚洲天堂成人在线观看| 国产乱码精品一区二区三区忘忧草 | 一区二区三区精品在线| 亚洲视频精品在线| 亚洲欧美日本国产有色| 国产精品推荐精品| 久久精品国产综合精品| 欧美激情久久久久| 亚洲一区二区三| 久久免费视频在线观看| 免费人成网站在线观看欧美高清| 欧美成人午夜77777| 欧美激情视频给我| 亚洲欧美国产77777| 国产一区二区三区无遮挡| 久久综合伊人77777麻豆| 亚洲国产mv| 亚洲网址在线| 伊人色综合久久天天| 欧美喷潮久久久xxxxx| 亚洲性图久久| 91久久线看在观草草青青| 欧美一区日本一区韩国一区| 亚洲第一页在线| 国产精品v亚洲精品v日韩精品 | 亚洲精品在线看| 国产麻豆午夜三级精品| 欧美激情一区二区三区不卡| 午夜精品视频在线| 亚洲日本成人| 欧美ed2k| 欧美一级黄色网| 在线视频一区观看| 亚洲第一级黄色片| 国产日韩欧美一区二区| 欧美日韩精品中文字幕| 久色婷婷小香蕉久久| 午夜精品久久久久久久蜜桃app | 久久精品中文字幕一区| 亚洲伦理中文字幕| 亚洲第一色中文字幕| 国模精品一区二区三区色天香| 欧美日韩一区三区四区| 免费在线观看精品| 国产真实精品久久二三区| 免费观看久久久4p| 亚洲综合激情| 中文久久精品| 日韩亚洲视频| 亚洲免费黄色| 亚洲欧洲美洲综合色网| 精品999日本| 精品91在线| 在线看日韩欧美| 亚洲电影在线看| 亚洲国内精品在线| 一区二区三区在线免费观看| 国产一区 二区 三区一级| 国产精品一二三四区| 国产精品毛片大码女人| 国产精品国产a级| 国产精品久久久久久久久借妻| 欧美视频在线观看免费网址| 欧美欧美天天天天操| 欧美日韩亚洲一区二区| 欧美日韩中字| 国产伦精品一区二区三区高清版| 国产精品国产三级国产普通话99| 欧美日韩亚洲不卡| 国产精品午夜av在线| 国产精品麻豆va在线播放| 国产精品一区一区| 黄色成人av网| 亚洲精品女av网站| 在线一区二区三区四区| 性欧美xxxx大乳国产app| 欧美www视频| 快she精品国产999| 欧美日韩国产三级| 国产精品主播| 在线日韩av| 亚洲一级在线观看| 久久激情五月婷婷| 亚洲电影专区| 亚洲视频你懂的| 久久精品国产久精国产爱| 久久在线视频| 欧美亚韩一区| 亚洲二区视频在线| 亚洲欧美日韩第一区| 久久手机免费观看| 日韩系列在线| 久久久久久一区二区| 欧美日韩另类字幕中文| 国产在线麻豆精品观看| 一本色道久久99精品综合| 亚洲自拍偷拍麻豆| 欧美刺激午夜性久久久久久久| 欧美一级片在线播放| 亚洲网友自拍| 亚洲午夜一二三区视频| 美女国内精品自产拍在线播放| 欧美激情在线狂野欧美精品| 亚洲麻豆av| 亚洲欧美中文日韩在线| 蜜桃久久精品乱码一区二区| 国产精品www色诱视频| 亚洲第一福利社区| 久久xxxx精品视频| av成人免费在线观看| 久久一区二区三区超碰国产精品| 欧美日韩免费一区二区三区视频| 狠狠色丁香久久婷婷综合_中| 一区二区av在线| 欧美国产日产韩国视频| 性色一区二区三区| 欧美日韩大片一区二区三区| 伊人夜夜躁av伊人久久| 久久精品国产第一区二区三区最新章节 | 欧美午夜电影完整版| 在线成人h网| 午夜精品一区二区三区四区| 亚洲高清不卡在线| 欧美在线|欧美| 国产亚洲欧美日韩美女| 亚洲欧美日韩另类| 一区二区三区欧美在线| 欧美日韩成人| 9l国产精品久久久久麻豆| 欧美成人综合网站| 久久另类ts人妖一区二区| 激情综合自拍| 欧美va天堂在线| 久久综合五月| 亚洲精品久久久一区二区三区| 农村妇女精品| 久久婷婷激情| 亚洲日本免费电影| 亚洲国产婷婷综合在线精品| 美女久久网站| 亚洲伦理中文字幕| 一区二区三区日韩精品| 国产精品乱码人人做人人爱| 亚洲欧美激情视频在线观看一区二区三区| 日韩网站在线看片你懂的| 欧美视频中文字幕在线| 亚洲免费在线观看视频| 午夜免费久久久久| 在线欧美日韩国产| 欧美日韩成人精品| 国产日韩欧美亚洲| 免费成人在线观看视频| 免费在线亚洲| 亚洲欧美国产日韩中文字幕| 亚洲婷婷综合色高清在线| 国产视频在线观看一区二区三区 | 久久九九热re6这里有精品| 久久久久这里只有精品| 亚洲精品国产视频| 一区二区三区高清在线| 国产精自产拍久久久久久蜜| 美女视频黄免费的久久| 欧美日韩国产高清视频| 西西人体一区二区| 免费在线观看日韩欧美| 久久久精彩视频| 亚洲开发第一视频在线播放| 亚洲午夜精品久久久久久浪潮| 国产亚洲永久域名| 亚洲韩国青草视频| 国产婷婷色一区二区三区四区 | 亚洲乱码久久| 性欧美在线看片a免费观看| 99成人在线| 久久精品视频免费| 亚洲午夜一区二区三区| 久久久久久久一区二区| 亚洲影视九九影院在线观看| 久久免费的精品国产v∧| 亚洲性人人天天夜夜摸| 久久久蜜臀国产一区二区| 亚洲欧美成人一区二区在线电影 | 久久精品99无色码中文字幕| 亚洲日本欧美天堂| 久久精品国产亚洲高清剧情介绍| 一区二区三区免费网站| 久久久在线视频| 久久国产精彩视频| 国产精品视频在线观看| 亚洲精品影视在线观看| 亚洲第一偷拍|