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);
}
}