• <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應用程序框架主要由"初始化窗口類","窗口注冊類","窗口的創建"以"窗口消息函數"等組成*/
            #include "stdafx.h"


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

            /*
              WinMain函數是所有windows應用程序的入口,類似于C語言中的Main函數,其功能是完成一系列的定義和初始化工作,并產生消息循環。消息循環是整個程序運行的核心。WinMain函數實現以下功能。
              1. 注冊窗口類,建立窗口及執行其它必要的初始化工作;
              2. 進入消息循環,根據從應用程序消息隊列接受的消息,調用相應的處理過程
              3. 當消息循環檢索到WM_QUIT消息時終止程序運行。

              WinMain函數有三個基本的組成部份:函數說明、初始化和消息循環。

             WinMain函數的說明如下:
             int WINAPI WinMain(  //WinMain函數說明
                         HINSTANCE hInstance, //程序當前實例句柄       
                         HINSTANCE hPrevInstance,  //應用程序其它實例句柄
                         LPSTR     lpCmdLine, //指向程序命令行參數的指針
                         int   nCmdShow  //應用程序開始執行時窗口顯示方式的整數值標識
            )
                  由于Window操作系統是多任務的操作系統,能進行多任務的管理,因此,windows應用程序可能被并行的多次執行,因而可能出現同一個程序的多個窗口同時存在的情況,Windows系統將應用程序每一次執行稱為該應用程序的一個實例(Instance),并用一個實例句柄唯一的標識它。

            */
            int APIENTRY WinMain(HINSTANCE hInstance,           //WinMain函數說明
                                 HINSTANCE hPrevInstance,
                                 LPSTR     lpCmdLine,
                                 int       nCmdShow)
            {
              // TODO: Place code here.
             /*
             建議采用Pascal的變量定義風格,即在程序(函數)開始處定義所有變量
             雖然C++的變量定義比較靈活,本程序為了使程序易于理解,未采用這種方法
             */
               
             char lpszClassName[]="窗口";       //窗口類名
             char lpszTitle[]="Windows SDK編程之一  窗口示例程序";   //窗口標題名

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


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

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

             */

             wndclass.lpszMenuName=NULL;                                    //窗口中無菜單
             wndclass.lpszClassName=lpszClassName;                          //窗口類名為'窗口實例'

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

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

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

                /*
              消息循環
              windows應用程序的運行以消息為核心。windows將產生的消息放入應用程序的消息隊列中而應用程序WinMain函數的消息循環提取消息隊列中的消息,并將其傳遞給窗口函數為相應處理過程處理。
                MSG msg; //消息結構

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

             MSG msg; //消息結構
              /*GetMessage()作用:從消息隊列中讀取一條消息,并將消息放在一個MSG結構中:
               BOOL GetMessage(        
                    LPMSG lpMsg,  //指向MSG結構的指針
                    HWND hWnd,
                    UINT wMsgFilterMin, //用于消息過濾的最小信息號值
                    UINT wMsgFilterMax //用于消息過濾的最大信息號值 如最小值和最大值均為0, 則不過濾消息
               );
              當GetMessage返回0時,即檢索到WM_QUIT消息,程序將結束循環并退出

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

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

             return msg.wParam;                //程序終止時,將信息返回操作系統
            }


            //-----------------------------窗口函數---------------------------------------
            /*
            窗口消息處理函數定義了應用程序對接收到的不同消息的響應,它包含了應用程序對各種可用接收到的消息的處理過程,通常 ,窗口函數由一個或多個switch...case語句組成,每一條case語句
            對應一種消息,當應用程序接收到一個消息時,相應的case語句被 激活并執行相應的響應程序模塊。
            窗口函數的一般形式如下:
             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)函數的作用是向程序發送WM_QUIT消息,nExitCode應用程序退出代碼
                  PostQuitMessage(0); //調用該函數發出WM_QUIT消息
              default: //缺省消息處理函數,以保證所的發往窗口的消息都能被處理
               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); //調用該函數發出WM_QUIT消息
              default: //缺省消息處理函數
               return DefWindowProc(hwnd,message,wParam,lParam);
              }

              return (0);
            }
            /*
            注:
              事件驅動的特點:
              Windows程序設計圍繞著事件或消息的產生驅動產生運行消息處理函數。Windows程序的執行順序取決于事件發生的順序,程序的執行是由順序產生的消息驅動的,程序員可以針對消息類型編寫消息處理程序以處理接收的消息,或者發出其他消息以驅動其他處理程序,但是不必預先確定消息的產生順序。這是面向對象編程中事件驅動的顯著特點。
              事件驅動編程方法對于編寫交互程序很有用處,用這一方法編寫的程序使程序避免了死板的操作模式,從而使用戶能夠按照自己的意愿采用靈活多變的操作模式。
              Windows應用程序中的消息傳遞機制:
              VC中存在幾種系統定義的消息分類,常用的消息由窗口消息、初始化消息、輸入消息、系統消息、剪切板消息、文當界面消息、DDE(動態數據交換)消息、應用程序自定義消息等。應用程序發送的消息發送至消息隊列,系統根據消息到達的順序對消息進行處理,并調用響應的消息處理模塊代碼。
            */

            posted on 2007-05-16 22:46 rebol 閱讀(2176) 評論(0)  編輯 收藏 引用 所屬分類: Final work LOG
            99久久这里只精品国产免费| 久久精品无码一区二区WWW| 亚洲AV无码一区东京热久久| 色欲久久久天天天综合网精品| 久久精品国产第一区二区三区| 精品久久久久久综合日本| 激情综合色综合久久综合| 日批日出水久久亚洲精品tv| 久久91精品国产91久| 久久精品亚洲一区二区三区浴池| 国产精品久久久久久久久| 伊人久久大香线焦综合四虎| 99久久免费只有精品国产| 伊人久久大香线蕉综合5g| 久久电影网2021| 影音先锋女人AV鲁色资源网久久| 九九99精品久久久久久| 麻豆AV一区二区三区久久| 久久精品亚洲乱码伦伦中文| 成人妇女免费播放久久久| 午夜精品久久久久| 久久人人超碰精品CAOPOREN| 久久精品国产福利国产秒| 久久久久国产精品嫩草影院| 久久99国产精品成人欧美| 2020最新久久久视精品爱| 久久天天躁狠狠躁夜夜网站| 2019久久久高清456| 四虎亚洲国产成人久久精品| 精品久久久无码中文字幕| 狠狠综合久久综合中文88| 国产一久久香蕉国产线看观看| 亚洲精品美女久久777777| 亚洲精品WWW久久久久久| 成人精品一区二区久久| 国产午夜精品久久久久免费视| 欧美精品乱码99久久蜜桃| 思思久久好好热精品国产| 久久国产亚洲精品| 国产精品久久久香蕉| 久久精品国产亚洲AV影院|