如何禁止选中CEDIT内的内容

时间:2021-06-04 19:28:35
我想禁止鼠标选中CEDIT里面的内容(包括ctrl+'A'),这个该怎么做?

18 个解决方案

#1


控件设置成Enable = false

#2


如果disable不够的话,子类化这个CEdit,然后屏蔽所以你不希望的操作

#3


键盘还要输入的呀.

#4


蓉蓉,做不到的。readonly也不行,enable也不行。没有办法啦。

#5


用子类化的方法,自己写一个Edit类,继承自CEdit,加入你自己的处理即可。

#6


除了写子类就没有别的方法了吗?

#7


你可以试试在PreTranslateMessage中拦截Ctrl+A,并屏蔽。

#8


if(pMsg->message==WM_KEYDOWN)
{ if(GetAsyncKeyState(VK_LCONTROL)&&(pMsg->wParam=='A'))
{
 return TRUE;
}
}

可以屏蔽Ctrl+A

#9


虽然屏蔽Ctrl+A,但是鼠标还是可以选中。要禁止鼠标选中的话,Disable那个控件才可以。但是你又需要键盘输入,那你只有自己写一个Edit类了。

#10


subclass 了。早跟你说了。。。。

#11


楼上的CTRL键有左右两个,另,我想搂住的意思是想不被选中,也就是要屏蔽CEdit::SetSel函数,我觉得是否在派生类中重载一下setsel函数就ok了呢? 

没有试验,不知道可行不

#12


setsel是重载的吗........

只有subclass,别无他法。或者自己写一个新的CXEdit类。

其实在subclass类里面,拦截所有的鼠标消息,过滤不需要的键盘消息,应该可以吧。没做过,呵呵。

#13


为什么不用CRichEditCtrl
HideSelection
用此函数隐藏试试

#14


子类化这个CEdit类.

/******************SubEdit.h************************************/
#if !defined(AFX_SUBEDIT_H__999D8DB4_CF48_4857_B86B_D5EEABE0279F__INCLUDED_)
#define AFX_SUBEDIT_H__999D8DB4_CF48_4857_B86B_D5EEABE0279F__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// SubEdit.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CSubEdit window

class CSubEdit : public CEdit
{
// Construction
public:
CSubEdit();

// Attributes
public:

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSubEdit)
//}}AFX_VIRTUAL

// Implementation
public:
virtual ~CSubEdit();

// Generated message map functions
protected:
//{{AFX_MSG(CSubEdit)
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_SUBEDIT_H__999D8DB4_CF48_4857_B86B_D5EEABE0279F__INCLUDED_)






/******************SubEdit.cpp**********************************/
// SubEdit.cpp : implementation file
//

#include "stdafx.h"
#include "Wgj.h"
#include "SubEdit.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSubEdit

CSubEdit::CSubEdit()
{
}

CSubEdit::~CSubEdit()
{
}


BEGIN_MESSAGE_MAP(CSubEdit, CEdit)
//{{AFX_MSG_MAP(CSubEdit)
ON_WM_CHAR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSubEdit message handlers

void CSubEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
// TODO: Add your message handler code here and/or call default
if(nChar>=0x30 && nChar<=0x39 || nChar=='.' || nChar==0x08)//0x08=回退键
{
CEdit::OnChar(nChar, nRepCnt, nFlags);
//只允许特定的按键通过


// nChar=nChar+0x10;
// DefWindowProc(WM_CHAR,(WPARAM)nChar,(LPARAM)(nRepCnt|(nFlags<<16)));
//此行却可以改变一个输入字符为其它字符
}
}

#15


SubClass,自己处理

#16


唉,看来只能写子类了

#17


不难,自己写个类吧。

#18


用CStatic吧.
标签控件, 不能选定了吧! 哈哈哈....

#1


控件设置成Enable = false

#2


如果disable不够的话,子类化这个CEdit,然后屏蔽所以你不希望的操作

#3


键盘还要输入的呀.

#4


蓉蓉,做不到的。readonly也不行,enable也不行。没有办法啦。

#5


用子类化的方法,自己写一个Edit类,继承自CEdit,加入你自己的处理即可。

#6


除了写子类就没有别的方法了吗?

#7


你可以试试在PreTranslateMessage中拦截Ctrl+A,并屏蔽。

#8


if(pMsg->message==WM_KEYDOWN)
{ if(GetAsyncKeyState(VK_LCONTROL)&&(pMsg->wParam=='A'))
{
 return TRUE;
}
}

可以屏蔽Ctrl+A

#9


虽然屏蔽Ctrl+A,但是鼠标还是可以选中。要禁止鼠标选中的话,Disable那个控件才可以。但是你又需要键盘输入,那你只有自己写一个Edit类了。

#10


subclass 了。早跟你说了。。。。

#11


楼上的CTRL键有左右两个,另,我想搂住的意思是想不被选中,也就是要屏蔽CEdit::SetSel函数,我觉得是否在派生类中重载一下setsel函数就ok了呢? 

没有试验,不知道可行不

#12


setsel是重载的吗........

只有subclass,别无他法。或者自己写一个新的CXEdit类。

其实在subclass类里面,拦截所有的鼠标消息,过滤不需要的键盘消息,应该可以吧。没做过,呵呵。

#13


为什么不用CRichEditCtrl
HideSelection
用此函数隐藏试试

#14


子类化这个CEdit类.

/******************SubEdit.h************************************/
#if !defined(AFX_SUBEDIT_H__999D8DB4_CF48_4857_B86B_D5EEABE0279F__INCLUDED_)
#define AFX_SUBEDIT_H__999D8DB4_CF48_4857_B86B_D5EEABE0279F__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// SubEdit.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CSubEdit window

class CSubEdit : public CEdit
{
// Construction
public:
CSubEdit();

// Attributes
public:

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSubEdit)
//}}AFX_VIRTUAL

// Implementation
public:
virtual ~CSubEdit();

// Generated message map functions
protected:
//{{AFX_MSG(CSubEdit)
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_SUBEDIT_H__999D8DB4_CF48_4857_B86B_D5EEABE0279F__INCLUDED_)






/******************SubEdit.cpp**********************************/
// SubEdit.cpp : implementation file
//

#include "stdafx.h"
#include "Wgj.h"
#include "SubEdit.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSubEdit

CSubEdit::CSubEdit()
{
}

CSubEdit::~CSubEdit()
{
}


BEGIN_MESSAGE_MAP(CSubEdit, CEdit)
//{{AFX_MSG_MAP(CSubEdit)
ON_WM_CHAR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSubEdit message handlers

void CSubEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
// TODO: Add your message handler code here and/or call default
if(nChar>=0x30 && nChar<=0x39 || nChar=='.' || nChar==0x08)//0x08=回退键
{
CEdit::OnChar(nChar, nRepCnt, nFlags);
//只允许特定的按键通过


// nChar=nChar+0x10;
// DefWindowProc(WM_CHAR,(WPARAM)nChar,(LPARAM)(nRepCnt|(nFlags<<16)));
//此行却可以改变一个输入字符为其它字符
}
}

#15


SubClass,自己处理

#16


唉,看来只能写子类了

#17


不难,自己写个类吧。

#18


用CStatic吧.
标签控件, 不能选定了吧! 哈哈哈....