| 发表于:2007-07-19 11:00:253楼 得分:0 |
当你改变你的字体时,控件并不会自己改变行高来适应你的字体,既没有 wm_measureitem被发送,造成字体改变了,但是控件的行高不能用了.主要是如何产生 wm_measureitem消息. 该方法的主要思想是,当调用cwnd::setfont()方法时,会发送wm_setfont ,在处理消息wm_setfont 中,我们发送wm_windowposchanged来欺骗windows,让他认为窗口大小改变,产生wm_measureitem消息.因为这个消息是子窗口发给父窗口的,所以我们用消息反射,这个用类向导没发添加我们想要的,只有手工消息映射中添加on_wm_measureitem_reflect(). 这主要是改变控件的行高来适应字体变化.注意,如果onsetfont 没有和wm_font联系,也要在消息处理中添加 on_message(wm_setfont, onsetfont). 上面的方法不中的话再试试void measureitem(lpmeasureitemstruct lpmeasureitemstruct) { textmetric tm; hdc hdc = ::getdc(null); cfont* pfont = getfont(); hfont hfontold = (hfont)selectobject(hdc, pfont-> getsafehandle()); gettextmetrics(hdc, &tm); lpmeasureitemstruct-> itemheight = tm.tmheight + tm.tmexternalleading + 1; selectobject(hdc, hfontold); ::releasedc(null, hdc); }来调整逻辑值和实际的物理值的差别. drawtext实际上并不绘制文本,而是计算出文本需要多少空间。drawtext改变传入矩形的大小以便适应文本的宽度和高度。调用drawtext之后,crect将返回文本的宽度和高度.看看你调用drawtext前是不是又恢复成原来的字体了. | | |
|