示例#1
0
        /// <summary>
        /// The ID2D1Factory interface provides the starting point for Direct2D.
        /// In general, an object created from a single instance of a factory object can be used with other resources created from that instance,
        /// but not with resources created by other factory instances.
        /// </summary>
        /// <returns></returns>
        public static bool CreateD2DFactory(ID2D1Factory factory)
        {
            factory = null;
            object ppIFactory = null;
            int    rc         = Win32Error.S_OK;
            IntPtr ptrIID     = IntPtr.Zero;

            GUID iid;

            if ((rc = OLE.IIDFromString(D2DInterfaceID.ID2D1Factory, out iid)) != Win32Error.S_OK)
            {
                logger.ErrorFormat("获取ID2D1Factory IID失败, guid = {0}, code = {1}", D2DInterfaceID.ID2D1Factory, rc);
                return(false);
            }

            try
            {
                ptrIID = Marshal.AllocHGlobal(Marshal.SizeOf(iid));
                Marshal.StructureToPtr(iid, ptrIID, true);
                if ((rc = D2D1.D2D1CreateFactory(D2D1_FACTORY_TYPE.D2D1_FACTORY_TYPE_SINGLE_THREADED, ptrIID, IntPtr.Zero, out ppIFactory)) != Win32Error.S_OK)
                {
                    logger.ErrorFormat("D2D1CreateFactory失败, code = {0}", rc);
                    return(false);
                }
            }
            catch (Exception ex)
            {
                logger.Error("创建D2DFactory异常", ex);
                return(false);
            }
            finally
            {
                if (ptrIID != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(ptrIID);
                }
            }

            factory = ppIFactory as ID2D1Factory;

            return(true);
        }