case WM_PAINT: hdc = BeginPaint(hWnd, &ps); hFont = CreateFontW( 48, 0, 0, 0, FW_REGULAR, FALSE, FALSE, FALSE, GB2312_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, FIXED_PITCH | FF_MODERN, L"Comic Sans MS" ); SelectObject(GetDC(hWnd), hFont); SetTextColor(GetDC(hWnd), 0xff0000); TextOut(GetDC(hWnd), 10, 10, L"hello world", 11); EndPaint(hWnd, &ps); break;
hello world 是显示出来了,可是字体没有变化,把CreateFont放到WM_CREATE中也不行。
解决方案
20
检查函数返回值看能否成功
https://msdn.microsoft.com/en-us/library/dd183499.aspx
https://msdn.microsoft.com/en-us/library/dd183499.aspx
10
CreateFontW 不应该在WM_PAINT中执行,WM_PAINT事件时时刻刻在触发,相当于CreateFontW 执行了无数次。
CreateFontW 执行次数过多,将原因是资源不足,导致创建失败。就是这个“GDI”对象不足。
CreateFontW 执行次数过多,将原因是资源不足,导致创建失败。就是这个“GDI”对象不足。
10
系统有没有自带Comic Sans MS字体?
10
这里有很多问题:
1. hdc = BeginPaint(hWnd, &ps); 都返回 hdc 了为何不用,而是反复的 GetDC?
请用 BeginPaint 返回的 hdc,或 ps.hdc。
2. GetDC 也需要对应的 ReleaseDC。你三次调用 GetDC 都释放了吗?
3. CreateFont 反复创建没关系,但是你没有对用 DeleteObject 去销毁。
最好在 WM_CREATE、WM_INITDIALOG 中创建,在 WM_SETFONT 中变更,在 WM_NCDESTROY 中销毁。
1. hdc = BeginPaint(hWnd, &ps); 都返回 hdc 了为何不用,而是反复的 GetDC?
请用 BeginPaint 返回的 hdc,或 ps.hdc。
2. GetDC 也需要对应的 ReleaseDC。你三次调用 GetDC 都释放了吗?
3. CreateFont 反复创建没关系,但是你没有对用 DeleteObject 去销毁。
最好在 WM_CREATE、WM_INITDIALOG 中创建,在 WM_SETFONT 中变更,在 WM_NCDESTROY 中销毁。