| Subject: DrawThemeTextEx in .NET |
| Group: microsoft.public.windows.developer.winfx.aero |
| Date: 12/10/2006 9:21:06 AM |
| From: "Jan Kucera" [Email Address Protection] |
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); } } } |
| Back |
| Subject: Re: DrawThemeTextEx in .NET |
| Group: microsoft.public.windows.developer.winfx.aero |
| Date: 1/17/2007 12:31:11 AM |
| From: "Jan Kucera" [Email Address Protection] |
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); > } > } > } > |
| Back |