实现编辑框的全选和取消全选

对于一个编辑框,实现它的全选和取消全选(前提:该编辑框获得焦点)

新建一个dialog based MFC application, 命名为“d1”,界面如下:

为对话框类添加一个成员变量:bool m_bSelectAll;用于控制全选状态。另外重载对话框类的PreTranslateMessage事件,添加如下代码:

BOOL CD1Dlg::PreTranslateMessage(MSG* pMsg) 
{
	if((GetAsyncKeyState(VK_CONTROL) & 0x8000) && (GetAsyncKeyState('A') & 0x8000) && pMsg->hwnd == m_pEdit->m_hWnd)
	{
		if(m_bSelectAll)
		{
			m_pEdit->SetSel(-1);			// 取消全选
		}
		else
		{
			m_pEdit->SetSel(0, -1);			// 全选
		}
		m_bSelectAll = !m_bSelectAll;
		return TRUE;
	}
	
	return CDialog::PreTranslateMessage(pMsg);
}

这样,当编辑框获得焦点时,如果再按下Ctrl+A,编辑框的内容就会被“全选”或“取消全选”。

 

但是上面以m_bSelectAll来作为判断是否“已经处于全选”状态有个问题,那就是当全选时,用户点击编辑框而取消了全选,但这时,m_bSelectAll却还处于全选状态,也就是说这个标志(m_bSelectAll)与实际的全选状态不一致。所以采用了另外的方法来验证是否处于全选状态(就是选中内容的长度与编辑框内容长度是否一致),代码如下:

BOOL CD1Dlg::PreTranslateMessage(MSG* pMsg) 
{
	if(pMsg->hwnd == m_pEdit->m_hWnd && (GetAsyncKeyState(VK_CONTROL) & 0x8000) && (GetAsyncKeyState(_T('A')) & 0x8000))
	{
		CString txt;
		int start, end;
		
		m_pEdit->GetWindowText(txt);
		m_pEdit->GetSel(start, end);
		if(txt.GetLength() == end - start)	// 处于全选状态
		{
			m_pEdit->SetSel(-1);			// 取消全选
		}
		else
		{
			m_pEdit->SetSel(0, -1);			// 全选
		}
		return TRUE;
	}
	
	return CDialog::PreTranslateMessage(pMsg);
}

 

 

说明:GetAsyncKeyState()只检查一个键是否被按下,而不区分大小写!

转载于:https://www.cnblogs.com/joeblackzqq/archive/2010/11/14/1877288.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值