→ yoll522:可是為什麼背景重置,跟直接把背景畫在畫布上05/05 16:33
→ yoll522:後者就不會閃爍呢?05/05 16:34
原本按下方向鍵後會觸發下行程式
InvalidateRect(hwnd, NULL, TRUE);
這會強制將整個視窗客戶區填滿背景顏色,以這個例子來說,
螢幕上的此視窗客戶驅,首先會變成一片灰,接著才進入 WM_PAINT 的處理函數,也就是
你自己寫的 draw(...) 函數內,將影像 peo.png 繪到螢幕上。
換言之,在 peo.png 最終顯示的區域,會有多餘灰色先行顯示,然後才輪到 peo.png 去
呈現,因此改成下一行
InvalidateRect(hwnd, NULL, FALSE);
則填滿灰色的步驟就會被關閉。
>Bitmap CacheImage( 1024, 768, image->GetPixelFormat() );
>Graphics CacheGraphics( &CacheImage );
>SolidBrush sbr(Color(128, 128, 128));
>CacheGraphics.FillRectangle(&sbr, 0, 0, 1024, 768);
>第二行的那個第三個參數,請問那個是什麼意思@@?
使得 CacheImage 這個 1024 X 768 大小的影像,其位元深度 (Bits Per Pixel) 會依照
原本的 peo.png 的 BPP 一樣。
你可以強制改成 PixelFormat1bppIndexed 則該圖像會被轉換成每個像素只有一位元,
畫面上不是黑色就是白色。
>第四行我沒猜錯的話應該是創一個變數叫sbr,它的背景顏色為參數所給的
>然後第五行的第一個參數就是先把sbr的顏色填滿,填的大小為後面的四個參數大小嚕?
>這樣做的意思是不是因為使用InvalidateRect第三個參數設定false
>不要讓背景重置,而是改用把背景的顏色直接畫在畫布上
CacheImage 這張影像的內容,你可以存檔成一個影像,比如叫 new_peo.png
也可以像這個例子一樣,作為 Gdiplus::Graphics::DrawImage 這個函數的參數,
使該影像顯示到螢幕上的視窗客戶區內。
所以首先要將 CacheImage 的內容畫好,才能送給 DrawImage() 函數處理。
繪畫的步驟就是先將像填滿灰色,然後再將 peo.png 的內容貼上去。
那因為 CacheImage 物件裡面沒有繪圖的函數,所以這裡是利用
Gdiplus::Graphics::FillRectangle() 函數,指定畫一個 1024X768 的灰色矩形。
去查 MSDN 有上述函數範例:
http://msdn.microsoft.com/en-us/library/ms533859.aspx
所以最終寫成
SolidBrush sbr(Color(128, 128, 128));
CacheGraphics.FillRectangle(&sbr, 0, 0, 1024, 768);
其中 Color(128, 128, 128) 就是 RGB 亮度各半,最終呈現灰色。
至於要把 peo.png 畫到 CacheImage 上面,還是一樣概念,最終透過
Gdiplus::Graphics::DrawImage() 函數達成。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 124.8.133.11
推 yoll522:好詳細的解說,我大概全懂了,非常謝謝你的幫忙 05/05 22:19
推 yoll522:請問一下,GetPixelFormat()就是說取得那張圖它的位元的 05/05 22:27
→ yoll522:深度,這樣才不會造成匯出來的圖,跟讀檔的圖深度不同嗎? 05/05 22:27
→ yoll522:繪* 05/05 22:28
→ purpose:嗯...不知道 BPP 是什麼就不要管他就好了 05/05 23:06
推 yoll522:了解,等下次有機會我再問一下老師看看。謝謝你 05/05 23:10