[英]Richedit 2.0 control ignores WParam for WM_PAINT messages?
我已經嘗試過對Richedit控件進行雙緩沖的很多問題,但是還沒有看到任何針對該特定問題的直接答案(在Microsoft擁有官方聲明的地方加引號/鏈接會非常棒)。
這是我一直用於測試的一些代碼(VCL / Delphi / Borland Builder 6.0):
if(Message.Msg == WM_PAINT)
{
HDC dc = GetDC(0);
HBITMAP memBitmap = CreateCompatibleBitmap(dc,ClientRect.Right,ClientRect.Bottom);
ReleaseDC(0,dc);
HBITMAP memDC = CreateCompatibleDC(0);
HBITMAP oldBitmap = SelectObject(memDC,memBitmap);
try{
//PAINTSTRUCT ps;
//dc = BeginPaint(Handle,&ps);
dc = GetDC(Handle);
Message.WParam = (int)memDC;
inherited::WndProc(Message);
Message.WParam = 0;
//BitBlt(dc,0,0,ClientRect.Right,ClientRect.Bottom,memDC,0,0,SRCCOPY);
ReleaseDC(Handle,dc);
//EndPaint(Handle,&ps);
} __finally
{
SelectObject(memDC,oldBitmap);
DeleteDC(memDC);
DeleteObject(memBitmap);
}
return;
}
如果我在Inherited :: WndProc()之前調用BeginPaint()(它將不知道VCL的消息傳遞給控件),則控件不會在我的內存DC或實際窗口DC上繪制任何內容。 如果我改為調用GetDC(),則該控件仍不會在內存DC上繪制,但是它會直接在窗口DC上繪制。 我通過注釋掉我的BitBlt()調用來確認這一點。如果未注釋掉,則客戶區全為黑色(這意味着控件根本沒有在內存DC上繪制),如果我注釋掉了那一行,該控件正確繪制(這意味着它點燃了WParam內存DC,並直接轉到窗口DC)。
聽起來我已經回答了自己的問題,但我真正想要的是得到他人的確認(鏈接到MS KB文章或MSDN很棒,所以我可以向老板展示:), 以及實現雙緩沖的其他可能想法。 ? 我無法使用發現的大多數技巧,例如將該控件隱藏在屏幕外或使用WM_PRINT,因為我需要此控件才能真正用於用戶輸入和滾動條,而不僅僅是顯示只讀。
另外,即使我使用的是VCL,該控件也使用RichEdit 2.0。已對其進行了修改,以將窗口創建為“ richedit20a”類。 我還確認了VCL層完全不會使繪畫混亂,因此,使用純win32代碼應該可以看到相同的行為。
我真正想要的是得到其他人的確認(鏈接到MS KB文章或MSDN很好,所以我可以向老板展示:)
明顯的位置如何: WM_PAINT
消息的文檔 ,其中明確指出
wParam中
不使用此參數。
因此,沒有理由期望修改wParam
會產生任何效果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.