Laden...

[kniffelig] Warum verschwinden die Controls?

Erstellt von dennisspohr vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.737 Views
dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 16 Jahren
[kniffelig] Warum verschwinden die Controls?

Hallo@all!

Im 2. Beitrag ist der aktuelle Quellcode!**

Ich glaube die Frage die ich euch jetzt stellen werde, ist relativ knifflig.
Ihr müsst euch vorstellen, ich habe eine PNG-Grafik die transparente Farben enthält. Die Grafik wird in ein Formular geladen und auch korrekt angezeigt, also richtig schön mit Schatten 😉 Das einzigste Problem: Es werden keinerlei Controls mehr angezeigt. Dabei ist das witzige, dass sie reagieren, wenn man auf sie klickt (da wo man sie normalerweise sehen würde).
Ich hatte den Quelltext aus einem Beispiel und auf meine bedürfnisse angepasst. Auch in dem nicht-geändertem Beispiel sind die Controls visuell nicht zu entdecken.

Vielleicht wisst ihr ja eine Lösung 😉

Also hier ersteinmal mein Quellcode:
(Beide Quelltexte zusammen sieht viel mehr aus als es wirklich ist 😉)

Die ist meine Klasse "PInvoke", hier findet der hauptsächliche Prozess statt:



    public class PInvoke : Form
    {
        #region Win32 GDI functions
        /// <summary>
        // a static class to expose needed win32 gdi functions.
        /// </summary>
        public class Win32
        {
            public enum Bool
            {
                False = 0,
                True
            };

            [StructLayout(LayoutKind.Sequential)]
            public struct Point
            {
                public Int32 x;
                public Int32 y;

                public Point(Int32 x, Int32 y)
                {
                    this.x = x; this.y = y;
                }
            }

            [StructLayout(LayoutKind.Sequential)]
            public struct Size
            {
                public Int32 cx;
                public Int32 cy;

                public Size(Int32 cx, Int32 cy)
                {
                    this.cx = cx; this.cy = cy;
                }
            }

            [StructLayout(LayoutKind.Sequential, Pack = 1)]
            struct ARGB
            {
                public byte Blue;
                public byte Green;
                public byte Red;
                public byte Alpha;
            }

            [StructLayout(LayoutKind.Sequential, Pack = 1)]
            public struct BLENDFUNCTION
            {
                public byte BlendOp;
                public byte BlendFlags;
                public byte SourceConstantAlpha;
                public byte AlphaFormat;
            }


            public const Int32 ULW_COLORKEY = 0x00000001;
            public const Int32 ULW_ALPHA = 0x00000002;
            public const Int32 ULW_OPAQUE = 0x00000004;

            public const byte AC_SRC_OVER = 0x00;
            public const byte AC_SRC_ALPHA = 0x01;


            [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
            public static extern Bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref Point pptDst, ref Size psize, IntPtr hdcSrc, ref Point pprSrc, Int32 crKey, ref BLENDFUNCTION pblend, Int32 dwFlags);

            [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
            public static extern IntPtr GetDC(IntPtr hWnd);

            [DllImport("user32.dll", ExactSpelling = true)]
            public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);

            [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
            public static extern IntPtr CreateCompatibleDC(IntPtr hDC);

            [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
            public static extern Bool DeleteDC(IntPtr hdc);

            [DllImport("gdi32.dll", ExactSpelling = true)]
            public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);

            [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
            public static extern Bool DeleteObject(IntPtr hObject);
        }
        #endregion
    }


Und dies ist meine Form, in der die Grafik angezeigt wird, nur die Controls leider nicht:


    public partial class Form2 : Form
    {
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x00080000; // This form has to have the WS_EX_LAYERED extended style
                return cp;
            }
        }

        public Form2()
        {
            this.InitializeComponent();

            this.TopMost = true;
            this.FormBorderStyle = FormBorderStyle.FixedDialog;
            this.MinimizeBox = false;
            this.MaximizeBox = false;
            this.ControlBox = false;
            this.Width = 3090;
            this.Height = 1980;

            Bitmap bitmap = (Bitmap)Bitmap.FromFile("desk.png");

            this.SetBitmap(bitmap, 255);
        }

        public void SetBitmap(Bitmap bitmap, byte opacity)
        {
            IntPtr screenDc = PInvoke.Win32.GetDC(IntPtr.Zero);
            IntPtr memDc = PInvoke.Win32.CreateCompatibleDC(screenDc);
            IntPtr hBitmap = IntPtr.Zero;
            IntPtr oldBitmap = IntPtr.Zero;

            try
            {
                hBitmap = bitmap.GetHbitmap(Color.FromArgb(0));  // grab a GDI handle from this GDI+ bitmap
                oldBitmap = PInvoke.Win32.SelectObject(memDc, hBitmap);

                PInvoke.Win32.Size size = new PInvoke.Win32.Size(bitmap.Width, bitmap.Height);
                PInvoke.Win32.Point pointSource = new PInvoke.Win32.Point(0, 0);
                PInvoke.Win32.Point topPos = new PInvoke.Win32.Point(Left, Top);
                PInvoke.Win32.BLENDFUNCTION blend = new PInvoke.Win32.BLENDFUNCTION();
                blend.BlendOp = PInvoke.Win32.AC_SRC_OVER;
                blend.BlendFlags = 0;
                blend.SourceConstantAlpha = opacity;
                blend.AlphaFormat = PInvoke.Win32.AC_SRC_ALPHA;

                PInvoke.Win32.UpdateLayeredWindow(Handle, screenDc, ref topPos, ref size, memDc, ref pointSource, 0, ref blend, PInvoke.Win32.ULW_ALPHA);
            }
            finally
            {
                PInvoke.Win32.ReleaseDC(IntPtr.Zero, screenDc);
                if (hBitmap != IntPtr.Zero)
                {
                    PInvoke.Win32.SelectObject(memDc, oldBitmap);
                    PInvoke.Win32.DeleteObject(hBitmap);
                }
                PInvoke.Win32.DeleteDC(memDc);
            }
        }

        protected override void WndProc(ref Message m)
        {

            if (m.Msg == 0x0084 /*WM_NCHITTEST*/)
            {
                m.Result = (IntPtr)2;	// HTCLIENT
                return;
            }

            base.WndProc(ref m);
        }
    }


