1. 程式人生 > >win32遊戲開發(1)--滑鼠鍵盤響應圖示繪圖

win32遊戲開發(1)--滑鼠鍵盤響應圖示繪圖

實驗專案名稱

Windows視窗生成及基本事件處理

實驗目的

Windows遊戲以視窗為基礎,學習Windows遊戲程式設計,首先需要了解視窗的生成機制及基本框架程式碼。其次,為了讓視窗響應滑鼠及鍵盤等基本事件,需要了解並掌握如何為視窗新增相應的訊息處理程式碼。

實驗任務

根據課堂講解的理論知識和所提供的基本程式碼框架的基礎上完成如下任務: 1.生成一個基本的Windows視窗程式,要求使用Win32 Application型別; 2.為基本視窗程式增加自繪圖示,並將圖示應用於程式; 3.為基本視窗程式進一步新增滑鼠訊息和訊息處理程式碼,做到點選滑鼠左鍵時在視窗的滑鼠位置繪製一個圖示圖案,拖動滑鼠時能夠連續繪製圖標圖案; 4.在以上程式的基礎上,新增鍵盤處理訊息和相應的處理程式碼,做到按下鍵盤的上、下、左、右鍵時能夠朝相應的方向連續繪製圖標圖案;如果按下滑鼠左鍵,再按下上、下、左、右方向鍵時,能夠以滑鼠位置為出發點,朝相應的方向連續繪製圖標圖案。

實驗步驟

1.建立win32 application程式,專案名:test2paint. 2.往資原始檔新增游標檔案,圖示檔案 3.對訊息處理函式進行修改,這一步很關鍵,首先明確繪圖思路,為了防止圖片重繪丟失,我使用一個記憶體相容DC與一個相容點陣圖進行關聯,然後使用DrawIcon()將圖示繪如記憶體相容DC,在執行WM_PAINT時使用bitblt()將記憶體相容DC的內容繪到視窗dc中,核心程式碼如下: 進行必要的全域性變數宣告: 全域性變數圖 對於記憶體相容DC與點陣圖的關聯操作,只需要進行一次就好了,因此我將它寫在了InitInstance()函式中: 在這裡插入圖片描述

既然要修改程式圖示,在匯入了圖示資源的情況下,就應該去修改 MyRegisterClass()的對應屬性: 在這裡插入圖片描述

我們的程式既要響應滑鼠點選(WM_LBUTTONDOWN),又要響應滑鼠拖拽(WM_MOUSEMOVE),還要響應按鍵(WM_KEYDOWN),因此就有了如下程式碼: 在這裡插入圖片描述

在這裡插入圖片描述 在這裡插入圖片描述 接著,只要在WM_PAINT呼叫bitblt()就不會丟失影象了 在這裡插入圖片描述 但是還有一個問題,當我放大視窗時,由於與記憶體相容DC關聯的點陣圖大小是原視窗大小,因此在視窗最大化的情況下對非原視窗部分畫圖是無效的,這裡有兩種處理方法,一種就是改解析度,一種就是改點陣圖大小,我用的是後者,因此我在WM_SIZE寫了如下程式碼: 在這裡插入圖片描述

實驗資料及處理結果

對程式進行執行: 在這裡插入圖片描述 不論是按方向鍵,滑鼠單擊或拖拽都能繪圖,移動至邊界或放大視窗也不會導致影象丟失,我覺得把這些粘貼出來沒有意義,就不貼上了,因為這些功能只有視訊能體現,貼圖是體現不出來的.

實驗後的思考

在本次實驗中,遇到了很多的問題,好多問題都被我解決了,但還有一些困惑我的問題存在,而且我覺得不得不提. 第一個問題便是當我在WM_PAINT呼叫bitble()繪圖時,原始碼是這樣的: 在這裡插入圖片描述 這時候執行程式我發現畫不出圖,我是這麼理解的,每當呼叫WM_PAINT時都會產生一個新的hdc,導致bitble一直畫在新的視窗控制代碼中而無法將記憶體相容DC的內容全部畫出,於是我將程式碼改成這樣: 在這裡插入圖片描述 執行後發現可以畫圖了,但是百度後沒有發現有哪個論壇是明確給出答案的,所以不知道我理解的對不對. 第二個問題是如果這裡我不是用DrawIcon()而是全部換成bitblt()繪圖,那還需要一個記憶體相容dc與loadbitmap()後的點陣圖關聯,但是嘗試後發現視窗會變成黑色且畫不出圖.想不到解決方法我只好改回DrawIcon()了.

專案原始碼下載