Hallo,
Ich habe mir diese WndProc in C++ angeschaut:
http://www.codeproject.com/buglist/MDIFlick.asp
Diese Funktion bewirkt, dass das Flickern beim Wechseln von maximierten
MDI Fenstern aufhört.
Code:
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);
}
Leider habe ich nicht genügend MFC bzw. C++ Kenntnisse, um den Code vernünftig übersetzen.
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:
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;
Kann mir jemand auf die Sprünge helfen?
mfG
mirage228
[edit]Als "Offene Frage" markiert.[/edit]