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


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

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

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

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

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

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


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

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

             */

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

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

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

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

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

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

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

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

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

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


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

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

            posted on 2007-05-16 22:46 rebol 閱讀(2182) 評論(0)  編輯 收藏 引用 所屬分類: Final work LOG
            狠狠狠色丁香婷婷综合久久五月| 精品精品国产自在久久高清| 久久综合一区二区无码| 欧洲国产伦久久久久久久| 久久久久亚洲国产| 国产精品无码久久综合| 久久99精品久久久久久齐齐| 久久九九久精品国产免费直播| 久久久久亚洲av无码专区| 欧美日韩成人精品久久久免费看| 久久精品国产亚洲AV不卡| 熟妇人妻久久中文字幕| 久久无码AV中文出轨人妻| 国产精品久久久久9999高清| 午夜精品久久久久久影视riav| 久久精品国产免费一区| 一本久久知道综合久久| 久久婷婷五月综合成人D啪| 91久久婷婷国产综合精品青草| 精品久久久久久无码不卡| 亚洲伊人久久大香线蕉苏妲己| 亚洲va久久久噜噜噜久久| 中文字幕精品无码久久久久久3D日动漫 | 久久精品这里只有精99品| 久久综合88熟人妻| 亚洲伊人久久精品影院| 久久综合给合综合久久| 精品欧美一区二区三区久久久 | 久久国产热精品波多野结衣AV| 理论片午午伦夜理片久久 | 丁香五月综合久久激情| 99国产精品久久| 97久久国产亚洲精品超碰热| 久久夜色精品国产噜噜麻豆| 亚洲AV无码久久精品成人| 久久久久久亚洲精品影院| 日韩美女18网站久久精品| 久久婷婷色综合一区二区| 久久久久亚洲av毛片大| 污污内射久久一区二区欧美日韩| 精品久久人人爽天天玩人人妻|