понедельник, 26 ноября 2007 г.

Vista Glass для формы

Итак, в продолжение предыдущего поста рассказываю как сделать форму полупрозрачной.

Сначала добавляем в проект вот этот класс:


using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;

namespace VistaApi
{
    /// Class for enabling glass transparent mode in area
    /// You must set Color = Black in control!
    public class GlassApi
    {
        [DllImport("dwmapi.dll")]
        static extern void DwmExtendFrameIntoClientArea(System.IntPtr hWnd, ref Margins pMargins);

        [DllImport("dwmapi.dll")]
        static extern void DwmIsCompositionEnabled(ref bool isEnabled);

        struct Margins
        {
            public int Left, Right, Top, Bottom;
        }

        ///  Glass Window Handle 
        IntPtr Handle;

        /// Constructor
        /// Handle of window with glass effect
        public GlassApi(IntPtr Handle)
        {
            this.Handle = Handle;
        }

        /// Glass rectangle
        Margins margins = new Margins();

        public void SetGlassArea(Rectangle r)
        {
            //-1 because strange bug: on left corner is 1-pixel black square
            margins.Left = r.Left-1;
            margins.Top = r.Top-1;
            margins.Right = r.Right;
            margins.Bottom = r.Bottom;
            DwmExtendFrameIntoClientArea(Handle, ref margins);
        }


        bool glassEnabledCalled = false;
        private bool GetIsGlassEnabled()
        {
            glassEnabledCalled = true;
            //Checking if OS is >= Vista
            if (Environment.OSVersion.Version.Major < 6)
                return false;

            //Check if DWM is enabled
            bool isGlassSupported = false;
            DwmIsCompositionEnabled(ref isGlassSupported);
            return isGlassSupported;
        }

        bool _IsGlassEnabled=false;

        /// returns True if glass can be used
        public bool IsGlassEnabled
        {
            get
            {
                if (!glassEnabledCalled)
                    _IsGlassEnabled = GetIsGlassEnabled();
                return _IsGlassEnabled;
            }
        }
    }
}


Использование его очень просто:
1. В конструкторе передаем хэндл нашего окна.
2. Для того, чтобы узнать - можно ли использовать вистовскую прозрачность - используем свойство класса IsGlassEnabled.
3. Чтобы сделать форму прозрачной необходимо залить ее SolidBrush кистью, причем используя только основные семь цветов (белый цвет к ним не относится!). В зависимости от использованного цвета заливки будет меняться цвет полупрозрачности.

Следствие №1: все контролы, залитые основным цветом будут также полупрозрачными. Это так же касается всех надписей (по умолчанию они черного цвета).
Следствие №2: если цвет формы не менять (оставить цвет Control), а у контролов на форме - менять, то контролы будут полупрозрачными, а форма - нет.

Комментариев нет:

Отправить комментарий