private void RenderOnComposition(RenderContext context) { // Convert the clipping rectangle from floating to int version RectangleF rectClipF = context.Graphics.ClipBounds; Rectangle rectClip = new Rectangle((int)rectClipF.X, (int)rectClipF.Y, (int)rectClipF.Width, (int)rectClipF.Height); // No point drawing unless some of the client fits into the clipping area if (rectClip.IntersectsWith(ClientRectangle)) { // Get the hDC for the graphics instance and create a memory DC IntPtr gDC = context.Graphics.GetHdc(); IntPtr mDC = PI.CreateCompatibleDC(gDC); PI.BITMAPINFO bmi = new PI.BITMAPINFO(); bmi.biSize = Marshal.SizeOf(bmi); bmi.biWidth = ClientWidth; bmi.biHeight = -ClientHeight; bmi.biCompression = 0; bmi.biBitCount = 32; bmi.biPlanes = 1; // Create a device independant bitmp and select into the memory DC IntPtr hDIB = PI.CreateDIBSection(gDC, bmi, 0, 0, IntPtr.Zero, 0); PI.SelectObject(mDC, hDIB); // To call the renderer we need to convert from Win32 HDC to Graphics object using (Graphics bitmapG = Graphics.FromHdc(mDC)) { Rectangle renderClientRect = new Rectangle(0, 0, ClientWidth, ClientHeight); // Create new render context that uses the bitmap graphics instance using (RenderContext bitmapContext = new RenderContext(context.Control, bitmapG, renderClientRect, context.Renderer)) { // Finally we get the renderer to draw the background for the bitmap _mementoBack = context.Renderer.RenderRibbon.DrawRibbonTabContextTitle(_ribbon.RibbonShape, bitmapContext, renderClientRect, _ribbon.StateCommon.RibbonGeneral, this, _mementoBack); } } // Select the font for use when drawing IntPtr hFont = _contentProvider.GetContentShortTextFont(State).ToHfont(); PI.SelectObject(mDC, hFont); // Get renderer for the correct state VisualStyleRenderer renderer = new VisualStyleRenderer(VisualStyleElement.Window.Caption.Active); // Create structures needed for theme drawing call PI.RECT textBounds = new PI.RECT(); textBounds.left = TEXT_SIDE_GAP_COMPOSITION; textBounds.top = 0; textBounds.right = ClientWidth - (TEXT_SIDE_GAP_COMPOSITION * 2); textBounds.bottom = ClientHeight; PI.DTTOPTS dttOpts = new PI.DTTOPTS(); dttOpts.dwSize = Marshal.SizeOf(typeof(PI.DTTOPTS)); dttOpts.dwFlags = PI.DTT_COMPOSITED | PI.DTT_GLOWSIZE | PI.DTT_TEXTCOLOR; dttOpts.crText = ColorTranslator.ToWin32(SystemColors.ActiveCaptionText); dttOpts.iGlowSize = (_ribbon.Enabled ? 12 : 2); // Always draw text centered TextFormatFlags textFormat = TextFormatFlags.SingleLine | TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.EndEllipsis; // Perform actual drawing PI.DrawThemeTextEx(renderer.Handle, mDC, 0, 0, GetShortText(), -1, (int)textFormat, ref textBounds, ref dttOpts); // Copy to foreground PI.BitBlt(gDC, ClientLocation.X, ClientLocation.Y, ClientWidth, ClientHeight, mDC, 0, 0, 0x00CC0020); // Dispose of allocated objects PI.DeleteObject(hFont); PI.DeleteObject(hDIB); PI.DeleteDC(mDC); // Must remember to release the hDC context.Graphics.ReleaseHdc(gDC); } }