Ich wäre euch unendlich dankbar wenn ihr auch den Quelltext mal anschaut und mir eventuell weiterhelfen könntet, vielen Dank für alle Antworten! 🙂

Gruß Dennis

dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 16 Jahren

okay...ich habe noch ein Online-Beispiel gefunden, dabei wird die Form angezeigt und oben links neben dieser Form die Grafik mit dem Schatten. Jetzt müsste die Grafik nur noch irgendwie in die Form hinein.
Hilft euch das vielleicht weiter um mir zu helfen...? 😉


        [DllImport("gdi32.dll", EntryPoint = "GdiAlphaBlend")]
        public static extern bool AlphaBlend(IntPtr hdcDest, int nXOriginDest, int nYOriginDest,
           int nWidthDest, int nHeightDest,
           IntPtr hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc,
           BLENDFUNCTION blendFunction);


        [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
        static extern IntPtr CreateCompatibleDC(IntPtr hdc);

        [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
        static extern bool DeleteDC(IntPtr hdc);

        [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
        static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);

        [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
        static extern bool DeleteObject(IntPtr hObject);

        [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
        public static extern IntPtr GetDC(IntPtr hWnd);
        
        [StructLayout(LayoutKind.Sequential)]
        public struct BLENDFUNCTION
        {
            byte BlendOp;
            byte BlendFlags;
            byte SourceConstantAlpha;
            byte AlphaFormat;

            public BLENDFUNCTION(byte op, byte flags, byte alpha, byte format)
            {
                BlendOp = op;
                BlendFlags = flags;
                SourceConstantAlpha = alpha;
                AlphaFormat = format;
            }
        }

        const byte AC_SRC_OVER = 0x00;
        const byte AC_SRC_ALPHA = 0x01;
        
        private void Form1_Load(object sender, EventArgs e)
        {
            Bitmap bitmap = (Bitmap)Bitmap.FromFile(@"C:\Eigene Dateien\Visual Studio 2005\Projects\Goerlitz.EmployeeInfo\Görlitz Employee Info\_Bin\desk.png");
            IntPtr g = GetDC(IntPtr.Zero);
            int x = 40;
            int y = 40;
            byte Alpha = 255;
            
            IntPtr pSource = CreateCompatibleDC(g);
            IntPtr pOrig = SelectObject(pSource, bitmap.GetHbitmap(Color.Black));
            AlphaBlend(g, x, y, bitmap.Width, bitmap.Height, pSource, 0, 0, bitmap.Width, bitmap.Height, new BLENDFUNCTION(AC_SRC_OVER, 0, Alpha, AC_SRC_ALPHA));
            IntPtr pNew = SelectObject(pSource, pOrig);
            DeleteObject(pNew);
            DeleteDC(pSource);
        }

Danke für alle Antworten!

Gruß Dennis

dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 16 Jahren

Kann mir denn keiner helfen? 🙁

dennisspohr Themenstarter:in
420 Beiträge seit 2007
vor 16 Jahren

okay...falls irgendwann mal jemand das gleiche Problem hat, hier eine gute Lösung dafür:

CodeProject: Alpha blended windows forms

lg Dennis