Frage

Ich versuche, meine Kontrolle über das Outlook Mailgrid mit SetParent und Resize (Movewindow) und ungültig macht es zu setzen, wenn die Mailgrid geändert.

Dies funktioniert, aber auf die Größe der Steuerung beginnt das Flimmern.

Meine Kontroll ist ein Ersatz von Outlook Mailgrid. Um die mailpreview zu ändern i ändern, nur die Auswahl des ursprünglichen mailgrid über meine Kontrolle.

Die Eltern meiner Kontrolle ist das Outlook-Hauptfenster. Ich habe bereits versucht, das Mailgrid Fenster zu schließen, aber das hat nicht geholfen.

Das Flimmern stoppt, wenn ich die die Mailgrid als Elternteil festgelegt, aber in diesem Fall flackert es, wenn ich die getroffene Auswahl zu ändern, und es ist nicht möglich, meine Kontrolle über die mailsearch-Fenster zu ziehen.

Weiß jemand, wie man die extrem Flimmern zu stoppen?

Klasse Handle Änderungen von Outlook Mailgrid Nachrichten

sealed class SubWindow : NativeWindow
{

    public event EventHandler Changed;

    protected override void WndProc(ref Message m)
    {                
        if (m.Msg == (int)(NativEnums.WindowMessage.WM_SIZE) ||
            m.Msg == (int)(NativEnums.WindowMessage.WM_WINDOWPOSCHANGED) ||
            m.Msg == (int)(NativEnums.WindowMessage.WM_WINDOWPOSCHANGING) ||
            m.Msg == (int)(NativEnums.WindowMessage.WM_ERASEBKGND) ||
            m.Msg == (int)(NativEnums.WindowMessage.WM_NCHITTEST) ||
            m.Msg == (int)(NativEnums.WindowMessage.WM_NCCALCSIZE) ||
            m.Msg == (int)(NativEnums.WindowMessage.WM_PAINT) ||
            m.Msg == (int)(NativEnums.WindowMessage.WM_NCPAINT) ||
            m.Msg == (int)(NativEnums.WindowMessage.WM_PRINT) ||
            m.Msg == (int)(NativEnums.WindowMessage.WM_PRINTCLIENT) ||
            m.Msg == (int)(NativEnums.WindowMessage.WM_SETREDRAW) ||
            m.Msg == (int)(NativEnums.WindowMessage.WM_MOVE)
            )
        {
            OnChanged();
        }               

        base.WndProc(ref m);
        //I have already tried to ignore wm_paint, but it still painted
        //if (m.Msg != (int)NativEnums.WindowMessage.WM_PAINT)
        //{
        //  base.WndProc(ref m);
        //}         

    }

    private void OnChanged()
    {
        if (Changed != null)
            Changed(this, null);
    }
}

Erstellen des Ereignis Listener und die Kontrolle und stellte es die Eltern

//Is the Class above
SubWindow lw = new SubWindow();
lw.AssignHandle(ListHandle);
lw.Changed += new EventHandler(lw_Changed);

//Gets the IntPtr of the Mailgrid
//MainWindow is the Outlook main-window window
IntPtr ListHandle = GetSizes.GetMailFolderIntPtr(MainWindow);

//Gets the Rectangle of the Mailgrid
System.Drawing.Rectangle listsize = GetSizes.GetMailfolderSize(MainWindow, ListHandle);

//mc is the Custom Control
MoveWindow(mc.Handle, listsize.Left, listsize.Top, listsize.Width, listsize.Height, false);
SetParent(mc.Handle, MainWindow);
SetWindowLong(mc.Handle, (int)NativEnums.GetWindowLongConst.GWL_STYLE, (uint)(NativEnums.WindowStyles.WS_CHILD | NativEnums.WindowStyles.WS_VISIBLE));

Ein Wechsel-Ereignis

//Gets the Rectangle of the Mailgrid
System.Drawing.Rectangle listsize = GetSizes.GetMailfolderSize(MainWindow, ListHandle);
//Move and size the CustomControl to the Mailgrid Rectangle
MoveWindow(mc.Handle, listsize.Left, listsize.Top, listsize.Width, listsize.Height, false);
//Invalidate my Control
mc.Invalidate();

Malerei meiner Kontrolle

protected override void OnPaint(PaintEventArgs e)
{
    DoPaint(e.Graphics);

    //base.OnPaint(e);
}

protected override void OnPaintBackground(PaintEventArgs pevent)
{
    //base.OnPaintBackground(pevent);
}

public void DoPaint(Graphics g)
{
    g.Clear(BackColor);
    //Here comes the painting of the GridRows (only the visible rows)
}

/// EDIT

ein Thread.Sleep(1000) auf die die DoPaint Methode Nach der Zugabe konnte ich die Farbe sehen. Nach dem Ändern der Größe meiner Kontrolle zeigt für einen Augenblick nach oben, danach das Outlook Mailgrid übermalt meine Kontrolle. Ich habe zu Satz base.WndProc(ref m); versucht vor dem OnChange(); aber nichts geändert. Ich hoffe, das hilft, das Problem zu lösen.

/// EDIT

Nach einigen Tests habe ich versucht, auf alle Outlook-Fenster zu hören und sie Orange Graphics.Clear. Ich weiß nicht, warum, aber auch dies nicht funktioniert. Während fast alles Ändern der Größe von Outlook gezogen wird.

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);

        /////////////////////////////////////////////////////
        //  Here i clear the complete window (all windows) //
        /////////////////////////////////////////////////////
    using (Graphics g = Graphics.FromHwnd(m.HWnd))
        g.Clear(Color.Orange);

    if (m.Msg == (int)(NativEnums.WindowMessage.WM_SIZE) ||
        m.Msg == (int)(NativEnums.WindowMessage.WM_WINDOWPOSCHANGED) ||
        m.Msg == (int)(NativEnums.WindowMessage.WM_WINDOWPOSCHANGING) ||
        m.Msg == (int)(NativEnums.WindowMessage.WM_WINDOWPOSCHANGING) ||
        m.Msg == (int)(NativEnums.WindowMessage.WM_ERASEBKGND) ||
        m.Msg == (int)(NativEnums.WindowMessage.WM_NCHITTEST) ||
        m.Msg == (int)(NativEnums.WindowMessage.WM_NCCALCSIZE) ||
        m.Msg == (int)(NativEnums.WindowMessage.WM_PAINT) ||
        m.Msg == (int)(NativEnums.WindowMessage.WM_NCPAINT) ||
        m.Msg == (int)(NativEnums.WindowMessage.WM_PRINT) ||
        m.Msg == (int)(NativEnums.WindowMessage.WM_PRINTCLIENT) ||
        m.Msg == (int)(NativEnums.WindowMessage.WM_SETREDRAW) ||
        m.Msg == (int)(NativEnums.WindowMessage.WM_MOVE)
        )
    {
        OnChanged();
    }               

}
War es hilfreich?

Lösung

Ich habe das Problem, indem Sie die Zuhörer mit dem Outlook „Frame Splitter“ gelöst. Outlook Aus irgendeinem Grund setzt der Mailgrid unsichtbar und malt direkt auf dem Hauptfenster. (Das Hauptfenster bekommt keine windowmessage)

Ich male jetzt auch auf WM_WINDOWPOSCHANGING WM_WINDOWPOSCHANGED WM_SETREDRAW meine Kontrolle über das Hauptfenster.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top