Windows Vista Forums
Vista Forums Home Join Vista Forums Windows 7 Forum Vista Tutorials Tags
Welcome to Windows Vista Forums. Our forum is dedicated to helping you find solutions with any problems, errors or issues you are experiencing with Windows Vista. The Vista forum also covers news and updates and has an extensive Windows Vista tutorial section that covers a wide range of tips and tricks.

Go Back   Vista Forums > Misc Newsgroups > Aero

Vista - DrawThemeTextEx in .NET

 
 
Old 12-10-2006   #1 (permalink)
Jan Kucera


 
 

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
Old 01-17-2007   #2 (permalink)
Jan Kucera


 
 

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
 

Thread Tools


Similar Threads
Thread Forum
I want to ask a Question about DrawThemeTextEx .NET General


Vista Forums is an independent web site and has not been authorized,
sponsored, or otherwise approved by Microsoft Corporation.
"Windows Vista", the Start Orb, and related materials are trademarks of Microsoft Corp.
© Designer Media Ltd

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46