我建了一个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来拦截这个消息,但是这样好像太麻烦了,
不知道有没有更简便的方法,谢谢

解决方案 »

  1.   

    If you have changed certain window data using SetWindowLong, you must call SetWindowPos to have the changes take effect. Use the following combination for uFlags: SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED. 
      

  2.   

    ft,我照你的方法试过了,但是这个edit控件居然跳出来变成一个
    的窗口的标题,太诡异了,代码如下,这是怎么回事呀?       
    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);
      

  3.   

    SetWindowLong(hedit,GWL_STYLE,GetWindowLong(hDlg,GWL_STYLE)|ES_READONLY);
    中的hDlg应该是hedit吧!
      

  4.   

    EnableWindow()和ReadOnly还是不同的,我也想知道,帮你up
      

  5.   

    OH,SHIT
    居然放了这么白痴的一个错误,我已经改过来了,但是好像
    SetWindowPos(hedit,HWND_NOTOPMOST,0,0,100,100,SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);这一句不起作用
    edit窗口还是可以输入,到底怎么回事呀,那位大虾救救我吧。
      

  6.   

    1:
    设置只读干嘛要这么麻烦, 一句话就可以了:
    CEdit* pEdit=(CEdit*)GetDlgItem(IDC_EDIT);
    pEdit->SetReadOnly();
    2:
    要处理eidt的WM_LBUTTONDOWN,只能用子类化的办法。当然你也可以给edit设置一个control型的变量来达到目的,不过本质上是一样的。
      

  7.   

    呵呵,小弟到现在为止还没学过MFC呢,//blush
    其实我并不是一定要使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,高手呀,救救我呀!!!
      

  8.   

    webber84(糕鱼昏)是对的,SetReadOnly翻译成SDK就是发送EM_SETREADONLY消息:
    SendMessage(hEdit, EM_SETREADONLY, bReadOnly, 0L);
    bReadOnly 为 TRUE 就是设为只读。
      

  9.   

    但是我对于setwindowlong的疑问还是没有解决呀?
      

  10.   

    我在MSDN对ModifyStyle的解释中看到了这样一段话:
    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试试改变另外一种风格看能不能成功。