• <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 煙皚 閱讀(957) 評論(0)  編輯 收藏 引用 所屬分類: 《Visual C++游戲編程基礎》學習筆記
            久久精品午夜一区二区福利| 久久丫精品国产亚洲av| 久久99精品国产99久久6男男| 99久久精品国产高清一区二区| 久久中文娱乐网| 欧美精品丝袜久久久中文字幕 | 久久国产色av免费看| 久久精品无码一区二区无码| 99久久精品九九亚洲精品| 久久久久国产一区二区三区| 伊人久久大香线蕉av一区| 91亚洲国产成人久久精品网址| 中文字幕无码久久精品青草 | 国产69精品久久久久99尤物| 武侠古典久久婷婷狼人伊人| 国产精品久久久久久福利漫画| 内射无码专区久久亚洲| 精品精品国产自在久久高清| 一本色综合久久| 91久久香蕉国产熟女线看| 久久丫精品国产亚洲av不卡| 午夜视频久久久久一区 | 久久夜色撩人精品国产| 国产精品久久久久久福利漫画| 狠狠色丁香婷婷久久综合五月| 久久综合综合久久狠狠狠97色88| 久久午夜夜伦鲁鲁片免费无码影视| 亚洲色欲久久久久综合网| 亚洲va久久久噜噜噜久久| 亚洲国产精品综合久久网络| 久久久女人与动物群交毛片 | 国内精品伊人久久久久av一坑| 怡红院日本一道日本久久| 狠狠色狠狠色综合久久| 亚洲精品综合久久| 久久伊人亚洲AV无码网站| 久久乐国产精品亚洲综合| 国产成人久久久精品二区三区| 777久久精品一区二区三区无码| 国产欧美久久久精品| 久久综合久久久|