关于GDI如何使用其它字体

我想知道

1. 如何在GDI中使用系统已安装字体

2. 如何在GDI中使用我自己的字体,假定字体是与程序(EXE)同目录的一个TTF文件 且未安装在运行此程序的电脑上

顺便附我的代码,希望这能帮你更好地解决我的问题

和字体有关的部分主要在 Init Paint 函数里

#include 
#include 
#include 
#include 
#include 
#define WINDOW_WIDTH	800
#define WINDOW_HEIGHT	600
#define WINDOW_TITLE	L"WND_TITLE"
#define REPAIN_TIME    0.02
HDC	g_hdc = NULL;
LRESULT CALLBACK	WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
BOOL				Init(HWND hwnd);
VOID				Paint(HWND hwnd);
BOOL				CleanUp(HWND hwnd);
VOID				Deal_WM_KEYDOWN(HWND hwnd, WPARAM wParam);
ULONGLONG ull_PaintTime, ull_LastPaintTime;
HPEN hPen_tmp;
HFONT hFont;		//字体
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_ HINSTANCE hPrevInstance, _In_opt_ LPSTR lpCmdLine, _In_ int nShowCmd)
{
	WNDCLASSEX wndClass = { 0 };
	wndClass.cbSize = sizeof(WNDCLASSEX);
	wndClass.style = CS_HREDRAW | CS_VREDRAW;
	wndClass.lpfnWndProc = WndProc;
	wndClass.cbClsExtra = 0;
	wndClass.cbWndExtra = 0;
	wndClass.hInstance = hInstance;
	wndClass.hIcon = (HICON)::LoadImage(NULL, L"icon.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);
	wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
	wndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
	wndClass.lpszMenuName = NULL;
	wndClass.lpszClassName = L"ClassName";
	if (!RegisterClassEx(&wndClass))
	{
		MessageBox(0, L"RegisterClassEx", L"RegisterClassEx", 0);
		return -1;
	}
	HWND hwnd = CreateWindow(L"ClassName", WINDOW_TITLE,
		WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH,
		WINDOW_HEIGHT, NULL, NULL, hInstance, NULL);
	MoveWindow(hwnd, 250, 80, WINDOW_WIDTH, WINDOW_HEIGHT, true);
	ShowWindow(hwnd, nShowCmd);
	UpdateWindow(hwnd);
	if (!Init(hwnd))
	{
		MessageBox(hwnd, L"Init", L"Init", 0);
		return -1;
	}
	MSG msg = { 0 };
	while (msg.message != WM_QUIT)
	{
		if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		else
		{
			ull_PaintTime = GetTickCount64();
			if (ull_PaintTime - ull_LastPaintTime >= REPAIN_TIME)
			{
				ull_LastPaintTime = ull_PaintTime;
				Paint(hwnd);
			}
		}
	}
	UnregisterClass(L"ClassName", wndClass.hInstance);
	return 0;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
	case WM_KEYDOWN:
		switch (wParam)
		{
			/*
		case VK_ESCAPE:
			{
				DestroyWindow(hwnd);
				break;
			}
			*/
		default:
		{
			
		}
		}
		break;
	case WM_DESTROY:
		CleanUp(hwnd);
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hwnd, message, wParam, lParam);
	}
	return 0;
}
BOOL Init(HWND hwnd)
{
	g_hdc = GetDC(hwnd);
	SetBkMode(g_hdc, TRANSPARENT);		//设置输出文字背景透明
	SetTextColor(g_hdc, RGB(255, 255, 255));
	//hFont = CreateFont(-18, -9, 0, 0, FW_REGULAR, FALSE, FALSE, FALSE, GB2312_CHARSET, 0, 0, 0, 0, 0);
	LPCWSTR Font_Resource = L"ProggyCleanSZ-1.ttf";
	if (AddFontResource(Font_Resource) == 0)
	{
		MessageBox(0, L"AddFontResource", L"AddFontResource", MB_OK);
	}
	PostMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
	hPen_tmp = CreatePen(PS_SOLID, 2, RGB(255, 255, 255));
	Paint(hwnd);
	return TRUE;
}
VOID Paint(HWND hwnd)
{
	LPCTSTR s = L"a quick brown fox jumps over the lazy dog,A QUICK BROWN FOX JUMPS OVER THE LAZY DOG.";
	RECT tmp_rect;
	tmp_rect.left = 10;
	tmp_rect.right = 1000;
	tmp_rect.top = 10;
	tmp_rect.bottom = 40;
	int s_len = _tcslen(s);
	//SelectObject(g_hdc, hFont);
	DrawText(g_hdc, s, s_len, &tmp_rect, DT_LEFT);
}
BOOL CleanUp(HWND hwnd)
{
	DeleteObject(hPen_tmp);
	DeleteObject(hFont);
	RemoveFontResource(L"ProggyCleanSZ-1.ttf");
	ReleaseDC(hwnd, g_hdc);
	return TRUE;
}

xiang luo,您好!

感谢您联系我们微软社区支持平台。

非常感谢您在此提出您的困惑并分享您的程序代码。

只是您正在咨询的GDI问题涉及到代码编程。

实际上,这已经超出我们论坛的支持范围。 它更适合发布在Microsoft Learn(仅支持英文),您可以点击“Ask a question”提问,那里有这方面的专家,能提供更加专业的方案。

这是论坛的链接,您可以在其中提出特定场景并分享您的想法以帮助解决问题。

我不具备协助您解决此编程问题的能力,但我会把这个问题留给大家,以防我们出色的志愿者之一有更好的想法。

如有不明白或任何疑问,欢迎随时联系我们!

顺颂时祺

Kyo | 微软社区支持专员

此回复是否有帮助?

抱歉,这没有帮助。

太棒了! 感谢你的反馈。

你对此回复的满意度如何?

感谢你的反馈,它能帮助我们改进网站。

你对此回复的满意度如何?

感谢你的反馈。

谢谢您的建议

此回复是否有帮助?

抱歉,这没有帮助。

太棒了! 感谢你的反馈。

你对此回复的满意度如何?

感谢你的反馈,它能帮助我们改进网站。

你对此回复的满意度如何?

感谢你的反馈。

xiang luo,您好!

感谢您的理解与支持。

后续使用微软产品的过程中遇到问题,欢迎再次联系Microsoft Community。

顺颂时祺

Kyo | 微软社区支持专员

此回复是否有帮助?

抱歉,这没有帮助。

太棒了! 感谢你的反馈。

你对此回复的满意度如何?

感谢你的反馈,它能帮助我们改进网站。

你对此回复的满意度如何?

感谢你的反馈。

xiang luo,您好!

我注意到Microsoft Learn的专家已经为您提供了合适的方案。

我们很高兴听到您在GDI中遇到的问题已得到解决。我们很高兴能够为您提供帮助!

若您方便的话,诚邀您对我们的服务作出评价。

我们感谢您的反馈,请单击“是”或“否”以帮助我们改进支持体验。

投票回复也将有利于更多社区成员阅读此处。

再次感谢您选择微软!

顺颂时祺

Kyo | 微软社区支持专员

此回复是否有帮助?

抱歉,这没有帮助。

太棒了! 感谢你的反馈。

你对此回复的满意度如何?

感谢你的反馈,它能帮助我们改进网站。

你对此回复的满意度如何?

感谢你的反馈。

 
 

问题信息


上次更新时间 2024/02/08 57 次浏览 适用于: