![]() |
C++ WndProc Funktion in Delphi übersetzen
Hallo,
Ich habe mir diese WndProc in C++ angeschaut: ![]() Diese Funktion bewirkt, dass das Flickern beim Wechseln von maximierten MDI Fenstern aufhört.
Code:
Leider habe ich nicht genügend MFC bzw. C++ Kenntnisse, um den Code vernünftig übersetzen.
LRESULT CChildFrame::WindowProc(UINT message,
WPARAM wParam, LPARAM lParam) { if(message==WM_NCPAINT || message==WM_SIZE) { BOOL bMax; CMDIFrameWnd* pParentFrame = (CMDIFrameWnd*)GetParentFrame(); if(pParentFrame) { CMDIChildWnd* pChildFrame = pParentFrame->MDIGetActive(&bMax); if(bMax) { if(message==WM_NCPAINT) // non client area return 0; if(message==WM_SIZE) // client area { if(wParam==SIZE_MAXIMIZED && pChildFrame==this) // active and maximized return CMDIChildWnd::WindowProc(message, wParam, lParam); SetRedraw(FALSE); LRESULT ret = CMDIChildWnd::WindowProc(message, wParam, lParam); SetRedraw(); return ret; } } } } return CMDIChildWnd::WindowProc(message, wParam, lParam); } Das habe ich "übersetzt", es funktioniert jedoch nicht korrekt (der NC Bereich wird gar nicht gezeichnet und beim Wiederherstellen wird auch nicht korrekt gezeichnet):
Delphi-Quellcode:
Kann mir jemand auf die Sprünge helfen?
procedure TMDIChild.WndProc(var Msg: TMessage);
var Max: Boolean; Parent: TForm; MDI : TForm; begin if (Msg.Msg = WM_NCPAINT) or (Msg.Msg = WM_SIZE) then begin Parent := Application.MainForm; // ParentFrame gibt es in Delphi nicht, nehme einfach den MDI Parent MDI := Parent.ActiveMDIChild; // Aktives MDI Child if MDI = nil then begin inherited WndProc(Msg); Exit; end; Max := MDI.WindowState = wsMaximized; // = pParentFrame->MDIGetActive(&bMax); ? if Max then begin case msg.Msg of WM_NCPAINT: Msg.Result := 0; WM_SIZE: begin if ((msg.WParam = SIZE_MAXIMIZED) or (msg.WParam = SIZE_RESTORED)) and (MDI = Self) then // pChildFrame==this ? begin inherited WndProc(Msg); Exit; end; SendMessage(Handle, WM_SETREDRAW, Integer(False), 0); inherited WndProc(Msg); SendMessage(Handle, WM_SETREDRAW, Integer(True), 0); end; end; end; end else inherited WndProc(Msg); end; mfG mirage228 [edit]Als "Offene Frage" markiert.[/edit] |
Re: C++ WndProc Funktion in Delphi übersetzen
Ganz so einfach kommst du da auch nicht weg. Soweit ich den urspr. Code verstehe, ist es eine spezifische MFC-Lösung. Die ist nicht einfach übertragbar, weil du nämlich nicht die anderen ("unsichtbaren") Eigenschaften des MFC-Frameworks hast.
|
Re: C++ WndProc Funktion in Delphi übersetzen
Hast Du es schon mal mit
![]() |
Re: C++ WndProc Funktion in Delphi übersetzen
Hi,
Danke für eure Antworten. Schade, dass sich das nicht so einfach übertragen lässt, ich schaue, wie ich dieses Problem dennoch lösen kann. Was wäre denn der Unterschied von LockWindowUpdate() zu WM_SETREDRAW. Im Prinzip dürfte es bei dem Code ohnehin keinen Unterschied machen, da das Zeichnen während des Aufrufs eh verhindert wird. Ich glaube aber, dass ich die ganze Struktur nochmal umarbeiten muss, da sich das ganze ja auf MFC spezifische Dinge stütz. Falls einer von euch noch eine Idee zur Umsetzung hat, immer nur her damit :) mfG mirage228 |
Re: C++ WndProc Funktion in Delphi übersetzen
Hi, hast Du mal ein Beispiel, wo das Flickern besonders heftig auftritt ? Ich habe festgestellt (mit einer neuen leeren MDIApp), dass die Fenster nur dann Flimmern, wenn man über das Window-Menü umschaltet. Wird Strg-F6 verwendet, so flimmert nichts.
|
Re: C++ WndProc Funktion in Delphi übersetzen
Zitat:
Zitat:
Wechsele ich per F6 trit kein Flickern auf. Nun würde mich interessieren, wie ich das auch per Code machen, so wie es Windows macht... mfG mirage228 |
Re: C++ WndProc Funktion in Delphi übersetzen
Jetz flimmert es bei mir nicht mehr:
Delphi-Quellcode:
Und so schaltest Du zum nächsten Fenster um:
procedure TMDIChild.FormCreate(Sender: TObject);
var AStyle : integer; begin AStyle := GetWindowLong(Handle, GWL_EXSTYLE); SetWindowLong(Handle, GWL_EXSTYLE, AStyle or WS_CLIPCHILDREN); end;
Delphi-Quellcode:
procedure TMainForm.WindowNextExecute(Sender: TObject);
begin SendMessage(ClientHandle, WM_MDINEXT, 0, 0); end; |
Re: C++ WndProc Funktion in Delphi übersetzen
Hi,
Also beim ersten Code ist bei mir weiterhin ein flimmern zu erkennen, auch wenn es nicht mehr so deutlich ist... Der zweite Code funktioniert korrekt, jedoch kann ich damit kein beliebiges Fenster aktivieren. Mit diesem Code funktioniert es bei mir auch manuell:
Delphi-Quellcode:
Ich schaue aber noch, ob man es auch anders lösen könnte.
LockWindowUpdate(Self.Handle);
MdiChildren[i].BringToFront; MdiChildren[i].SetFocus; LockWindowUpdate(0); mfG mirage228 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz