Tại sao giá trị được trả về bởi getextentpoint32 vẫn giữ nguyên bất kể kích thước phông chữ hiện tại?

lập trình


Tôi đang phát triển ứng dụng này và để đảm bảo nội dung được điều chỉnh theo kích thước trang, ứng dụng sử dụng kích thước phông chữ hiện tại và giá trị mà GetTextExtentPoint32 trả về để điều chỉnh kích thước trang bằng cách đưa dữ liệu ra vào một vòng lặp while. Tôi khá ngạc nhiên khi phát hiện ra rằng GetExtentPoint32 tiếp tục trả về cùng một giá trị mặc dù đã giảm kích thước phông chữ. Tại sao lại như vậy, làm sao tôi có thể giải quyết được thử thách này.

Các mã có liên quan được hiển thị dưới đây:

C++
GetTextExtentPoint32(hdc, wstSchoolName11.c_str(), lstrlen(wstSchoolName11.c_str()), &size);
if ((iTextLeft + size.cx) > (iPaperWidth - iPictureWidth - iOffsetX))
	{
		iFontSize--;

		hNewFont = CreateAppFont(iFontSize, FW_BOLD);
		hOldFont = (HFONT)SelectObject(hdc, hNewFont);
		GetTextMetrics(hdc, &tm);
		//int iTextTop11 = iTop + iOffsetY;
		//int iTextLeft11 = iImageLeft + iPictureWidth + 5 * dOneMMX;
		wstring wstSchoolName11 = utf8_decode(stSchoolName);
		CharUpper(&wstSchoolName11[0]);
		//SIZE size11;
		GetTextExtentPoint32(hdc, wstSchoolName11.c_str(), lstrlen(wstSchoolName11.c_str()), &size);
	}
	else
	{
		bMaximumWith = true;
	}
C++
int iWindowExtX = 1000 * GetDeviceCaps(hDC,HORZSIZE);
    int iWindowExtY = 1000 * GetDeviceCaps(hDC, VERTSIZE);

    int iViewPortX = GetDeviceCaps(hDC, HORZRES);
    int iViewPortY = GetDeviceCaps(hDC, VERTRES);

    SetMapMode(hDC, MM_ISOTROPIC);
    SetWindowExtEx(hDC, iWindowExtX, iWindowExtY, nullptr);
    SetViewportExtEx(hDC, iViewPortX, iViewPortY, nullptr);

Định nghĩa của ứng dụng CreateFont như dưới đây. Có điều gì sai trái với nó?

C++
HFONT CreateAppFont(int cHeight, int cWeight, DWORD bItalic = 0, int cEscapement = 0, DWORD bUnderline = 0, LPCWSTR pszFaceName = L"Times New Roman");


HFONT CreateAppFont(int cHeight, int cWeight, DWORD bItalic, int cEscapement, DWORD bUnderline, LPCWSTR pszFaceName)
{
	return CreateFont(cHeight, 0, cEscapement, cEscapement, cWeight, bItalic, bUnderline, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS,
		CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, VARIABLE_PITCH, pszFaceName);

	
}

Những gì tôi đã thử:

Tôi đã dành thời gian hợp lý để gỡ lỗi. Kết quả đã dẫn đến bài đăng này.

Giải pháp 1

Các Hàm GetTextExtentPoint32A (wingdi.h) – Ứng dụng Win32 | Microsoft Tìm hiểu[^] trả về kích thước của văn bản trong đơn vị logic. Các chức năng hiển thị văn bản sử dụng số đó nhân với kích thước phông chữ để tính toán không gian thực tế cần thiết cho màn hình.

Vâng, tôi vừa thử nghiệm điều này và các giá trị kích thước phản ánh phông chữ đang được sử dụng. Tôi nghĩ bạn cần xem xét kỹ hơn những gì đang diễn ra trong mã của mình, với tham chiếu cụ thể đến CreateAppFont chức năng.

コメント

タイトルとURLをコピーしました