看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《TeaEEE (愛不趴 不愛趴)》之銘言: : 真正造成閃爍的原因在於 當你呼叫重繪動作時 : 系統會把無效區中的所有的物件依序重繪 ^^^^ 為什麼說是系統呢@@ 不是應該我自己重劃嗎? 我自己要從底部畫到上部 : 以一個簡單的重繪bmp的例子 可能的動作有 : 1. 先呼叫FillRect將底色塗掉 這位大大 您講到這個我查了一下 是不是其實有WM_PAINT訊息必定會伴隨 WM_ERASEBKGND ? 手動呼叫invalidaterect(1,2,3這參數設true)就會有這訊息? 所以我要自己攔截這訊息 並且做一些事情 : 2. 呼叫BitBlt繪出bmp圖 : 你會看到的閃爍 是先看到底色 然後再看到bmp的現象 : 要解決這個問題 必需要讓DC實際上畫的動作只作一次才是解決之道 : 可以先建立一塊memDC : 將FillRect與BitBlt的動作[畫]到memDC上 : 然後再把memDC[畫]到視窗的DC上才能避免 恩以上我目前是這樣做 所以這就是double buffering了嗎? 另外想問一下 如果我有個連續的圖檔 模擬動畫 我想法是呼叫timer 並且一直呼叫invalidaterect 來播放連續圖片 這是可行之道嗎? 不過我之前嘗試過 發現 WM_PAINT 會比WM_TIMER的優先權來的高 如果我有別的TIMER再做別的事情 好像這時會被WM_PAINT給取代掉了 變成說他就不處理TIMER或是超過expired time很久才會去做 這是正常現象嗎? 謝謝 ps. 之前寫opengl程式其實都是用glut所以不太懂他怎麼一直重劃的 (以為是WM_PAINT再呼叫invalidaterect) 看了nehe後發現他是用peekmessage而不是用getmessage 要用peekmessage的時機到底是甚麼@@ 一般好像都是用get~ 是在做遊戲才會用peek嗎? thx~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.87.64.222 ※ 編輯: QQ29 來自: 219.87.64.222 (01/13 13:40)
ADF:當你呼叫InvalidateRect系統會傳WM_PAINT到指定視窗 01/13 14:32
ADF:這時候你就攔截 WM_PAINT 訊息 呼叫你要 render fun 01/13 14:33
ADF:另外如果InvalidateRect第三個參數設成 TRUE 01/13 14:34
ADF:系統還會在傳 WM_PAINT 前 先傳一個 WM_ERASEBACKGROUND 01/13 14:35
ADF:如果你沒有阻擋 ERASEBACKGROUND 系統預設是會畫 視窗所預設 01/13 14:37
ADF:的 background color 所以這大概是你畫面會閃爍的原因.. 01/13 14:38