Einzelnen Beitrag anzeigen

Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#1

C++ WndProc Funktion in Delphi übersetzen

  Alt 6. Sep 2005, 16:59
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]
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat