protected override void DoPaint(HCStyle aStyle, RECT aDrawRect, int aDataDrawTop, int aDataDrawBottom, int aDataScreenTop, int aDataScreenBottom, HCCanvas aCanvas, PaintInfo aPaintInfo) { base.DoPaint(aStyle, aDrawRect, aDataDrawTop, aDataDrawBottom, aDataScreenTop, aDataScreenBottom, aCanvas, aPaintInfo); RECT vBoxRect = GetBoxRect(); HC.OffsetRect(ref vBoxRect, aDrawRect.Left, aDrawRect.Top); if (aPaintInfo.Print) { if (FChecked) { HC.HCDrawFrameControl(aCanvas, vBoxRect, HCControlState.hcsChecked, HCControlStyle.hcyCheck); } else { HC.HCDrawFrameControl(aCanvas, vBoxRect, HCControlState.hcsCustom, HCControlStyle.hcyCheck); } } else { if (this.IsSelectComplate) { aCanvas.Brush.Color = aStyle.SelColor; aCanvas.FillRect(aDrawRect); } else if (FMouseIn) { aCanvas.Brush.Color = HC.clBtnFace; aCanvas.FillRect(aDrawRect); } if (FChecked) { aCanvas.Brush.Style = HCBrushStyle.bsSolid; User.DrawFrameControl(aCanvas.Handle, ref vBoxRect, Kernel.DFC_MENU, Kernel.DFCS_CHECKED | Kernel.DFCS_MENUCHECK); } HC.HCDrawFrameControl(aCanvas, vBoxRect, HCControlState.hcsCustom, HCControlStyle.hcyCheck); } aCanvas.Brush.Style = HCBrushStyle.bsClear; aStyle.TextStyles[TextStyleNo].ApplyStyle(aCanvas, aPaintInfo.ScaleY / aPaintInfo.Zoom); if (FBoxRight) { aCanvas.TextOut(aDrawRect.Left, aDrawRect.Top + (Height - aCanvas.TextHeight("H")) / 2, FText); } else { aCanvas.TextOut(aDrawRect.Left + FPaddingLeft + CheckBoxSize + FPaddingLeft, aDrawRect.Top + (Height - aCanvas.TextHeight("H")) / 2, FText); } }
public void ApplyStyle(HCCanvas aCanvas, Single aScale = 1) { if (FBackColor == HC.HCTransparentColor) { aCanvas.Brush.Style = HCBrushStyle.bsClear; } else { aCanvas.Brush.Color = FBackColor; } aCanvas.Font.BeginUpdate(); try { aCanvas.Font.Color = FColor; aCanvas.Font.Family = FFamily; if ((FFontStyles.Contains((byte)HCFontStyle.tsSuperscript)) || (FFontStyles.Contains((byte)HCFontStyle.tsSubscript))) { aCanvas.Font.Size = FSize / 2; } else { aCanvas.Font.Size = FSize; } aCanvas.Font.FontStyles.Value = FFontStyles.Value; // 防止后面其他地方修改canva的font时影响到原始的样式数据 } finally { aCanvas.Font.EndUpdate(); } TEXTMETRICW vTextMetric = new TEXTMETRICW(); aCanvas.GetTextMetrics(ref vTextMetric); FTextMetric_tmAveCharWidth = vTextMetric.tmAveCharWidth; FTextMetric_tmExternalLeading = vTextMetric.tmExternalLeading; FTextMetric_tmHeight = vTextMetric.tmHeight; FONTSIGNATURE vFontSignature = new FONTSIGNATURE(); FFontHeight = aCanvas.TextHeight("H"); if ((GDI.GetTextCharsetInfo(aCanvas.Handle, ref vFontSignature, 0) != GDI.DEFAULT_CHARSET) && ((vFontSignature.fsCsb[0] & CJK_CODEPAGE_BITS) != 0)) { FCJKFont = true; } else { FCJKFont = false; } FOutMetSize = GDI.GetOutlineTextMetrics(aCanvas.Handle, 0, IntPtr.Zero); if (FOutMetSize != 0) { //FOutMetSize = (uint)Marshal.SizeOf(FOutlineTextmetric); IntPtr vOutlineTextmetricPtr = Marshal.AllocHGlobal((int)FOutMetSize); try { if (GDI.GetOutlineTextMetrics(aCanvas.Handle, FOutMetSize, vOutlineTextmetricPtr) != 0) { //FOutlineTextmetric = new OUTLINETEXTMETRICW(); //FOutlineTextmetric = (OUTLINETEXTMETRICW)Marshal.PtrToStructure(FOutlineTextmetricPtr, typeof(OUTLINETEXTMETRICW)); //string otmpFamilyName = Marshal.PtrToStringUni(new IntPtr((int)FOutlineTextmetricPtr + (int)FOutlineTextmetric.otmpFamilyName)); //string otmpFaceName = Marshal.PtrToStringUni(new IntPtr((int)FOutlineTextmetricPtr + (int)FOutlineTextmetric.otmpFaceName)); ; //string otmpStyleName = Marshal.PtrToStringUni(new IntPtr((int)FOutlineTextmetricPtr + (int)FOutlineTextmetric.otmpStyleName)); ; //string otmpFullName = Marshal.PtrToStringUni(new IntPtr((int)FOutlineTextmetricPtr + (int)FOutlineTextmetric.otmpFullName)); ; // 以上为参考代码 //Marshal.PtrToStructure(FOutlineTextmetricPtr, FOutlineTextmetric); OUTLINETEXTMETRICW vOutlineTextmetric = (OUTLINETEXTMETRICW)Marshal.PtrToStructure(vOutlineTextmetricPtr, typeof(OUTLINETEXTMETRICW)); FOutlineTextmetric_otmfsSelection = vOutlineTextmetric.otmfsSelection; FOutlineTextmetric_otmAscent = vOutlineTextmetric.otmAscent; FOutlineTextmetric_otmDescent = vOutlineTextmetric.otmDescent; FOutlineTextmetric_otmEMSquare = vOutlineTextmetric.otmEMSquare; } } finally { Marshal.FreeHGlobal(vOutlineTextmetricPtr); } } TT_HHEA vFontHeader = new TT_HHEA(); if ((uint)GDI.GetFontData(aCanvas.Handle, MS_HHEA_TAG, 0, ref vFontHeader, Marshal.SizeOf(vFontHeader)) != GDI.GDI_ERROR) { FFontHeader_Ascender = vFontHeader.Ascender; FFontHeader_Descender = vFontHeader.Descender; } else { FFontHeader_Ascender = 0; FFontHeader_Descender = 0; } }
public static int GetFontHeight(HCCanvas ACanvas) { return(ACanvas.TextHeight("H")); }
public void ApplyStyle(HCCanvas aCanvas, Single aScale = 1) { if (FBackColor == HC.HCTransparentColor) { aCanvas.Brush.Style = HCBrushStyle.bsClear; } else { aCanvas.Brush.Color = FBackColor; } aCanvas.Font.BeginUpdate(); try { aCanvas.Font.Color = FColor; aCanvas.Font.Family = FFamily; if ((FFontStyles.Contains((byte)HCFontStyle.tsSuperscript)) || (FFontStyles.Contains((byte)HCFontStyle.tsSubscript))) { aCanvas.Font.Size = FSize / 2; } else { aCanvas.Font.Size = FSize; } aCanvas.Font.FontStyles = FFontStyles; } finally { aCanvas.Font.EndUpdate(); } aCanvas.GetTextMetrics(ref FTextMetric); FONTSIGNATURE vFontSignature = new FONTSIGNATURE(); FFontHeight = aCanvas.TextHeight("H"); if ((GDI.GetTextCharsetInfo(aCanvas.Handle, ref vFontSignature, 0) != GDI.DEFAULT_CHARSET) && ((vFontSignature.fsCsb[0] & CJK_CODEPAGE_BITS) != 0)) { FCJKFont = true; } else { FCJKFont = false; } if (FOutMetSize > 0) { Marshal.FreeHGlobal(FOutlineTextmetricPtr); } FOutMetSize = GDI.GetOutlineTextMetrics(aCanvas.Handle, 0, IntPtr.Zero); if (FOutMetSize != 0) { //FOutMetSize = (uint)Marshal.SizeOf(FOutlineTextmetric); FOutlineTextmetricPtr = Marshal.AllocHGlobal((int)FOutMetSize); if (GDI.GetOutlineTextMetrics(aCanvas.Handle, FOutMetSize, FOutlineTextmetricPtr) != 0) { //FOutlineTextmetric = new OUTLINETEXTMETRICW(); //FOutlineTextmetric = (OUTLINETEXTMETRICW)Marshal.PtrToStructure(FOutlineTextmetricPtr, typeof(OUTLINETEXTMETRICW)); //string otmpFamilyName = Marshal.PtrToStringUni(new IntPtr((int)FOutlineTextmetricPtr + (int)FOutlineTextmetric.otmpFamilyName)); //string otmpFaceName = Marshal.PtrToStringUni(new IntPtr((int)FOutlineTextmetricPtr + (int)FOutlineTextmetric.otmpFaceName)); ; //string otmpStyleName = Marshal.PtrToStringUni(new IntPtr((int)FOutlineTextmetricPtr + (int)FOutlineTextmetric.otmpStyleName)); ; //string otmpFullName = Marshal.PtrToStringUni(new IntPtr((int)FOutlineTextmetricPtr + (int)FOutlineTextmetric.otmpFullName)); ; // 以上为参考代码 //Marshal.PtrToStructure(FOutlineTextmetricPtr, FOutlineTextmetric); FOutlineTextmetric = (OUTLINETEXTMETRICW)Marshal.PtrToStructure(FOutlineTextmetricPtr, typeof(OUTLINETEXTMETRICW)); } } if ((uint)GDI.GetFontData(aCanvas.Handle, MS_HHEA_TAG, 0, ref FFontHeader, Marshal.SizeOf(FFontHeader)) == GDI.GDI_ERROR) { return; } }
protected override void DoPaint(HCStyle aStyle, RECT aDrawRect, int aDataDrawTop, int aDataDrawBottom, int aDataScreenTop, int aDataScreenBottom, HCCanvas aCanvas, PaintInfo aPaintInfo) { base.DoPaint(aStyle, aDrawRect, aDataDrawTop, aDataDrawBottom, aDataScreenTop, aDataScreenBottom, aCanvas, aPaintInfo); if ((FMouseIn) && (!aPaintInfo.Print)) { aCanvas.Brush.Color = HC.clBtnFace; aCanvas.FillRect(aDrawRect); } RECT vBoxRect = GetBoxRect(); HC.OffsetRect(ref vBoxRect, aDrawRect.Left, aDrawRect.Top); if (this.IsSelectComplate && (!aPaintInfo.Print)) { aCanvas.Brush.Color = aStyle.SelColor; aCanvas.FillRect(aDrawRect); } aCanvas.Brush.Style = HCBrushStyle.bsClear; aStyle.TextStyles[TextStyleNo].ApplyStyle(aCanvas, aPaintInfo.ScaleY / aPaintInfo.Zoom); aCanvas.TextOut(aDrawRect.Left + FMargin + CheckBoxSize + FMargin, aDrawRect.Top + (Height - aCanvas.TextHeight("H")) / 2, FText); if (FChecked) // 勾选 { User.DrawFrameControl(aCanvas.Handle, ref vBoxRect, Kernel.DFC_MENU, Kernel.DFCS_CHECKED | Kernel.DFCS_MENUCHECK); } if (FMouseIn && (!aPaintInfo.Print)) // 鼠标在其中,且非打印 { aCanvas.Pen.Color = Color.Blue; aCanvas.Rectangle(vBoxRect.Left, vBoxRect.Top, vBoxRect.Right, vBoxRect.Bottom); HC.InflateRect(ref vBoxRect, 1, 1); aCanvas.Pen.Color = HC.clBtnFace; aCanvas.Rectangle(vBoxRect.Left, vBoxRect.Top, vBoxRect.Right, vBoxRect.Bottom); } else // 鼠标不在其中或打印 { aCanvas.Pen.Color = Color.Black; aCanvas.Rectangle(vBoxRect.Left, vBoxRect.Top, vBoxRect.Right, vBoxRect.Bottom); } }