8
votes

Comment éliminer le fond gris sur la forme parent MDI?

Ce que j'essaie de faire est de dessiner du verre sur une forme marquée comme un conteneur MDI. Cependant, dès que l'ISMDicontainer est défini, le formulaire ajoute un matriclient à sa liste de contrôles. À ce stade, il arrive que quelque chose arrive à la forme parent - presque comme un panneau gris foncé est amarré sur toute la forme sur laquelle le matrice est placé sur lequel le mimlient est mis.

i est ce qui suit pour déplacer le contrôle MDiclient hors du chemin un peu: xxx

ceci fait ensuite la zone de maticlient réelle plus petite afin que nous puissions voir ce qui est derrière cela (le peu qui héberge les formes d'enfants) et il est évident que le La forme parent n'est pas la peinture ni quelque chose.

Comme on peut le voir ici: http: //img525.imageshack. US / IMG525 / 8605 / MDIGLASSPROBROBLEM.PNG

J'ai maintenant besoin d'une manière d'une manière ou d'une fois, de faire en sorte que la zone du MDiclient (partie grise sombre est rendue blanche sur la section de verre) pour partir.

Des idées?

PS - Le verre est rendu en utilisant la méthode DwmextendFrameintoclientarea à Vista.


3 commentaires

Juste une note latérale; La ligne "if (c est maicliente)" est redondante. L'opérateur "comme" effectue la même chèque et renvoie NULL s'il est faux. Ainsi, utilisez simplement l'opérateur «comme», puis vérifiez à la place de NULL.


... ou coller avec le 'est' et utilisez une coulée de style C, mais je préfère personnellement l'autre approche.


Ok, mais maintenant je suis confus - pourquoi avez-vous besoin de la «partie grise» pour partir? C'est toujours derrière HT MDiclient. Il suffit de ne pas bouger / rétrécir le client?


3 Réponses :


5
votes

J'ai réussi à le faire fonctionner. Cette zone gris foncée dont je parlais, qui se fait peindre sur tout se produisait dans la méthode sur la forme sur la forme. De toute évidence, lorsqu'il y a un MDicontainer présent, le formulaire est préprogrammé pour peindre la zone grise foncée qui obstruait le verre.

Remplissez simplement la méthode Onpaint sans l'appeler de la base, puis prenez le code utilisé pour dessiner le verre dans la méthode de peinture normale et le coller dans la méthode Onpaint. P>

protected override void OnPaint(PaintEventArgs e)
    {
        //base.OnPaint(e);
        bool glassEnabled = IsGlassEnabled();
        if (glassEnabled) // draw glass if enabled
        {
            Rectangle rc = picPlaceHolder.ClientRectangle;

            IntPtr destdc = e.Graphics.GetHdc(); // hwnd must be the handle of form, not control
            IntPtr Memdc = CreateCompatibleDC(destdc);
            IntPtr bitmapOld = IntPtr.Zero;

            BITMAPINFO dib = new BITMAPINFO();
            dib.bmiHeader.biHeight = -(rc.Bottom - rc.Top);
            dib.bmiHeader.biWidth = rc.Right - rc.Left;
            dib.bmiHeader.biPlanes = 1;
            dib.bmiHeader.biSize = Marshal.SizeOf(typeof(BITMAPINFOHEADER));
            dib.bmiHeader.biBitCount = 32;
            dib.bmiHeader.biCompression = BI_RGB;
            if (!(SaveDC(Memdc) == 0))
            {
                IntPtr bitmap = CreateDIBSection(Memdc, ref dib, DIB_RGB_COLORS, 0, IntPtr.Zero, 0);
                if (!(bitmap == IntPtr.Zero))
                {
                    bitmapOld = SelectObject(Memdc, bitmap);
                    BitBlt(destdc, rc.Left, rc.Top, rc.Right - rc.Left, rc.Bottom - rc.Top, Memdc, 0, 0, SRCCOPY);
                }

                // remember to clean up
                SelectObject(Memdc, bitmapOld);

                DeleteObject(bitmap);
                ReleaseDC(Memdc, -1);
                DeleteDC(Memdc);
            }
            e.Graphics.ReleaseHdc();
        }
    }


0 commentaires

9
votes

Je pense que c'est assez parfait. XXX


0 commentaires

0
votes

Cela devrait faire le tour xxx


0 commentaires