而GetTextExtentPoint函数能够计算输入的字符串占据的空间范围,所以通过它进行运算,就能获知我们需要显示多少个字符.
简单点,我们就用二分法吧。声明一个函数,它可以接收当前的hdc,显示范围的大小,以及测试的字符串,返回的是该显示范围能容纳下的字符。
故此,函数实现如下:
- DWORD GetComfortSize(HDC hdc,DWORD dwWidth,const TSTRING &strText)
- {
- //二分法查找
- DWORD dwComfortSize = 0;
- DWORD dwBeginSize = 0;
- DWORD dwEndSize = strText.size();
- while(TRUE)
- {
- DWORD dwMiddleSize = (dwEndSize + dwBeginSize) / 2;
- if(dwMiddleSize == dwBeginSize || dwMiddleSize == dwEndSize)
- {
- //两个点之间已经没有数值可以检测,退出循环
- dwComfortSize = dwBeginSize;
- break;
- }
- SIZE sizeChk = {0};
- ::GetTextExtentPoint(hdc,strText.c_str(),dwMiddleSize,&sizeChk);
- if(sizeChk.cx == dwWidth)
- {
- //数值刚好合适,跳出循环
- dwComfortSize = dwMiddleSize;
- break;
- }
- else if(static_cast<DWORD>(sizeChk.cx) > dwWidth)
- {
- //重新设置边界
- dwEndSize = dwMiddleSize;
- }
- else
- {
- //重新设置边界
- dwBeginSize = dwMiddleSize;
- }
- }
- return dwComfortSize;
- }
函数的调用其实也很简单,但我们要注意,调用前先将省略号的空间给去掉。故实际的调用代码简单如下:
- //获取省略号的占据范围
- static const TSTRING FLAG_ELLIPSIS = TEXT("...");
- SIZE sizeEllipsis = {0};
- GetTextExtentPoint(hdc,FLAG_ELLIPSIS.c_str(),FLAG_ELLIPSIS.size(),&sizeEllipsis);
- DWORD dwMaxDisp = GetComfortSize(hdc,sizeExtent.cx - sizeEllipsis.cx,strChk);