我建了一个edit控件,原本是可以write的,后来我想用setwindowlong使其
readonly(通过加入ES_READONLY这个style)
SetWindowLong(hedit,GWL_STYLE,GetWindowLong(hedit,GWL_STYLE)|ES_READONLY);
但是这样是不可以马上反应出来的。我要怎么才能使它马上反应出来呀?难道一定要把它先删除再create出来?还有,我使edit控件在鼠标左键双击的时候做上面的事情(setwindowlong),如何做到?我查到edit控件的默认消息处理里面有WM_LBUTTONDBLCLK,我只想到了
通过subclassing或者superclassing来拦截这个消息,但是这样好像太麻烦了,
不知道有没有更简便的方法,谢谢
readonly(通过加入ES_READONLY这个style)
SetWindowLong(hedit,GWL_STYLE,GetWindowLong(hedit,GWL_STYLE)|ES_READONLY);
但是这样是不可以马上反应出来的。我要怎么才能使它马上反应出来呀?难道一定要把它先删除再create出来?还有,我使edit控件在鼠标左键双击的时候做上面的事情(setwindowlong),如何做到?我查到edit控件的默认消息处理里面有WM_LBUTTONDBLCLK,我只想到了
通过subclassing或者superclassing来拦截这个消息,但是这样好像太麻烦了,
不知道有没有更简便的方法,谢谢
的窗口的标题,太诡异了,代码如下,这是怎么回事呀?
SetWindowLong(hedit,GWL_STYLE,GetWindowLong(hDlg,GWL_STYLE)|ES_READONLY); SetWindowPos(hedit,HWND_NOTOPMOST,0,0,100,100,SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
中的hDlg应该是hedit吧!
居然放了这么白痴的一个错误,我已经改过来了,但是好像
SetWindowPos(hedit,HWND_NOTOPMOST,0,0,100,100,SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);这一句不起作用
edit窗口还是可以输入,到底怎么回事呀,那位大虾救救我吧。
设置只读干嘛要这么麻烦, 一句话就可以了:
CEdit* pEdit=(CEdit*)GetDlgItem(IDC_EDIT);
pEdit->SetReadOnly();
2:
要处理eidt的WM_LBUTTONDOWN,只能用子类化的办法。当然你也可以给edit设置一个control型的变量来达到目的,不过本质上是一样的。
其实我并不是一定要使edit控件readonly,而是我觉得
动态改变一个控件的style是很有用的一项动作,但是我已经
在2,3个程序里面试图通过setwindowlong来更改一个控件的
style,每次都失败,我也看到过MSDN里面的注释,说要通过
setwindowpos来使设置生效(if you change any of the frame styles, you must call SetWindowPos with the SWP_FRAMECHANGED flag for the cache to be updated properly),但是我每次试验都还是不行,不知道是MSDN里面这一段有问题,还是我的理解有问题,而且我都问过3次了,还没有
人完整的给我解答掉,sigh,高手呀,救救我呀!!!
SendMessage(hEdit, EM_SETREADONLY, bReadOnly, 0L);
bReadOnly 为 TRUE 就是设为只读。
For some styles in certain controls (the ES_READONLY style in the edit control, for example), ModifyStyle may not properly change the style because the control may need to perform special internal processing. In these cases, a corresponding message to change the style will be available (EM_SETREADONLY in the example mentioned).
ModifyStyle内部调用了SetWindowPos,我想它可能也是先用了SetWindowLong来改变窗口的风格,既然它无法对ES_READONLY进行正确的设置,你自己用SetWindowLong也不行。eidt有那么多种风格,单单把设置ES_READONLY的 SetReadOnly拿出来做为一个单独的函数,也许也是因为这种原因吧。为了证实,你用SetWindowLong+SetWndowPos试试改变另外一种风格看能不能成功。