Windows Vista Forums

DrawThemeTextEx in .NET

  1. #1


    Jan Kucera Guest

    DrawThemeTextEx in .NET

    Hi - I just wondered, if there is anything simpler than this?
    Thanks, Jan




    public void DrawTextOnGlass(IntPtr hwnd, String text, Font font, Rectangle
    ctlrct, int iglowSize)
    {
    if (IsCompositionEnabled())
    {
    RECT rc = new RECT();
    RECT rc2 = new RECT();
    rc.left = ctlrct.Left;
    rc.right = ctlrct.Right + 2 * iglowSize; //make it larger to contain
    the glow effect
    rc.top = ctlrct.Top;
    rc.bottom = ctlrct.Bottom + 2 * iglowSize;
    //Just the same rect with rc,but (0,0) at the lefttop
    rc2.left = 0;
    rc2.top = 0;
    rc2.right = rc.right - rc.left;
    rc2.bottom = rc.bottom - rc.top;
    IntPtr destdc = GetDC(hwnd); //hwnd must be the handle of form,not
    control
    IntPtr Memdc = CreateCompatibleDC(destdc); // Set up a memory DC
    where we'll draw the text.
    IntPtr bitmap;
    IntPtr bitmapOld = IntPtr.Zero;
    IntPtr logfnotOld;
    int uFormat = DT_SINGLELINE | DT_CENTER | DT_VCENTER | DT_NOPREFIX;
    //text format
    BITMAPINFO dib = new BITMAPINFO();
    dib.bmiHeader.biHeight = -(rc.bottom - rc.top); // negative because
    DrawThemeTextEx() uses a top-down DIB
    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))
    {
    bitmap = CreateDIBSection(Memdc, ref dib, DIB_RGB_COLORS, 0,
    IntPtr.Zero, 0); // Create a 32-bit bmp for use in offscreen drawing when
    glass is on
    if (!(bitmap == IntPtr.Zero))
    {
    bitmapOld = SelectObject(Memdc, bitmap);
    IntPtr hFont = font.ToHfont();
    logfnotOld = SelectObject(Memdc, hFont);
    try
    {
    System.Windows.Forms.VisualStyles.VisualStyleRenderer
    renderer = new
    System.Windows.Forms.VisualStyles.VisualStyleRenderer(System.Windows.Forms.VisualStyles.VisualStyleElement.Window.Caption.Active);
    DTTOPTS dttOpts = new DTTOPTS();
    dttOpts.dwSize = (uint)Marshal.SizeOf(typeof(DTTOPTS));
    dttOpts.dwFlags = DTT_COMPOSITED | DTT_GLOWSIZE;
    dttOpts.iGlowSize = iglowSize;
    DrawThemeTextEx(renderer.Handle, Memdc, 0, 0, text, -1,
    uFormat, ref rc2, ref dttOpts);
    BitBlt(destdc, rc.left, rc.top, rc.right - rc.left,
    rc.bottom - rc.top, Memdc, 0, 0, SRCCOPY);
    }
    catch (Exception e)
    {
    Trace.WriteLine(e.Message);
    }

    //Remember to clean up
    SelectObject(Memdc, bitmapOld);
    SelectObject(Memdc, logfnotOld);
    DeleteObject(bitmap);
    DeleteObject(hFont);
    ReleaseDC(Memdc, -1);
    DeleteDC(Memdc);
    }
    }
    }


      My System SpecsSystem Spec

  2. #2


    Jan Kucera Guest

    Re: DrawThemeTextEx in .NET

    There is not more managed way to draw window caption? Without bitblts?
    Jan


    "Jan Kucera" <kucera@lupacovka.cz> wrote in message
    news:F6579CA6-50D0-436D-95F4-7769168D1CFF@microsoft.com...
    > Hi - I just wondered, if there is anything simpler than this?
    > Thanks, Jan
    >
    >
    > public void DrawTextOnGlass(IntPtr hwnd, String text, Font font, Rectangle
    > ctlrct, int iglowSize)
    > {
    > if (IsCompositionEnabled())
    > {
    > RECT rc = new RECT();
    > RECT rc2 = new RECT();
    > rc.left = ctlrct.Left;
    > rc.right = ctlrct.Right + 2 * iglowSize; //make it larger to
    > contain the glow effect
    > rc.top = ctlrct.Top;
    > rc.bottom = ctlrct.Bottom + 2 * iglowSize;
    > //Just the same rect with rc,but (0,0) at the lefttop
    > rc2.left = 0;
    > rc2.top = 0;
    > rc2.right = rc.right - rc.left;
    > rc2.bottom = rc.bottom - rc.top;
    > IntPtr destdc = GetDC(hwnd); //hwnd must be the handle of form,not
    > control
    > IntPtr Memdc = CreateCompatibleDC(destdc); // Set up a memory DC
    > where we'll draw the text.
    > IntPtr bitmap;
    > IntPtr bitmapOld = IntPtr.Zero;
    > IntPtr logfnotOld;
    > int uFormat = DT_SINGLELINE | DT_CENTER | DT_VCENTER | DT_NOPREFIX;
    > //text format
    > BITMAPINFO dib = new BITMAPINFO();
    > dib.bmiHeader.biHeight = -(rc.bottom - rc.top); // negative because
    > DrawThemeTextEx() uses a top-down DIB
    > 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))
    > {
    > bitmap = CreateDIBSection(Memdc, ref dib, DIB_RGB_COLORS, 0,
    > IntPtr.Zero, 0); // Create a 32-bit bmp for use in offscreen drawing when
    > glass is on
    > if (!(bitmap == IntPtr.Zero))
    > {
    > bitmapOld = SelectObject(Memdc, bitmap);
    > IntPtr hFont = font.ToHfont();
    > logfnotOld = SelectObject(Memdc, hFont);
    > try
    > {
    > System.Windows.Forms.VisualStyles.VisualStyleRenderer
    > renderer = new
    > System.Windows.Forms.VisualStyles.VisualStyleRenderer(System.Windows.Forms.VisualStyles.VisualStyleElement.Window.Caption.Active);
    > DTTOPTS dttOpts = new DTTOPTS();
    > dttOpts.dwSize = (uint)Marshal.SizeOf(typeof(DTTOPTS));
    > dttOpts.dwFlags = DTT_COMPOSITED | DTT_GLOWSIZE;
    > dttOpts.iGlowSize = iglowSize;
    > DrawThemeTextEx(renderer.Handle, Memdc, 0, 0, text, -1,
    > uFormat, ref rc2, ref dttOpts);
    > BitBlt(destdc, rc.left, rc.top, rc.right - rc.left,
    > rc.bottom - rc.top, Memdc, 0, 0, SRCCOPY);
    > }
    > catch (Exception e)
    > {
    > Trace.WriteLine(e.Message);
    > }
    >
    > //Remember to clean up
    > SelectObject(Memdc, bitmapOld);
    > SelectObject(Memdc, logfnotOld);
    > DeleteObject(bitmap);
    > DeleteObject(hFont);
    > ReleaseDC(Memdc, -1);
    > DeleteDC(Memdc);
    > }
    > }
    > }
    >



      My System SpecsSystem Spec

DrawThemeTextEx in .NET

Similar Threads
Thread Thread Starter Forum Replies Last Post
I want to ask a Question about DrawThemeTextEx allenport .NET General 0 28 Apr 2009