看板 C_and_CPP 關於我們 聯絡資訊
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