GDI+编程中的错误

来源:互联网 发布:万网域名转让流程 编辑:程序博客网 时间:2024/06/01 07:48

在应用GDI+进行程序设计时,首先要对GDI+进行初始化。

先在应用程序类中加入成员变量 :

ULONG_PTR m_gdiplusToken;

应用程序类的InitInstance成员函数中加入如下的初始化代码:

 Gdiplus::GdiplusStartupInput gdiplusStartupInput;
 Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);

但是在后面的程序中却出现了应用new对GDI+类型进行内存分配的错误。new Pen(...)返回为空。

其原因是初始化代码在InitInstance成员函数中的位置。我们来看一下常规的单文档应用程序的InitInstance()函数中的内容:

 InitCommonControls();

 CWinApp::InitInstance();

 // 初始化 OLE 库
 if (!AfxOleInit())
 {
  AfxMessageBox(IDP_OLE_INIT_FAILED);
  return FALSE;
 }
 AfxEnableControlContainer();
 // 标准初始化
 // 如果未使用这些功能并希望减小
 // 最终可执行文件的大小,则应移除下列
 // 不需要的特定初始化例程
 // 更改用于存储设置的注册表项
 // TODO: 应适当修改该字符串,
 // 例如修改为公司或组织名
 SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
 LoadStdProfileSettings(0);  // 加载标准 INI 文件选项(包括 MRU)
 // 注册应用程序的文档模板。文档模板
 // 将用作文档、框架窗口和视图之间的连接
 CSingleDocTemplate* pDocTemplate;
 pDocTemplate = new CSingleDocTemplate(
  IDR_MAINFRAME,
  RUNTIME_CLASS(CDisplayConsoleDoc),
  RUNTIME_CLASS(CMainFrame),       // 主 SDI 框架窗口
  RUNTIME_CLASS(CLeftView));
 if (!pDocTemplate)
  return FALSE;
 AddDocTemplate(pDocTemplate);
 // 分析标准外壳命令、DDE、打开文件操作的命令行
。。。。。

如果在该程序的最后加入

 Gdiplus::GdiplusStartupInput gdiplusStartupInput;
 Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);

则在后面的程序中就会出现刚才提到的内存无法进行分配的错误。因为在以上两句带码之前,应用程序的文档、视图等对象均已生成和显示,所以此时再进行GDI+的初始化,可以说是为时已晚。正确的解决办法是将以上两行代码提前加入到InitInstance函数中。比较稳妥的办法是将其加入到最前面。无法进行new的错误即可解决。