簡體   English   中英

Richedit 2.0控件忽略WParam的WM_PAINT消息嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM