Exemplo n.º 1
0
        public void Update(Graphics g, string text, Font font, Padding internalBounds,
			Rectangle bounds, Color color, TextFormatFlags formatFlags, IThemeTextOption[] options)
        {
            IntPtr compatHdc = this._TextHDC;

            if (bounds.Equals(_TextHDCBounds)) {
                //Same bounds, reuse HDC and Clear it
                IntPtr hClearBrush = Native.GDI.CreateSolidBrush(ColorTranslator.ToWin32(Color.Black));
                Native.RECT cleanRect = new Native.RECT(bounds);
                Native.GDI.FillRect(compatHdc, ref cleanRect, hClearBrush);
                Native.GDI.DeleteObject(hClearBrush);
            }
            else {
                //Other bounds, create new HDC
                IntPtr outputHdc = g.GetHdc();
                IntPtr DIB;
                compatHdc = CreateNewHDC(outputHdc, bounds, out DIB);

                //Store new data
                _TextHDC = compatHdc;
                _TextHDCBounds = bounds;

                //Clear up
                CleanUpHDC(DIB);
                g.ReleaseHdc(outputHdc);
            }

            DrawOnHDC(compatHdc, text, font, internalBounds, bounds, color, formatFlags, options);
        }
Exemplo n.º 2
0
        public static ThemedText Create(Graphics g, string text, Font font, Padding internalBounds,
			Rectangle bounds, Color color, TextFormatFlags formatFlags, IThemeTextOption[] options)
        {
            //Get HDC and create a compatible HDC
            IntPtr outputHdc = g.GetHdc();

            IntPtr DIB;
            IntPtr compatHdc = CreateNewHDC(outputHdc, bounds, out DIB);

            //Draw
            DrawOnHDC(compatHdc, text, font, internalBounds, bounds, color, formatFlags, options);

            //Clean up
            CleanUpHDC(DIB);
            g.ReleaseHdc(outputHdc);

            //Return the wrapped HDC
            return new ThemedText(compatHdc, bounds);
        }
Exemplo n.º 3
0
        private static void DrawOnHDC(IntPtr compatHdc, string text, Font font, Padding internalBounds,
			Rectangle bounds, Color color, TextFormatFlags formatFlags, IThemeTextOption[] options)
        {
            //Create the Font to use
            IntPtr hFont = font.ToHfont();
            Native.GDI.SelectObject(compatHdc, hFont);

            //Get theme renderer
            VisualStyleRenderer renderer = new VisualStyleRenderer(VisualStyleElement.Window.Caption.Active);

            //Prepare options
            NativeMethods.DTTOPTS dttOpts = new NativeMethods.DTTOPTS();
            dttOpts.dwSize = Marshal.SizeOf(dttOpts);
            dttOpts.dwFlags = NativeMethods.DTTOPSFlags.DTT_COMPOSITED | NativeMethods.DTTOPSFlags.DTT_TEXTCOLOR;
            dttOpts.crText = ColorTranslator.ToWin32(color);
            foreach (IThemeTextOption op in options)
                op.Apply(ref dttOpts);

            //Set full bounds with padding
            Native.RECT RECT = new Native.RECT(internalBounds.Left, internalBounds.Top,
                bounds.Width - internalBounds.Right, bounds.Height - internalBounds.Bottom);

            //Draw
            int ret = NativeMethods.DrawThemeTextEx(renderer.Handle, compatHdc, 0, 0, text, -1, (int)formatFlags, ref RECT, ref dttOpts);
            if (ret != 0)
                Marshal.ThrowExceptionForHR(ret);

            //Clean up
            Native.GDI.DeleteObject(hFont);
        }
Exemplo n.º 4
0
        protected IThemeTextOption[] CreateOptions()
        {
            IThemeTextOption[] options = new IThemeTextOption[CountOptions()];

            int curr = 0;

            if (_glowEnable) {
                options[curr] = new GlowOption(_glowSize);
                ++curr;
            }
            if (_shadowEnable) {
                options[curr] = new ShadowOption(_shadowColor, _shadowOffset, _shadowType);
                ++curr;
            }
            if (!_overlayEnable) {
                options[curr] = new OverlayOption(_overlayEnable);
                ++curr;
            }
            if (_borderEnable) {
                options[curr] = new BorderOption(_borderColor, _borderSize);
                ++curr;
            }

            return options;
        }