• <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>
            posts - 64,comments - 18,trackbacks - 0

            /*****************************************************
             Windows SDK編程之一  窗口示例程序
            ******************************************************/

            /*Win32應(yīng)用程序框架主要由"初始化窗口類","窗口注冊(cè)類","窗口的創(chuàng)建"以"窗口消息函數(shù)"等組成*/
            #include "stdafx.h"


            LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);  //窗口函數(shù)說(shuō)明

            /*
              WinMain函數(shù)是所有windows應(yīng)用程序的入口,類似于C語(yǔ)言中的Main函數(shù),其功能是完成一系列的定義和初始化工作,并產(chǎn)生消息循環(huán)。消息循環(huán)是整個(gè)程序運(yùn)行的核心。WinMain函數(shù)實(shí)現(xiàn)以下功能。
              1. 注冊(cè)窗口類,建立窗口及執(zhí)行其它必要的初始化工作;
              2. 進(jìn)入消息循環(huán),根據(jù)從應(yīng)用程序消息隊(duì)列接受的消息,調(diào)用相應(yīng)的處理過(guò)程
              3. 當(dāng)消息循環(huán)檢索到WM_QUIT消息時(shí)終止程序運(yùn)行。

              WinMain函數(shù)有三個(gè)基本的組成部份:函數(shù)說(shuō)明、初始化和消息循環(huán)。

             WinMain函數(shù)的說(shuō)明如下:
             int WINAPI WinMain(  //WinMain函數(shù)說(shuō)明
                         HINSTANCE hInstance, //程序當(dāng)前實(shí)例句柄       
                         HINSTANCE hPrevInstance,  //應(yīng)用程序其它實(shí)例句柄
                         LPSTR     lpCmdLine, //指向程序命令行參數(shù)的指針
                         int   nCmdShow  //應(yīng)用程序開(kāi)始執(zhí)行時(shí)窗口顯示方式的整數(shù)值標(biāo)識(shí)
            )
                  由于Window操作系統(tǒng)是多任務(wù)的操作系統(tǒng),能進(jìn)行多任務(wù)的管理,因此,windows應(yīng)用程序可能被并行的多次執(zhí)行,因而可能出現(xiàn)同一個(gè)程序的多個(gè)窗口同時(shí)存在的情況,Windows系統(tǒng)將應(yīng)用程序每一次執(zhí)行稱為該應(yīng)用程序的一個(gè)實(shí)例(Instance),并用一個(gè)實(shí)例句柄唯一的標(biāo)識(shí)它。

            */
            int APIENTRY WinMain(HINSTANCE hInstance,           //WinMain函數(shù)說(shuō)明
                                 HINSTANCE hPrevInstance,
                                 LPSTR     lpCmdLine,
                                 int       nCmdShow)
            {
              // TODO: Place code here.
             /*
             建議采用Pascal的變量定義風(fēng)格,即在程序(函數(shù))開(kāi)始處定義所有變量
             雖然C++的變量定義比較靈活,本程序?yàn)榱耸钩绦蛞子诶斫?未采用這種方法
             */
               
             char lpszClassName[]="窗口";       //窗口類名
             char lpszTitle[]="Windows SDK編程之一  窗口示例程序";   //窗口標(biāo)題名

             //---------------窗口類定義-------------------------------------
             /*
             窗口類的定義
                在Windows應(yīng)用程序中,窗口害定義了窗口的形式與功能。窗口類定義通過(guò)給窗口類數(shù)據(jù)結(jié)構(gòu)WNDCLASS賦值完成,該數(shù)據(jù)結(jié)構(gòu)中包括窗口類的各種屬性,在窗口類定義過(guò)程中常用到以下函數(shù):
             */
             WNDCLASS wndclass;
             wndclass.style=0;                                              //窗口類型為缺省類型
             wndclass.lpfnWndProc=WndProc;                                  //窗口處理函數(shù)為WndProc
             wndclass.cbClsExtra=0;                                         //窗口類無(wú)擴(kuò)展
             wndclass.cbWndExtra=0;                                         //窗口實(shí)例無(wú)擴(kuò)展
             wndclass.hInstance=hInstance;                                  //當(dāng)前實(shí)例句柄
             
             wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);                 //使用缺省圖標(biāo)
             /*
              LoadIcon():在應(yīng)用程序中加載一個(gè)窗口圖標(biāo)
                 LoadIcon()函數(shù)原型為:
                         HICON LoadIcon(
                               HINSTANCE hInstance,//圖標(biāo)資源所在的模塊句柄,為NULL則使用系統(tǒng)預(yù)定義圖標(biāo)
                               LPCTSTR lpIconName //圖標(biāo)資源名或系統(tǒng)預(yù)定義圖標(biāo)標(biāo)識(shí)名
                         )
             */


             wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);                   //窗口采用箭頭光標(biāo)
                /*
             LoadCursor():在應(yīng)用程序中加載一個(gè)窗口光標(biāo)
                LoadCursor()函數(shù)原型為:
                         HCURSOR LoadCursor(
                                 HINSTANCE hInstance,//光標(biāo)資源所在的模塊句柄,為NULL則使用系統(tǒng)預(yù)定義光標(biāo)
                                 LPCTSTR lpCursorName //光標(biāo)資源名或系統(tǒng)預(yù)定義光標(biāo)標(biāo)識(shí)名
                         )
             */

             wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);    //窗口背景為白色
             /*
              GetStockObject():獲取已經(jīng)定義的畫筆、畫刷、字體等對(duì)象的句柄
                 GetStockObject()函數(shù)原型為:
                               HGDIOBJ GetStockObject(int fnObject); //fnObject為對(duì)象的標(biāo)識(shí)名

             */

             wndclass.lpszMenuName=NULL;                                    //窗口中無(wú)菜單
             wndclass.lpszClassName=lpszClassName;                          //窗口類名為'窗口實(shí)例'

             //------------------以下是進(jìn)行窗口類的注冊(cè)---------------------------
             
             /*
                注冊(cè)窗口類
                Windows系統(tǒng)本身提供部份預(yù)定義的窗口類,程序員也可以自定義窗口類,窗口類必須先注冊(cè)后使用。窗口類的注冊(cè)由注冊(cè)函數(shù)RegisterClass()實(shí)現(xiàn)。其形式為:
                RegisterClass(&wndclass)
               &wndclass為窗口類結(jié)構(gòu)
                  RegisterClass函數(shù)的返回值為布爾值,注冊(cè)成功則返回真
             */
             if (! RegisterClass(&wndclass))     //注冊(cè)窗口,若失敗,則發(fā)出聲音
             { MessageBeep(0);
               return FALSE;
             }
               
             /*
             創(chuàng)建窗口實(shí)例
             創(chuàng)建一個(gè)窗口類的實(shí)例由函數(shù)CreateWindow()實(shí)現(xiàn),該函數(shù)的原型為:
                HWND  CreateWindow(LPCTSTR lpszClassName,             //創(chuàng)建窗口,窗口類名
                         LPCTSTR lpszTitle,                     //窗口實(shí)例的標(biāo)題名
                         DWORD dwStyle,           //窗口的風(fēng)格
                         int x,   //窗口左上角坐標(biāo)
                   int y,   //窗口左上角坐標(biāo)
                         int nWidth,   //窗口的寬度
                   int nHeight,   //窗口的高度
                           HWND hwndParent,           //此窗口父窗口
                         HWENU hMenu,          //此窗口主菜單
                            HINSTANCE hInstance, //應(yīng)用程序當(dāng)前句柄
                         LPVOID lpParam);        //指向一個(gè)傳遞給窗口的參數(shù)值的指針
             */
             
             //創(chuàng)建窗口操作
             HWND hwnd; //窗口結(jié)構(gòu)
                hwnd=CreateWindow(lpszClassName,   //創(chuàng)建窗口,窗口類名
              lpszTitle,                     //窗口實(shí)例的標(biāo)題名
              WS_OVERLAPPEDWINDOW,           //窗口的風(fēng)格
              CW_USEDEFAULT,CW_USEDEFAULT,   //窗口左上角坐標(biāo)為缺省值
              CW_USEDEFAULT,CW_USEDEFAULT,   //窗口的高度和寬度為缺省值
              NULL,                          //此窗口無(wú)父窗口
              NULL,                          //此窗口無(wú)主菜單
              hInstance,                     //應(yīng)用程序當(dāng)前句柄
              NULL);                         //不使用該值

             ShowWindow(hwnd,nCmdShow);         //顯示窗口

             UpdateWindow(hwnd);                //繪制用戶區(qū)
             

                /*
              消息循環(huán)
              windows應(yīng)用程序的運(yùn)行以消息為核心。windows將產(chǎn)生的消息放入應(yīng)用程序的消息隊(duì)列中而應(yīng)用程序WinMain函數(shù)的消息循環(huán)提取消息隊(duì)列中的消息,并將其傳遞給窗口函數(shù)為相應(yīng)處理過(guò)程處理。
                MSG msg; //消息結(jié)構(gòu)

             while( GetMessage(&msg,NULL,0,0))  //消息循環(huán)
             { TranslateMessage(&msg);
               DispatchMessage(&msg);
             }
             */

             MSG msg; //消息結(jié)構(gòu)
              /*GetMessage()作用:從消息隊(duì)列中讀取一條消息,并將消息放在一個(gè)MSG結(jié)構(gòu)中:
               BOOL GetMessage(        
                    LPMSG lpMsg,  //指向MSG結(jié)構(gòu)的指針
                    HWND hWnd,
                    UINT wMsgFilterMin, //用于消息過(guò)濾的最小信息號(hào)值
                    UINT wMsgFilterMax //用于消息過(guò)濾的最大信息號(hào)值 如最小值和最大值均為0, 則不過(guò)濾消息
               );
              當(dāng)GetMessage返回0時(shí),即檢索到WM_QUIT消息,程序?qū)⒔Y(jié)束循環(huán)并退出

             BOOL TranslateMessage(  const MSG *lpMsg );  負(fù)責(zé)把消息的虛擬鍵值轉(zhuǎn)換為字符信息
             LRESULT DispatchMessage( const MSG *lpmsg  ); 將參數(shù)lpmsg指向的消息傳遞給指定的窗口

              */
             while( GetMessage(&msg,NULL,0,0))  //消息循環(huán)
             { TranslateMessage(&msg);
               DispatchMessage(&msg);
             }

             return msg.wParam;                //程序終止時(shí),將信息返回操作系統(tǒng)
            }


            //-----------------------------窗口函數(shù)---------------------------------------
            /*
            窗口消息處理函數(shù)定義了應(yīng)用程序?qū)邮盏降牟煌⒌捻憫?yīng),它包含了應(yīng)用程序?qū)Ω鞣N可用接收到的消息的處理過(guò)程,通常 ,窗口函數(shù)由一個(gè)或多個(gè)switch...case語(yǔ)句組成,每一條case語(yǔ)句
            對(duì)應(yīng)一種消息,當(dāng)應(yīng)用程序接收到一個(gè)消息時(shí),相應(yīng)的case語(yǔ)句被 激活并執(zhí)行相應(yīng)的響應(yīng)程序模塊。
            窗口函數(shù)的一般形式如下:
             LRESULT CALLBACK WindowProc(          HWND hwnd,
                UINT uMsg,
                WPARAM wParam,
                LPARAM lParam
            );
            Parameters

            hwnd :[in] Handle to the window.
            uMsg :[in] Specifies the message.
            wParam:[in] Specifies additional message information. The contents of this parameter depend on the value of the uMsg parameter.
            lParam:[in] Specifies additional message information. The contents of this parameter depend on the value of the uMsg parameter.
            Return Value 
            The return value is the result of the message processing and depends on the message sent.

            LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
            {
              switch (message)
              {
              case ...
                  ....
               break;
               .........
              case WM_DESTROY:
                 //void PostQuitMessage(int nExitCode)函數(shù)的作用是向程序發(fā)送WM_QUIT消息,nExitCode應(yīng)用程序退出代碼
                  PostQuitMessage(0); //調(diào)用該函數(shù)發(fā)出WM_QUIT消息
              default: //缺省消息處理函數(shù),以保證所的發(fā)往窗口的消息都能被處理
               return DefWindowProc(hwnd,message,wParam,lParam);
              }

              return (0);
            }

            */
            LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
            {
              switch (message)
              {
              case WM_DESTROY:
                PostQuitMessage(0); //調(diào)用該函數(shù)發(fā)出WM_QUIT消息
              default: //缺省消息處理函數(shù)
               return DefWindowProc(hwnd,message,wParam,lParam);
              }

              return (0);
            }
            /*
            注:
              事件驅(qū)動(dòng)的特點(diǎn):
              Windows程序設(shè)計(jì)圍繞著事件或消息的產(chǎn)生驅(qū)動(dòng)產(chǎn)生運(yùn)行消息處理函數(shù)。Windows程序的執(zhí)行順序取決于事件發(fā)生的順序,程序的執(zhí)行是由順序產(chǎn)生的消息驅(qū)動(dòng)的,程序員可以針對(duì)消息類型編寫消息處理程序以處理接收的消息,或者發(fā)出其他消息以驅(qū)動(dòng)其他處理程序,但是不必預(yù)先確定消息的產(chǎn)生順序。這是面向?qū)ο缶幊讨惺录?qū)動(dòng)的顯著特點(diǎn)。
              事件驅(qū)動(dòng)編程方法對(duì)于編寫交互程序很有用處,用這一方法編寫的程序使程序避免了死板的操作模式,從而使用戶能夠按照自己的意愿采用靈活多變的操作模式。
              Windows應(yīng)用程序中的消息傳遞機(jī)制:
              VC中存在幾種系統(tǒng)定義的消息分類,常用的消息由窗口消息、初始化消息、輸入消息、系統(tǒng)消息、剪切板消息、文當(dāng)界面消息、DDE(動(dòng)態(tài)數(shù)據(jù)交換)消息、應(yīng)用程序自定義消息等。應(yīng)用程序發(fā)送的消息發(fā)送至消息隊(duì)列,系統(tǒng)根據(jù)消息到達(dá)的順序?qū)ο⑦M(jìn)行處理,并調(diào)用響應(yīng)的消息處理模塊代碼。
            */

            posted on 2007-05-16 22:46 rebol 閱讀(2191) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Final work LOG
            性高朝久久久久久久久久| 少妇高潮惨叫久久久久久| 国产日产久久高清欧美一区| 99久久精品免费| 久久天天婷婷五月俺也去| 91亚洲国产成人久久精品网址| 国产成人精品久久二区二区| 无遮挡粉嫩小泬久久久久久久| 久久久久国产精品人妻| 久久久精品2019免费观看| 伊人色综合久久天天| 久久久久亚洲av综合波多野结衣| 久久久久99精品成人片直播| 亚洲成人精品久久| 色偷偷偷久久伊人大杳蕉| Xx性欧美肥妇精品久久久久久| 久久久久久伊人高潮影院 | 国内精品久久久久久久影视麻豆| 久久国产美女免费观看精品| 久久996热精品xxxx| 国产精品乱码久久久久久软件 | 亚洲国产精品无码久久久不卡| 国产激情久久久久影院| 久久不见久久见免费影院www日本| 久久久女人与动物群交毛片| 久久国产免费直播| 72种姿势欧美久久久久大黄蕉| 91精品国产综合久久精品| 2021久久精品国产99国产精品| 国产成人精品综合久久久| 亚洲午夜久久久久久久久电影网 | 久久综合亚洲欧美成人| 99久久国产亚洲综合精品| 人妻无码αv中文字幕久久琪琪布| 亚洲欧美国产精品专区久久| 久久久国产乱子伦精品作者| 婷婷久久综合九色综合98| 亚洲国产成人久久综合区| 久久精品中文字幕大胸| 国产精品久久久天天影视| 久久久久人妻一区精品 |