如何让CEdit无法编辑且不变灰

时间:2021-08-10 05:48:13
一个Edit如何要满足如下要求:
1.不变灰,所以不能设为只读状态
2.无法编辑但是初始时要显示或多或少的内容(带滚动条),且可以用鼠标拖拉来选中文字

我现在纠结的问题是:
1.重写其OnKeyDown和OnKeyUp,直接return也无效,调试发现代码是跑进去了,但是依然可以编辑
2.重写OnChar却捕捉不了回退键BackSpace
3.重写EN_CHANGE也直接return的话,我要让他初始显示或多或少的内容就做不到了吧,另外就是不知道怎么重写EN_CHANGE的消息映射,也不知道OnChange的参数有哪些。。。

求大神帮忙

13 个解决方案

#1


我自己也不会,帮楼主顶下!

#2


BOOL CXXXXXDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类

if(pMsg->message  == WM_KEYDOWN)
{
if (pMsg->hwnd == GetDlgItem(IDC_Edit控件ID)->m_hWnd)
{
return  TRUE;
}
}

return CDialog::PreTranslateMessage(pMsg);
}

#3


引用 2 楼 smilecabbage 的回复:
BOOL CXXXXXDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类

if(pMsg->message  == WM_KEYDOWN)
{
if (pMsg->hwnd == GetDlgItem(IDC_Edit控件ID)->m_hWnd)
{
return  TRUE;
}
}

return CDialog::PreTranslateMessage(pMsg);
}

你好,感谢你的回复
我希望最好能子类化CEdit然后添加一个比如SetEditable的方法来实现,不然像你这样做的话,如果很多界面都有这个要求就麻烦了。

#4


正如你说的,派生CEdit一个类,设置一个可输入控制的bool变量,在ON_WM_CHAR()消息中如果不允许输入时,直接return就行了

#5


方法1:
先设置ES_READONLY或EnableWindow,会变灰,然后在CEdit的CtlColor里返回一个指定的背景画刷.(对应父窗口的WM_CTLCOLOR,但不是EDIT控件的WM_CTLCOLOR)

方法2:
直接用EnableWindow禁止Edit控件的父窗口

#6


CEdit::SetReadOnly()

#7


不就是不让写嘛,写的前题是Edit控件得到光标,不让写就不让光标停留就行了,响应 EN_SETFOCUS 消息,将焦点转掉,保你写不成。例如:

void CTestDlg::OnEnSetfocusEdit1()
{
// TODO: 在此添加控件通知处理程序代码
GetDlgItem(IDC_BUTTON1)->SetFocus();
}

#8


不懂,看了上面的,学习了。

#9


LS几位都是答案

#10


能不能将最大长度设置为0来的!!?

#11


子类化一个编辑框,  过虑掉所有键盘消息, 只保留鼠标消息.
WM_KEYDOWN, WM_KEYUP,  WM_COPY, WM_CHAR......

我先以为可以使用鼠标穿透解决, 但是你需要鼠标能用, 那就用种方法不行, 只有过虑所有键盘消息.

#12


引用 4 楼 sxqinge 的回复:
正如你说的,派生CEdit一个类,设置一个可输入控制的bool变量,在ON_WM_CHAR()消息中如果不允许输入时,直接return就行了

OnChar捕捉不了Delete键,也就无法达到不可编辑的效果了



引用 5 楼 CometNet 的回复:
方法1:
先设置ES_READONLY或EnableWindow,会变灰,然后在CEdit的CtlColor里返回一个指定的背景画刷.(对应父窗口的WM_CTLCOLOR,但不是EDIT控件的WM_CTLCOLOR)

方法2:
直接用EnableWindow禁止Edit控件的父窗口

方法1应该可以,只不过后半句看不太懂。。。

引用 6 楼 VisualEleven 的回复:
CEdit::SetReadOnly()

这样背景就变灰了

引用 7 楼 wxhxj0268 的回复:
不就是不让写嘛,写的前题是Edit控件得到光标,不让写就不让光标停留就行了,响应 EN_SETFOCUS 消息,将焦点转掉,保你写不成。例如:

void CTestDlg::OnEnSetfocusEdit1()
{
// TODO: 在此添加控件通知处理程序代码
GetDlgItem(IDC_BUTTON1)->SetFocus();
}
但是我希望鼠标还能用,能拖拉选中文字,然后右键复制这样的

引用 10 楼 modyaj 的回复:
能不能将最大长度设置为0来的!!?
那我要初始化显示一些文字不就不行了嘛

引用 11 楼 xiaohuh421 的回复:
子类化一个编辑框,  过虑掉所有键盘消息, 只保留鼠标消息.
WM_KEYDOWN, WM_KEYUP,  WM_COPY, WM_CHAR......

我先以为可以使用鼠标穿透解决, 但是你需要鼠标能用, 那就用种方法不行, 只有过虑所有键盘消息.
恩,没错,你还提醒到我过滤一个WM_PASTE。。。。。

#13


引用 3 楼 Me_Not_You 的回复:
Quote: 引用 2 楼 smilecabbage 的回复:

BOOL CXXXXXDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类

if(pMsg->message  == WM_KEYDOWN)
{
if (pMsg->hwnd == GetDlgItem(IDC_Edit控件ID)->m_hWnd)
{
return  TRUE;
}
}

