回 帖 发 新 帖 刷新版面

主题:怎样得到一个文字的区域

假如我在窗口上用TextOut写了一行文字,

那么我又办法得到这行文字所在的区域吗(RECT)。

如果可以,我怎么得到呢,如果不可以,那我用什么变通的办法呢?

我在学API 最好用API给我解释下吧,先谢谢了,呵呵[em2]

回复列表 (共3个回复)

沙发


举个例子:

         hdc = GetDC(hwnd);
         TextOut(hdc, 100, 100, TEXT("This is text by WM_KEYDWON"), wcslen(TEXT("This is text by WM_KEYDWON")));
         ReleaseDC(hwnd, hdc);


上面的100, 100,就是hdc的x、y坐标,wcslen所取的是长度,也可以通过取字符串长度来获得。

上面解释的未必是你想要的,你想的的应该是反过来的情况,这个我也不清楚了。有一些零碎想法,看有没有参考。

1、如果需要保留这个RECT以备后用,可以先定义一个RECT r,那么上面传给TextOut的坐标就用r.Left, r.Top;
2、如果单用TextOut,它的RECT应该是ClientRect,也就可整个窗口客户区;
3、想取得窗口文字及其长度,可以用:GetWindowText和GetWindowTextLength。

板凳

即然你用TTextOut输出的文字,那么文字所在的左上角座标你就一定知道了。
关键是右下角的座标,假设你是在0,0位置输出的文字,那么右下角的座标,就是字的高度,加上字符串的长度

得到字的高度,可以用
 TEXTMETRIC tm;   
 GetTextMetrics(
   hdc,            
   &tm );
这样,就可以把字体的信息保存在tm中了。取出tm.tmHeight 就是高度。
至于取出字符串的长度,在MFC中用GetTextExtent()功能相似的API函数是
 BOOL GetTextExtentPoint(
  HDC hdc,           // handle to device context
  LPCTSTR lpString,  // pointer to text string
  int cbString,      // number of characters in string
  LPSIZE lpSize      // pointer to structure for string size
);
看来它要麻烦一些,得构造一个CSize对象传进去,用它得到字串的长度

3 楼

恩,你的方法,我自己也想到过,但是,还是嫌太麻烦,我用了一个变通的方法,就是在窗口上输入文字的时候用“STATIC”这个子窗口。然后用GetWindowRect()得到它的区域,当然在画“STATIC”窗口的时候,也是按照字符串的“长”(占像素的长度)和高来对字窗口的width和height赋值。最后把“STATIC”字窗口的背景色换成和自己窗口的背景色一样,或者透明的。

嘿嘿,真的谢谢楼上的……犹如我的老师一般。

我来回复

您尚未登录,请登录后再回复。点此登录或注册