Re: [問題] 直接對程式發送SendMessage(WM_PAINT)新
→
05/05 16:33,
05/05 16:33
→
05/05 16:34,
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
推
05/05 22:19, , 1F
05/05 22:19, 1F
推
05/05 22:27, , 2F
05/05 22:27, 2F
→
05/05 22:27, , 3F
05/05 22:27, 3F
→
05/05 22:28, , 4F
05/05 22:28, 4F
→
05/05 23:06, , 5F
05/05 23:06, 5F
推
05/05 23:10, , 6F
05/05 23:10, 6F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 4 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章