DrawThemeTextEx in .NET

J

Jan Kucera

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 Computer

J

Jan Kucera

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


"Jan Kucera" <[email protected]> wrote in message
news:[email protected]
> 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 Computer

Top