• <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++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              117 Posts :: 2 Stories :: 61 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(8)

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

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

            函數(shù)名稱

            說明

            WinMain

            主程序,程序起始點

            WndProc

            自定義函數(shù),處理程序消息

            MyRegisterClass

            自定義函數(shù),注冊窗口類別

            InitInstance

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


            下面來說說這些函數(shù)的內(nèi)容與功能。

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

            //****主程序***********************************
            int APIENTRY WinMain(HINSTANCE hInstance,
            HINSTANCE hPrevInstance,
            LPSTR     lpCmdLine,
            int       nCmdShow)
            {
            MSG msg;
            /**********************************************************
            *              自定義函數(shù),注冊窗口類別
            * 調(diào)用MyRegisterClass()函數(shù),向系統(tǒng)注冊窗口類別,輸入?yún)?shù)
            * “hInstance”是目前程序運行個體的對象代碼
            *********************************************************
            */

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

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

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

            return msg.wParam;
            }

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

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

                
            /***************************Begin***********************************/
                
            // 定義“wcex”結(jié)構(gòu)的各項信息,其中設(shè)定消息處理函數(shù)(IpfnWndProc)為
                
            // “WndProc”,類別名稱(lpszClassName)為“canvas”。
                wcex.cbSize = sizeof(WNDCLASSEX); 
                wcex.style            
            = CS_HREDRAW | CS_VREDRAW;
                
                
            // 設(shè)定消息處理函數(shù)
                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************************************/

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

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

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

                
            if (!hWnd)
                
            {
                    
            return FALSE;
                }


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

                
            return TRUE;
            }

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

            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:                    //窗口結(jié)束消息
                        /***********************************************************
                         * 調(diào)用PostQuitMessage()函數(shù)發(fā)送窗口結(jié)束消息給系統(tǒng),通知
                         * 系統(tǒng)結(jié)束目前程序的運行,然后由系統(tǒng)處理程序結(jié)束的后續(xù)操作
                         **********************************************************
            */

                        PostQuitMessage(
            0);
                        
            break;
                    
            default:                            //其他消息
                        
            // DefWindowProc()函數(shù)調(diào)用預(yù)設(shè)的系統(tǒng)函數(shù)來處理程序本身不處理的消息
                        return DefWindowProc(hWnd, message, wParam, lParam);
               }

               
            return 0;
            }

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


            PS:如想獲得更多關(guān)于Visual C++游戲開發(fā)的內(nèi)容,可點擊隨筆:《Visual C++游戲編程基礎(chǔ)》學(xué)習(xí)筆記——索引隨筆
            狠狠色噜噜狠狠狠狠狠色综合久久| 亚洲精品国产成人99久久| 欧美一区二区久久精品| 欧美大香线蕉线伊人久久| 日本免费久久久久久久网站| 欧美日韩成人精品久久久免费看 | 久久精品无码一区二区三区免费| 久久久久国产一级毛片高清板| 亚洲午夜久久久久久久久电影网 | 久久只有这里有精品4| 久久国产免费观看精品3| 久久男人AV资源网站| 日产精品久久久久久久性色| 久久久久国产精品三级网| 成人综合伊人五月婷久久| 一本色道久久综合| 久久福利青草精品资源站| 亚洲精品乱码久久久久久按摩| 国产日韩久久久精品影院首页| 少妇久久久久久被弄高潮| 99久久精品免费看国产| 久久久噜噜噜www成人网| 久久经典免费视频| 精品久久久久久无码中文野结衣 | 色婷婷久久综合中文久久一本| 99久久精品国产麻豆| 亚洲中文字幕无码一久久区| 久久久久亚洲AV无码去区首| 久久精品国产半推半就| 久久精品午夜一区二区福利 | 久久久久国产一区二区三区| 天天综合久久久网| 国产三级久久久精品麻豆三级 | 久久婷婷国产综合精品| 久久天天躁狠狠躁夜夜2020一| 久久久久九九精品影院| 国内精品久久久久久久久| 97久久精品人人澡人人爽| 久久99精品国产麻豆宅宅 | 亚洲国产天堂久久久久久| 国产精品VIDEOSSEX久久发布|