/// <summary> /// Measure the width and height of string <paramref name="str"/> when drawn on device context HDC /// using the given font <paramref name="font"/>.<br/> /// Restrict the width of the string and get the number of characters able to fit in the restriction and /// the width those characters take. /// </summary> /// <param name="str">the string to measure</param> /// <param name="font">the font to measure string with</param> /// <param name="maxWidth">the max width to render the string in</param> /// <param name="charFit">the number of characters that will fit under <see cref="maxWidth"/> restriction</param> /// <param name="charFitWidth"></param> /// <returns>the size of the string</returns> public static Size MeasureString(char[] buff, int startAt, int len, RequestFont font, float maxWidth, out int charFit, out int charFitWidth) { //if (_useGdiPlusTextRendering) //{ // ReleaseHdc(); // throw new NotSupportedException("Char fit string measuring is not supported for GDI+ text rendering"); //} //else //{ SetFont(font); if (buff.Length == 0) { charFit = 0; charFitWidth = 0; return(Size.Empty); } var size = new Size(); unsafe { fixed(char *startAddr = &buff[0]) { NativeTextWin32.UnsafeGetTextExtentExPoint( win32MemDc.DC, startAddr + startAt, len, (int)Math.Round(maxWidth), _charFit, _charFitWidth, ref size); } } charFit = _charFit[0]; charFitWidth = charFit > 0 ? _charFitWidth[charFit - 1] : 0; return(size); //} }
internal static void MeasureCharWidths(IntPtr hFont, out int[] charWidths, out NativeTextWin32.FontABC[] abcSizes) { //only in ascii range //current version charWidths = new int[MAX_CODEPOINT_NO + 1]; // MyWin32.SelectObject(win32MemDc.DC, hFont); unsafe { //see: https://msdn.microsoft.com/en-us/library/ms404377(v=vs.110).aspx //A code page contains 256 code points and is zero-based. //In most code pages, code points 0 through 127 represent the ASCII character set, //and code points 128 through 255 differ significantly between code pages abcSizes = new NativeTextWin32.FontABC[MAX_CODEPOINT_NO + 1]; fixed(NativeTextWin32.FontABC *abc = abcSizes) { NativeTextWin32.GetCharABCWidths(win32MemDc.DC, (uint)0, (uint)MAX_CODEPOINT_NO, abc); } for (int i = 0; i < (MAX_CODEPOINT_NO + 1); ++i) { charWidths[i] = abcSizes[i].Sum; } } }
public static Size MeasureString(char[] buff, int startAt, int len, RequestFont font) { SetFont(font); var size = new Size(); if (buff.Length > 0) { unsafe { fixed(char *startAddr = &buff[0]) { NativeTextWin32.UnsafeGetTextExtentPoint32(win32MemDc.DC, startAddr + startAt, len, ref size); } } } return(size); }
public void TextOut(char[] textBuffer, int x, int y) { NativeTextWin32.TextOut(this.memHdc, x, y, textBuffer, textBuffer.Length); }
// public void TextOut(char[] textBuffer) { NativeTextWin32.TextOut(this.memHdc, 0, 0, textBuffer, textBuffer.Length); }
internal static void MeasureCharWidths(IntPtr hFont, out int[] charWidths, out NativeTextWin32.FontABC[] abcSizes) { //only in ascii range //current version charWidths = new int[MAX_CODEPOINT_NO + 1]; // MyWin32.SelectObject(win32MemDc.DC, hFont); unsafe { //see: https://msdn.microsoft.com/en-us/library/ms404377(v=vs.110).aspx //A code page contains 256 code points and is zero-based. //In most code pages, code points 0 through 127 represent the ASCII character set, //and code points 128 through 255 differ significantly between code pages abcSizes = new NativeTextWin32.FontABC[MAX_CODEPOINT_NO + 1]; fixed (NativeTextWin32.FontABC* abc = abcSizes) { NativeTextWin32.GetCharABCWidths(win32MemDc.DC, (uint)0, (uint)MAX_CODEPOINT_NO, abc); } for (int i = 0; i < (MAX_CODEPOINT_NO + 1); ++i) { charWidths[i] = abcSizes[i].Sum; } } }