Edit Control响应全选(Ctrl+A)

MFC中的Edit控件用于输入数据,当输入的数据为大段数字的时候,全选功能就显得非常重要了,可偏偏在MFC中Edit控件就不 支持全选。Ctrl+A不行,双击也不行。

Ctrl+C和Ctrl+V都是默认支持的。因此为了使用方便,我们仅仅能自己让Edit去支持Ctrl+A全选 功能了。

实现的方式也比較简单,自己处理消息就是!

Ctrl+A是一个组合消息,在检測到A或者a按键按下的时候。推断Ctrl键的状态,假设Ctrl键有效则说明用户按下了Ctrl+A按键,这时候我们将Edit中内容设置为全选就可以。


在类定义中加入:

BOOL PreTranslateMessage(MSG* pMsg);

实现例如以下:

<span style="color:#444444;">BOOL C***Dlg::PreTranslateMessage(MSG* pMsg)
{
	if (pMsg->message == WM_KEYDOWN)
	{
		BOOL bCtrl = ::GetKeyState(VK_CONTROL) & 0x80;
		//BOOL bShift = ::GetKeyState(VK_SHIFT) & 0x80;
		//BOOL bAlt = ::GetKeyState(VK_MENU) & 0x80;

		switch (pMsg->wParam)
		{
		case 'a':
		case 'A':
			if (bCtrl)
			{
				</span><span style="color:#ff0000;">m_ctrLog.SetSel(0, -1); //或 SendDlgItemMessage(IDC_Log, EM_SETSEL, 0, -1);</span><span style="color:#444444;">
			}
			break;
		}
	}

	return CWnd::PreTranslateMessage(pMsg);
}</span>

或:

BOOL C***Dlg::PreTranslateMessage(MSG* pMsg)
{
	if(pMsg->message == WM_KEYDOWN)
	{
		BOOL b = GetKeyState(VK_CONTROL) & 0×80;
		if(b && (pMsg->wParam==’a'||pMsg->wParam==’A'))
		{
			<span style="color:#ff0000;">SetSel(0,-1);	//或 SendDlgItemMessage(IDC_Log, EM_SETSEL, 0, -1);</span>
			return TRUE;
		}
	}

	return CWnd::PreTranslateMessage(pMsg);
}

备注:

为了避免对使用的Edit一个个的进行处理,能够通过从CEdit类派生一个新类CEditEx类让Edit支持Ctrl+A全选功能。


另外:

Ctrl + A 实现循环 全选/取消全选。尽管取消全选非常easy,一句话SetSel(-1),但难点在于怎样推断取消全选的条件。代码例如以下:

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

新建一个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/yfceshi/p/7294699.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误是由于在编译过程遇到了一个关于图像颜色配置的问题。根据引用\[1\]和引用\[2\]的描述,这个错误可能是由于图像的颜色配置文件被编辑过而导致的。这个问题可能会影响到Android源码下所有应用的所有图片资源。 为了解决这个问题,你可以尝试以下几个步骤: 1. 检查你的图像资源文件,确保它们的颜色配置文件没有被编辑过。如果有被编辑过的文件,尝试使用原始的未编辑过的文件替换它们。 2. 检查你的编译配置文件,比如引用\[3\]的`build.gradle`文件。确保`aaptOptions.cruncherEnabled`和`aaptOptions.useNewCruncher`这两个选项都被设置为`false`。这样可以禁用资源压缩功能,避免进一步影响图像的颜色配置。 3. 如果以上步骤都没有解决问题,你可以尝试更新你的Android编译工具版本。确保你使用的是最新的编译工具版本,可能会修复一些已知的问题。 希望以上解决方案能够帮助你解决这个问题。如果问题仍然存在,请提供更多的详细信息,以便我们能够更好地帮助你解决问题。 #### 引用[.reference_title] - *1* *3* [libpng warning: iCCP: Not recognizing known sRGB profile that has been edited](https://blog.csdn.net/qq_20670449/article/details/51576621)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [libpng warning: iCCP: Not recognizing known sRGB profile that has been edite](https://blog.csdn.net/b1480521874/article/details/80527390)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值