关于 Gdiplus api 调用的bug解决以及注意事项

发布时间 2023-11-13 10:56:56作者: 明月忧忧

1. 加入空间命,以识别这是Gdiplus的类与函数


2. 调用前需调用    
Gdiplus::GdiplusStartupInput gsi;
ULONG_PTR pToken;
Gdiplus::Status s = Gdiplus::GdiplusStartup(&pToken, &gsi, NULL);
用完Gdiplus函数后调用
Gdiplus::GdiplusShutdown(pToken);
如果不调用,各个Gdiplus的类将初始化失败,类的GetLastStatus()函数将返回GdiplusNotInitialized。
通过查询Graphics api得知。

3. 重点:一般通过
Gdiplus::Graphics* pGr = Gdiplus::Graphics::FromHDC(hDC);
获取该DC的Graphics类指针,在OnPaint函数中使用,并此函数不能使用窗体指针,否则Gdiplus api将返回ObjectBusy。
经过一两天排查才发现此问题引起的ObjectBusy。先是排在代码处OnPaint调用处,更换不同的Brush(如从PathGradientBrush到SolidBrush的更换),在OnButtonClick处调用,更换DC(从CPaintDC到窗口DC的更换),加上错误检查,再到与能正常调用Gdiplus的项目文件代码比对,更换Dialog资源,最后删除作不用的代码,直到换上可用的Gdiplus代码后,能正常运行,再看以的代码,发现有对窗体指针的使用,最终更换为变量代替后,代码正常运行。