![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
| 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. |
| |||||||
| |
| | #1 (permalink) |
| | 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 Specs![]() |
| | #2 (permalink) |
| | 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 Specs![]() |
| Thread Tools | |
| |
Similar Threads | ||||
| Thread | Forum | |||
| I want to ask a Question about DrawThemeTextEx | .NET General | |||