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

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              117 Posts :: 2 Stories :: 61 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(8)

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

                    在“構建游戲設計的舞臺”這一隨筆中,建立的項目便是一個標準Windows API的程序架構,主程序文件“canvas.cpp”由下表中幾個重要的函數所構成:
             

            函數名稱

            說明

            WinMain

            主程序,程序起始點

            WndProc

            自定義函數,處理程序消息

            MyRegisterClass

            自定義函數,注冊窗口類別

            InitInstance

            自定義函數,建立及顯示窗口的初始化函數


            下面來說說這些函數的內容與功能。

            1.WinMain函數
                    主程序,也就是整個項目程序開始運行的地方,如同Console程序中的main()函數。

            //****主程序***********************************
            int APIENTRY WinMain(HINSTANCE hInstance,
            HINSTANCE hPrevInstance,
            LPSTR     lpCmdLine,
            int       nCmdShow)
            {
            MSG msg;
            /**********************************************************
            *              自定義函數,注冊窗口類別
            * 調用MyRegisterClass()函數,向系統注冊窗口類別,輸入參數
            * “hInstance”是目前程序運行個體的對象代碼
            *********************************************************
            */

            MyRegisterClass(hInstance);
            // 運行初始化函數,調用InitInstance()函數,進行初始化操作
            if (!InitInstance (hInstance, nCmdShow))
            {
            return FALSE;
            }

            /******************************************************************
            *                           消息循環
            * 程序通過此消息循環來獲取消息,并進行必要的鍵盤消息轉換,
            * 而后將控制權交給操作系統,由操作系統決定該由哪個程序的
            * 消息處理函數處理消息。這個循環使用了3個API函數
            * GetMessage 獲取程序消息
            * TranslateMessage 轉換偽碼及字符
            * DispatchMessage 將控制權交給系統,再由系統決定負責處理消息的程序
            *****************************************************************
            */

            while (GetMessage(&msg, NULL, 00))
            {
            TranslateMessage(
            &msg);
            DispatchMessage(
            &msg);
            }

            return msg.wParam;
            }

            2.MyRegisterClass函數    
            /*****************************************************************
             * 在建立程序窗口的實體之前,必須先定義一個窗口類別,其中包含所要
             * 建立窗口的相關信息,并向系統注冊。這里的MyRegisterClass()函數
             * 就是進行定義及注冊窗口類別的函數
             ****************************************************************
            */

            ATOM MyRegisterClass(HINSTANCE hInstance)
            {
                
            //聲明一個窗口類別“WNDCLASSEX”和結構“wcex”
                WNDCLASSEX wcex;

                
            /***************************Begin***********************************/
                
            // 定義“wcex”結構的各項信息,其中設定消息處理函數(IpfnWndProc)為
                
            // “WndProc”,類別名稱(lpszClassName)為“canvas”。
                wcex.cbSize = sizeof(WNDCLASSEX); 
                wcex.style            
            = CS_HREDRAW | CS_VREDRAW;
                
                
            // 設定消息處理函數
                wcex.lpfnWndProc    = (WNDPROC)WndProc;
                
                wcex.cbClsExtra        
            = 0;
                wcex.cbWndExtra        
            = 0;
                wcex.hInstance        
            = hInstance;
                wcex.hIcon            
            = NULL;
                wcex.hCursor        
            = NULL;
                wcex.hCursor        
            = LoadCursor(NULL, IDC_ARROW);
                wcex.hbrBackground    
            = (HBRUSH)(COLOR_WINDOW+1);
                wcex.lpszMenuName    
            = NULL;

                
            //類別名稱
                wcex.lpszClassName    = "canvas";
                
                wcex.hIconSm        
            = NULL;
                
            /****************************End************************************/

                
            // 調用RegisterClassEx()函數注冊類別,返回一個“ATOM”形態的字符串,此字符串即為類別名稱“canvas”
                return RegisterClassEx(&wcex);
            }

            3.InitInstance函數 
            // 在這一初始函數中,按照前面所定義的窗口類別來建立并顯示實際的程序窗口
            //*****初始化函數*******************************
            // 1.存儲instance handle于全局變量中
            // 2.建立并顯示主窗口
            BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
            {
                HWND hWnd;

                hInst 
            = hInstance;
                
            // 調用CreateWindow()函數來建立一個窗口對象,所輸入的第1個參數
                
            // 就是窗口建立所依據的類別名稱,也就是前面程序所定義的“canvas”
                hWnd = CreateWindow("canvas""繪圖窗口" , WS_OVERLAPPEDWINDOW,
                    CW_USEDEFAULT, 
            0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

                
            if (!hWnd)
                
            {
                    
            return FALSE;
                }


                
            // 下面三條語句,設定窗口的顯示位置及窗口大小,然后繪制在顯示設備上
                
            // 設定窗口顯示的位置及窗口大小
                MoveWindow(hWnd,10,10,600,450,true);
                
            // 設定窗口顯示時的狀態
                ShowWindow(hWnd, nCmdShow);
                
            // 將窗口繪制于顯示設備上
                UpdateWindow(hWnd);

                
            return TRUE;
            }

            4.WndPro函數 
            /********************************************************************************
             * 在前面定義類別的時候把WndPro定義為消息處理函數,也就是當某些外部消息發生時,會
             * 按照消息的類型來決定該如何進行處理。
             * 此外,WndPro函數也是一個所謂的“回調函數(CALLBACK)”,簡單地說,回調函數是屬于
             * Windows操作系統所調用的函數,而非程序本身所調用的函數,這是因為Windows是一個多任
             * 務的作業環境,在同一時刻可能會有多個程序正在運行,而當某一事件發生時,有可能每一
             * 個程序都會接受到此消息,因此系統必須去判斷該由哪個程序進行處理,然后再調用該程序
             * 的消息處理函數。
             *******************************************************************************
            */

            LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
            {
                PAINTSTRUCT ps;
                HDC hdc;

                
            // 判斷消息類型
                switch (message) 
                
            {
                    
            case WM_PAINT:                        //窗口重繪消息
                        hdc = BeginPaint(hWnd, &ps);
                        EndPaint(hWnd, 
            &ps);
                        
            break;
                    
            case WM_DESTROY:                    //窗口結束消息
                        /***********************************************************
                         * 調用PostQuitMessage()函數發送窗口結束消息給系統,通知
                         * 系統結束目前程序的運行,然后由系統處理程序結束的后續操作
                         **********************************************************
            */

                        PostQuitMessage(
            0);
                        
            break;
                    
            default:                            //其他消息
                        
            // DefWindowProc()函數調用預設的系統函數來處理程序本身不處理的消息
                        return DefWindowProc(hWnd, message, wParam, lParam);
               }

               
            return 0;
            }

            下載源代碼:canvas.rar(文件上傳在Windows live空間,可能需要有msn賬號進行登錄)


            PS:如想獲得更多關于Visual C++游戲開發的內容,可點擊隨筆:《Visual C++游戲編程基礎》學習筆記——索引隨筆
            posted on 2010-04-08 11:00 煙皚 閱讀(949) 評論(0)  編輯 收藏 引用 所屬分類: 《Visual C++游戲編程基礎》學習筆記
            一级做a爰片久久毛片看看| 久久久免费精品re6| 久久成人18免费网站| 精品久久久久国产免费| 亚洲国产精品无码久久青草| 怡红院日本一道日本久久| 国産精品久久久久久久| 欧美日韩精品久久免费| 久久久久久a亚洲欧洲aⅴ| 四虎影视久久久免费观看| 国产美女久久精品香蕉69| 日本精品久久久久久久久免费| 久久亚洲欧美国产精品| 国产亚州精品女人久久久久久 | 蜜臀久久99精品久久久久久小说| 久久精品免费观看| 亚洲精品午夜国产VA久久成人| 一本伊大人香蕉久久网手机| 久久99精品久久久大学生| 久久精品国产99久久丝袜| 国产精品九九九久久九九| 思思久久99热只有频精品66| 国内精品久久久久| 久久亚洲美女精品国产精品| 国产一区二区久久久| 久久国产热这里只有精品| 久久精品国产福利国产秒| 久久国产精品一国产精品金尊| 中文字幕无码久久人妻| 人妻中文久久久久| 亚洲欧美另类日本久久国产真实乱对白| 国产精品久久自在自线观看| 国产精品无码久久综合 | 欧美久久精品一级c片片| 久久精品国产亚洲AV嫖农村妇女| 久久人人爽人人爽人人爽| 久久久久久精品无码人妻| 久久亚洲AV无码精品色午夜麻豆| 香蕉久久影院| 7777久久久国产精品消防器材| 久久综合视频网|