• <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>

            何苦做程序?!

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

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

            聲明:

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

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

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

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

             

             

             

             

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

             

            MSG Structure

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

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

            Syntax

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

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

             

             


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

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


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

             

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

             

             

            Windows提供的窗口類:
            typedef struct  WNDCLASS {
                UINT    style;        //窗口的類型
                WNDPROC lpfnWndProc;  //窗口過程函數(shù)指針(回調(diào)函數(shù))
                int     cbClsExtra; //窗口類附加字節(jié),為該類窗口所共享。通常0。
                int     cbWndExtra; //窗口附加字節(jié)。通常設為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 賦值(它有兩個參數(shù)HINSTANCE和LPCTSTR,通常第一個參數(shù)為空,只對第二個參數(shù)賦值,即圖標的ID)
            HCURSOR同HICON
            HBRUSH 使用GetStockObject函數(shù),它可以用來獲取筆、畫刷、字符、調(diào)試板的畫刷。使用時要用HBRUSH做一直強制轉(zhuǎn)化。因為GetStockObject返回值和HBRUSH不同。

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

             


            創(chuàng)建窗口:
            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附加參數(shù)傳入指針
            );
            創(chuàng)建窗口的時候會發(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,...))    //從消息隊列中取出一條消息
            {
             TranslateMessage(&msg); //進行消息(如鍵盤消息)轉(zhuǎn)化。轉(zhuǎn)化過程不會影響原消息,只會創(chuàng)建新的消息。
             DispatchMessage(&msg); //分派消息到窗口的回調(diào)函數(shù)處理,(OS調(diào)用窗口回調(diào)函數(shù)進行處理)。
            }

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

             

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

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


            窗口過程函數(shù)(回調(diào)函數(shù))原型:
            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)用預定,是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),從而終止應用程序。
              break;
             default:
              return DefWindowProc(hwnd,uMsg,wParam,lParam);
             //用缺省的窗口過程處理我們不感興趣的消息(其它消息)。
             //這是必須的。
                }//switch
             return 0;
            }//WindowProc


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

             


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

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

            評論

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


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

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

            国产精品成人久久久| 中文字幕久久亚洲一区| 久久天天躁狠狠躁夜夜2020一 | 久久精品人成免费| 国产亚洲精品美女久久久| 国产精品成人无码久久久久久 | 天堂无码久久综合东京热| 波多野结衣久久| 久久99国产综合精品女同| 91久久精品国产免费直播| 伊人久久大香线蕉综合热线| 久久综合九色综合网站| 九九久久99综合一区二区| 久久久久亚洲AV成人网人人网站| 99麻豆久久久国产精品免费| 午夜精品久久久内射近拍高清| 91久久精品91久久性色| 色老头网站久久网| 国产精品久久久久久久久| 一本一本久久a久久精品综合麻豆| 久久久老熟女一区二区三区| 欧美久久久久久午夜精品| 97久久精品无码一区二区| 一本一道久久a久久精品综合| 精品久久久久久国产牛牛app| 久久精品国产清高在天天线| 久久久久亚洲AV成人网人人网站| 久久久久综合国产欧美一区二区| 国内精品伊人久久久久AV影院| 国产精品久久久久久久app| 久久久久一级精品亚洲国产成人综合AV区 | 婷婷久久综合| 久久se精品一区精品二区国产| 999久久久免费精品国产| 精品久久无码中文字幕| 少妇高潮惨叫久久久久久| 免费精品国产日韩热久久| 色播久久人人爽人人爽人人片aV | 国产精品9999久久久久| 久久人人爽人人爽人人片AV不 | 亚洲AV无码久久精品狠狠爱浪潮|