当前位置:C++技术网 > 资讯 > 控件自绘大忌:不能使用SetWindowText修改正在自绘的控件文字

控件自绘大忌:不能使用SetWindowText修改正在自绘的控件文字

更新时间:2016-02-16 16:47:33浏览次数:1+次

    按钮自绘给我们提供了完全控制按钮绘制的机会。我们可以在按钮中自由的显示文字,然而,我们可能会犯一个错误。我们可能会想,在按钮自绘时修改文字的显示。
    我们知道,修改控件的文字可以调用SetWindowText或者直接使用SendMessage发送WM_SETTEXT消息即可。是的,这两种方式确实可以修改文字。
    那么,他们可不可以在按钮自绘时修改按钮的文字呢?提出这个问题的人,就是对按钮自绘原理不清楚的人。那么请先阅读《控件自绘的原理流程图解深入浅出分析》来深入学习一下控件自绘的原理。然后再阅读文章《win32按钮自绘实现单击按钮变色文字变色》从代码角度来看看如何写代码实现按钮控件自绘。
    我们需要先搞清楚,按钮自绘是什么意思。按钮自绘并不是说按钮的绘制工作由按钮自己绘制,而是刚好相反,按钮的绘制由程序员自己绘制。而绘制的地方就是在父窗口中的WM_DRAWITEM消息中绘制。我想,这个概念也是困扰很多人理解的地方吧。
    在按钮自绘时,我们要显示文字,需要绘制出来。既然我们完全控制了按钮绘制的过程,我们绘制什么按钮就显示什么。那么我们输出什么文字也就显示什么文字。
    而假如调用SetWindowText或者直接使用SendMessage发送WM_SETTEXT消息,使用这两个方式来修改文字,也就是给按钮控件发送了一个绘制文字的消息。因为按钮控件此时是自绘按钮风格,所有的绘制都会通知父窗口,就要给父窗口发送一个自绘消息WM_DRAWITEM。
    这样一来,程序就陷入了死循环了。在自绘消息中不停的产生文字绘制消息,然后促使按钮控件不停的给父窗口发送WM_DRAWITEM消息。这样程序无法正常工作了,就挂了。

    程序的错误提示提示【0xC000041D:用户回调期间遇到了未处理的异常】如下:

程序的错误提示提示【0xC000041D:用户回调期间遇到了未处理的异常】

【按钮自绘时调用SetWindowText函数修改按钮文字导致程序崩溃】
    看到这样的错误提示,是不是看蒙了。看到错误提示的函数调用,我们通过分析按钮自绘的原理流程,也就清楚为什么这里不能调用SetWindowText函数来修改正在自绘的按钮的文字。当然,你使用:
SendMessage(hCtrl,WM_SETTEXT,(WPARAM)_T("C++技术网http://www.cjjjs.com"),0);

    一样是错误的,和SetWindowText函数性质一样。我们可以看看我们这个程序的执行按钮自绘的流程图:

按钮自绘的流程被破坏的示意图

【按钮自绘的流程被破坏的示意图】
    这是错误的代码示例:
HWND hCtrl = GetDlgItem(hwnd,iCtlID);
SendMessage(hCtrl,WM_SETTEXT,(WPARAM)_T("C++技术网http://www.cjjjs.com"),0);//错误做法
SetWindowText(hCtrl,_T("C++技术网http://www.cjjjs.com"));//错误做法
    一定要注意。还要提醒一下,我们这里说的是不能这样发消息修改正在自绘的按钮的文字。我们可以使用SendMessage和SetWindowText改变其他窗口或者控件的文字。我们要改变正在自绘的按钮的文字,直接使用DrawText或者TextOut函数即可搞定。