return CDialog::PreTranslateMessage(pMsg);
}

你好,感谢你的回复
我希望最好能子类化CEdit然后添加一个比如SetEditable的方法来实现,不然像你这样做的话,如果很多界面都有这个要求就麻烦了。

昏死在键盘上,把这个放到你子类化的Edit里面去不就OK了嘛  。 如何让CEdit无法编辑且不变灰

#1


我自己也不会,帮楼主顶下!

#2


BOOL CXXXXXDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类

if(pMsg->message  == WM_KEYDOWN)
{
if (pMsg->hwnd == GetDlgItem(IDC_Edit控件ID)->m_hWnd)
{
return  TRUE;
}
}

return CDialog::PreTranslateMessage(pMsg);
}

#3


引用 2 楼 smilecabbage 的回复:
BOOL CXXXXXDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类

if(pMsg->message  == WM_KEYDOWN)
{
if (pMsg->hwnd == GetDlgItem(IDC_Edit控件ID)->m_hWnd)
{
return  TRUE;
}
}

return CDialog::PreTranslateMessage(pMsg);
}

你好,感谢你的回复
我希望最好能子类化CEdit然后添加一个比如SetEditable的方法来实现,不然像你这样做的话,如果很多界面都有这个要求就麻烦了。

#4


正如你说的,派生CEdit一个类,设置一个可输入控制的bool变量,在ON_WM_CHAR()消息中如果不允许输入时,直接return就行了

#5


方法1:
先设置ES_READONLY或EnableWindow,会变灰,然后在CEdit的CtlColor里返回一个指定的背景画刷.(对应父窗口的WM_CTLCOLOR,但不是EDIT控件的WM_CTLCOLOR)

方法2:
直接用EnableWindow禁止Edit控件的父窗口

#6


CEdit::SetReadOnly()

#7


不就是不让写嘛,写的前题是Edit控件得到光标,不让写就不让光标停留就行了,响应 EN_SETFOCUS 消息,将焦点转掉,保你写不成。例如:

void CTestDlg::OnEnSetfocusEdit1()
{
// TODO: 在此添加控件通知处理程序代码
GetDlgItem(IDC_BUTTON1)->SetFocus();
}

#8


不懂,看了上面的,学习了。

#9


LS几位都是答案

#10


能不能将最大长度设置为0来的!!?

#11


子类化一个编辑框,  过虑掉所有键盘消息, 只保留鼠标消息.
WM_KEYDOWN, WM_KEYUP,  WM_COPY, WM_CHAR......

我先以为可以使用鼠标穿透解决, 但是你需要鼠标能用, 那就用种方法不行, 只有过虑所有键盘消息.

#12


引用 4 楼 sxqinge 的回复:
正如你说的,派生CEdit一个类,设置一个可输入控制的bool变量,在ON_WM_CHAR()消息中如果不允许输入时,直接return就行了

OnChar捕捉不了Delete键,也就无法达到不可编辑的效果了



引用 5 楼 CometNet 的回复:
方法1:
先设置ES_READONLY或EnableWindow,会变灰,然后在CEdit的CtlColor里返回一个指定的背景画刷.(对应父窗口的WM_CTLCOLOR,但不是EDIT控件的WM_CTLCOLOR)

方法2:
直接用EnableWindow禁止Edit控件的父窗口

方法1应该可以,只不过后半句看不太懂。。。

引用 6 楼 VisualEleven 的回复:
CEdit::SetReadOnly()

这样背景就变灰了

引用 7 楼 wxhxj0268 的回复:
不就是不让写嘛,写的前题是Edit控件得到光标,不让写就不让光标停留就行了,响应 EN_SETFOCUS 消息,将焦点转掉,保你写不成。例如:

void CTestDlg::OnEnSetfocusEdit1()
{
// TODO: 在此添加控件通知处理程序代码
GetDlgItem(IDC_BUTTON1)->SetFocus();
}
但是我希望鼠标还能用,能拖拉选中文字,然后右键复制这样的

引用 10 楼 modyaj 的回复:
能不能将最大长度设置为0来的!!?
那我要初始化显示一些文字不就不行了嘛

引用 11 楼 xiaohuh421 的回复:
子类化一个编辑框,  过虑掉所有键盘消息, 只保留鼠标消息.
WM_KEYDOWN, WM_KEYUP,  WM_COPY, WM_CHAR......

我先以为可以使用鼠标穿透解决, 但是你需要鼠标能用, 那就用种方法不行, 只有过虑所有键盘消息.
恩,没错,你还提醒到我过滤一个WM_PASTE。。。。。

#13


引用 3 楼 Me_Not_You 的回复:
Quote: 引用 2 楼 smilecabbage 的回复:

BOOL CXXXXXDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类

if(pMsg->message  == WM_KEYDOWN)
{
if (pMsg->hwnd == GetDlgItem(IDC_Edit控件ID)->m_hWnd)
{
return  TRUE;
}
}

return CDialog::PreTranslateMessage(pMsg);
}

你好,感谢你的回复
我希望最好能子类化CEdit然后添加一个比如SetEditable的方法来实现,不然像你这样做的话,如果很多界面都有这个要求就麻烦了。

昏死在键盘上,把这个放到你子类化的Edit里面去不就OK了嘛  。 如何让CEdit无法编辑且不变灰