windows SDK模擬遊戲鋼琴的實現(二)

2022-09-17 10:21:11 字數 1260 閱讀 3715

昨天晚上失眠了,於是一直在想實現gdi的乙個效果:首先繪製10個相連的矩形,當滑鼠移到某個矩形的時候,自動填充那個矩形的背景顏色為灰色,移開的時候恢復原來的白色。當只有乙個矩形的時候,當然不是一件難事。但是當有10個矩形的時候,問題就產生了。首先先看一下**:

下面來看乙個這個處理滑鼠移動的操作:

一執行問題就來了:只有當滑鼠移到第乙個矩形的時候才會產生效果,而移到後面9個的時候根本沒有產生任何效果!!

我把上面for 迴圈的 初始條件的i=0  改成  i=1,這下子更加糟糕了:連第乙個矩形都不能產生效果了。看來問題就是在這裡了。

那麼為什麼會不起作用呢?

向華哥請教後,終於發現端倪了:

我是什麼時候把刷子的控制代碼選入裝置環境裡面的呢? 就是上面的當  flag[i] == 1 的時候 ,一旦選入了以後,那麼後面所有的矩形繪製的時候用的都是灰色的刷子。

所以首先在wm_paint訊息裡面 新增選擇刷子的訊息:

for (i = 1; i if (flag[i] == 1)                              

selectobject(hdc, hbrush); 

rect[i].xleft    = rect[i-1].xleft  + 20   ;

rect[i].xright   = rect[i-1].xright + 20   ;

rect[i].ytop     = rect[0].ytop            ;

rect[i].ybottom  = rect[0].ybottom         ;

rectangle(hdc, rect[i].xleft, rect[i].ytop, rect[i].xright, rect[i].ybottom);

}但是麻煩又來了:如果第i個是灰色的,那麼從第i+1個開始後面的所有矩形都變成灰色的了由於傳送了10條重繪訊息,說明滑鼠移動到某個點的時候整個螢幕重新整理了10次!!相當於10個矩形總共畫了10次!!現在問題應該很明顯了:重新繪製出來的視窗把原來的視窗效果給覆蓋掉了,如果說原來第i次第i個矩形是灰色的,那麼第i+1次的時候又被覆蓋成白色的了!!!

而且我的i設定的時候不是全域性變數,所以每乙個進入vm_paint訊息的時候i都是0

好了,錯誤發現以後,我們就可以改正了。首先是邏輯上的修正:

每次重新繪製整個視窗的時候都先把10個矩形畫出來,然後在根據滑鼠移動傳過來的資訊判斷哪乙個矩形應該被重畫。

邏輯清楚了以後,寫起來就簡單了。

我把(一)中的聲音效果再加進來,再新增滑鼠左鍵點選發出聲音,最終的**如下:

windows SDK模擬遊戲鋼琴的實現 一

最近想做乙個模擬鋼琴的小軟體,想做個既有鍵盤介面又有滑鼠介面的小軟體。所涉及到的知識點如下 1.有關鍵盤的知識 2.有關滑鼠的知識 3.gdi的知識 因為這幾天也正好在看這些內容,所以理論結合實際是最好的學習方式 首先要找鋼琴音階,但是上網找了一圈也沒有發現,最後在4399裡面找到乙個差不多態別的模...

戰棋遊戲 遊戲模擬 spfa

題解 模擬啊模擬 近幾年複賽喜歡出的模擬題qaq 死掉的角色必須將其所有資訊清空好,以免干擾後續行動 圖上的點相當於有點權,必須用spfa而非廣搜 spfa時記得判斷移動力清零情況及邊界問題 c 讀入時要格外小心,聽說好多god直接用讀入優化,我就默默寫了個長長的讀入qaq 如果某角色移動前後位置不...

模擬 轉圈遊戲

題目描述 n 個小夥伴 編號從 0 到 n 1 圍坐一圈玩遊戲。按照順時針方向給 n 個位置編號,從0 到 n 1。最初,第 0 號小夥伴在第 0 號位置,第 1 號小夥伴在第 1 號位置,依此類推。遊戲規則如下 每一輪第 0 號位置上的小夥伴順時針走到第 m 號位置,第 1 號位置小夥伴走到第 m...