Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GetTextExtentPoint32返回具有特定字符的错误宽度_C++_Winapi_Width_Gdi - Fatal编程技术网

C++ GetTextExtentPoint32返回具有特定字符的错误宽度

C++ GetTextExtentPoint32返回具有特定字符的错误宽度,c++,winapi,width,gdi,C++,Winapi,Width,Gdi,我尝试使用C++上的GETTreTruttPoxt32来获得一些字符的宽度,一次一个。但是,对于特殊字符(如0x14),该函数返回错误的结果,通常是用ExtTextOut在屏幕上打印的字符大小的一半。下面是一个例子: HDC hdc = GetDC(hWnd); SelectObject(hdc,font); SIZE sz; char c=0x14; GetTextExtentPoint32(hdc,&c,1,&sz); //function

我尝试使用C++上的GETTreTruttPoxt32来获得一些字符的宽度,一次一个。但是,对于特殊字符(如0x14),该函数返回错误的结果,通常是用ExtTextOut在屏幕上打印的字符大小的一半。下面是一个例子:

HDC hdc = GetDC(hWnd);    
SelectObject(hdc,font);    
SIZE sz;     
char c=0x14;    
GetTextExtentPoint32(hdc,&c,1,&sz); //function returns sz.cx equal to 3 instead of 6
GetCharWidth32也会发生同样的情况:

int result;    
GetCharWidth32(hdc,0x14,0x14,&result); //result equals to 3, while the character on screen is 6px wide
有什么线索表明我的错误在哪里?先谢谢你

编辑:GetTextExtentPoint32似乎发现所有小于32的ASCII字符的宽度都不准确。我发现带有DT_CALCRECT标志的DrawText可以很好地计算所有字符。唯一的缺点是DrawText比GetTextExtentPoint32消耗更多的CPU

HDC hdc=GetDC(hWnd);
RECT rect;
rect.left=0; rect.top=0;
DrawText(hdc,"\x14",1,&rect,DT_CALCRECT); //rect.right = character width

为什么不检查GetTextExtentPoint32是否返回FALSE?您是调用GetTextExtentPoint32A还是GetTextExtentPoint32W?(由于
&c
参数,我假设它是GetTextExtentPoint32A。)我使用的是GetTextExtentPoint32A,返回值为TRUE。该函数可以很好地处理字母和数字等可打印字符。我唯一的问题是一些特殊字符,如0x14。对话框采用“对话框单位”,而不是像素。因此,您必须首先进行转换:使用,类似的讨论:。我认为这不应限于特殊字符。所有字符都应使用GetTextExtentPoint32返回不准确的值。为什么不检查GetTextExtentPoint32是否返回FALSE?是否调用GetTextExtentPoint32A或GetTextExtentPoint32W?(由于
&c
参数,我假设它是GetTextExtentPoint32A。)我使用的是GetTextExtentPoint32A,返回值为TRUE。该函数可以很好地处理字母和数字等可打印字符。我唯一的问题是一些特殊字符,如0x14。对话框采用“对话框单位”,而不是像素。因此,您必须首先进行转换:使用,类似的讨论:。我认为这不应限于特殊字符。使用GetTextExtentPoint32时,所有字符都应返回不准确的值。