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);
}
{
// TODO: 在此添加专用代码和/或调用基类
if(pMsg->message == WM_KEYDOWN)
{
if (pMsg->hwnd == GetDlgItem(IDC_Edit控件ID)->m_hWnd)
{
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
#3
你好,感谢你的回复
我希望最好能子类化CEdit然后添加一个比如SetEditable的方法来实现,不然像你这样做的话,如果很多界面都有这个要求就麻烦了。
#4
正如你说的,派生CEdit一个类,设置一个可输入控制的bool变量,在ON_WM_CHAR()消息中如果不允许输入时,直接return就行了
#5
方法1:
先设置ES_READONLY或EnableWindow,会变灰,然后在CEdit的CtlColor里返回一个指定的背景画刷.(对应父窗口的WM_CTLCOLOR,但不是EDIT控件的WM_CTLCOLOR)
方法2:
直接用EnableWindow禁止Edit控件的父窗口
先设置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......
我先以为可以使用鼠标穿透解决, 但是你需要鼠标能用, 那就用种方法不行, 只有过虑所有键盘消息.
WM_KEYDOWN, WM_KEYUP, WM_COPY, WM_CHAR......
我先以为可以使用鼠标穿透解决, 但是你需要鼠标能用, 那就用种方法不行, 只有过虑所有键盘消息.
#12
OnChar捕捉不了Delete键,也就无法达到不可编辑的效果了
方法1应该可以,只不过后半句看不太懂。。。
这样背景就变灰了
但是我希望鼠标还能用,能拖拉选中文字,然后右键复制这样的
那我要初始化显示一些文字不就不行了嘛
恩,没错,你还提醒到我过滤一个WM_PASTE。。。。。
#13
昏死在键盘上,把这个放到你子类化的Edit里面去不就OK了嘛 。
#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);
}
{
// TODO: 在此添加专用代码和/或调用基类
if(pMsg->message == WM_KEYDOWN)
{
if (pMsg->hwnd == GetDlgItem(IDC_Edit控件ID)->m_hWnd)
{
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
#3
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控件的父窗口
先设置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......
我先以为可以使用鼠标穿透解决, 但是你需要鼠标能用, 那就用种方法不行, 只有过虑所有键盘消息.
WM_KEYDOWN, WM_KEYUP, WM_COPY, WM_CHAR......
我先以为可以使用鼠标穿透解决, 但是你需要鼠标能用, 那就用种方法不行, 只有过虑所有键盘消息.
#12
正如你说的,派生CEdit一个类,设置一个可输入控制的bool变量,在ON_WM_CHAR()消息中如果不允许输入时,直接return就行了
OnChar捕捉不了Delete键,也就无法达到不可编辑的效果了
方法1:
先设置ES_READONLY或EnableWindow,会变灰,然后在CEdit的CtlColor里返回一个指定的背景画刷.(对应父窗口的WM_CTLCOLOR,但不是EDIT控件的WM_CTLCOLOR)
方法2:
直接用EnableWindow禁止Edit控件的父窗口
方法1应该可以,只不过后半句看不太懂。。。
CEdit::SetReadOnly()
这样背景就变灰了
不就是不让写嘛,写的前题是Edit控件得到光标,不让写就不让光标停留就行了,响应 EN_SETFOCUS 消息,将焦点转掉,保你写不成。例如:
void CTestDlg::OnEnSetfocusEdit1()
{
// TODO: 在此添加控件通知处理程序代码
GetDlgItem(IDC_BUTTON1)->SetFocus();
}
能不能将最大长度设置为0来的!!?
子类化一个编辑框, 过虑掉所有键盘消息, 只保留鼠标消息.
WM_KEYDOWN, WM_KEYUP, WM_COPY, WM_CHAR......
我先以为可以使用鼠标穿透解决, 但是你需要鼠标能用, 那就用种方法不行, 只有过虑所有键盘消息.
#13
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了嘛 。