public static IntPtr ScriptStringAnalyseCall (IntPtr hdc, IntPtr char_buffer, int max_char_len, SCRIPT_TABDEF tab_def) { IntPtr ret = IntPtr.Zero; IntPtr actual_buf = char_buffer; ScripStringAnalyseOptions opts = ScripStringAnalyseOptions.BREAK | //ScripStringAnalyseOptions.FALLBACK | ScripStringAnalyseOptions.GLYPHS | //ScripStringAnalyseOptions.LINK | ScripStringAnalyseOptions.TAB; int res0 = ScriptStringAnalyse (hdc, actual_buf, max_char_len, (int)((max_char_len * 1.5) + 16), -1, opts, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, ref tab_def, IntPtr.Zero, ref ret); if (res0 != S_OK) { Marshal.ThrowExceptionForHR(res0); } return(ret); }
public static extern int ScriptStringAnalyse (IntPtr hdc, IntPtr pString, int cString, int cGlyphs, int iCharset, ScripStringAnalyseOptions dwFlags, int iReqWidth, IntPtr psControl, //SCRIPT_CONTROL* IntPtr psState, //SCRIPT_STATE* IntPtr piDx, // const int* ref SCRIPT_TABDEF pTabdef, IntPtr pbInClass, //const BYTE* ref IntPtr pssa //SCRIPT_STRING_ANALYSIS* );
public static IntPtr ScriptStringAnalyseCall (IntPtr hdc, IntPtr char_buffer, int max_char_len, int max_width, SCRIPT_TABDEF tab_def) { IntPtr ret = IntPtr.Zero; IntPtr actual_buf = char_buffer; ScripStringAnalyseOptions opts = ScripStringAnalyseOptions.BREAK | ScripStringAnalyseOptions.CLIP | //ScripStringAnalyseOptions.FALLBACK | -> это вызывает утечку, не освобождаются объекты gdi font ScripStringAnalyseOptions.GLYPHS | //ScripStringAnalyseOptions.LINK | ScripStringAnalyseOptions.TAB; int res0 = ScriptStringAnalyse (hdc, actual_buf, max_char_len, (int)((max_char_len * 1.5) + 16), -1, opts, max_width, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, ref tab_def, IntPtr.Zero, ref ret); if (res0 != S_OK) { Marshal.ThrowExceptionForHR(res0); } return(ret); }