Exemplo n.º 1
0
        /// <summary>
        /// 获取轮廓多边形列表
        /// </summary>
        /// <param name="hdc">场景</param>
        /// <param name="uChar">字符</param>
        /// <returns></returns>
        private static DOutline GetOutline(IntPtr hdc, uint uChar)
        {
            // 转置矩阵
            MAT2 mat2 = new MAT2();

            mat2.eM11.value = 1;
            mat2.eM22.value = 1;

            GLYPHMETRICS lpGlyph = new GLYPHMETRICS();

            //获取缓存区大小
            int bufferSize = GdiNativeMethods.GetGlyphOutline(hdc, uChar, GGO_NATIVE, out lpGlyph, 0, IntPtr.Zero, ref mat2);

            if (bufferSize > 0)
            {
                //获取成功后,分配托管内存
                IntPtr buffer = Marshal.AllocHGlobal(bufferSize);
                try
                {
                    int ret = GdiNativeMethods.GetGlyphOutline(hdc, uChar, GGO_NATIVE, out lpGlyph, (uint)bufferSize, buffer, ref mat2);
                    if (ret > 0)
                    {
                        //构建轮廓
                        DOutline outline = new DOutline(lpGlyph.gmBlackBoxX, lpGlyph.gmBlackBoxY);
                        //从缓存区构造字型轮廓
                        FillPolygons(outline, buffer, bufferSize);

                        return(outline);
                    }
                    else
                    {
                        throw new Exception("获取字型数据失败!");
                    }
                }
                finally
                {
                    //释放托管内存
                    Marshal.FreeHGlobal(buffer);
                }
            }
            else
            {
                throw new Exception("未能获取缓存区!");
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// 获取指定字符在指定字体下的轮廓
        /// </summary>
        /// <param name="uChar">字符</param>
        /// <param name="font">字体</param>
        /// <returns></returns>
        public static DOutline GetOutline(uint uChar, Font font)
        {
            //画板
            Graphics g   = Graphics.FromHwnd(IntPtr.Zero);
            IntPtr   hdc = g.GetHdc();

            //将字体选入场景
            IntPtr fontPtr = font.ToHfont();

            GdiNativeMethods.SelectObject(hdc, fontPtr);
            try
            {
                return(GetOutline(hdc, uChar));
            }
            finally
            {
                //关闭字体句柄,释放场景
                GdiNativeMethods.CloseHandle(fontPtr);
                g.ReleaseHdc(hdc);
            }
        }