MFC CEdit 垂直居中

参考:

通过发送 EM_SETRECT 消息使 VC 编辑框 文本垂直居中

其实是发送 EM_SETRECT 消息改变输入字符串的位置

1.在Edit控件所在对话框 OnInitDialog 函数中增加代码

1     CRect rect;
2     GetDlgItem(IDC_EDIT1)->GetClientRect(&rect);
3     rect.OffsetRect(5, 30); //设置内容的左边距与上边距,大小自适取
4     ((CEdit*)GetDlgItem(IDC_EDIT1))->SetPasswordChar(_T('*')); //设置字符显示为密码模式
5     ::SendMessage(((CEdit*)GetDlgItem(IDC_EDIT1))->m_hWnd, EM_SETRECT, 0, (LPARAM)&rect);

2.修改Edit控件的属性Multiline 为 True

Multiline说明是“如果控件文本对控件宽度而言太长,则将文本折为多行” 听起来好像是智能一样,但无论是输入还是SetWindowText都是1行

多行是输入时ctrl+enter换行,在edit中输入enter响应的是对话框的enter消息

3.为edit实现单独的enter处理则重载PreTranslateMessage函数

 1 BOOL xxxDlg::PreTranslateMessage(MSG* pMsg)
 2 {
 3     // TODO: 在此添加专用代码和/或调用基类
 4     //int my_ID = GetWindowLong(pMsg->hwnd, GWL_ID);//消息发生的控件id
 5     //if (my_ID == GetDlgItem(IDC_EDIT1)->GetDlgCtrlID())//消息发生的控件id == edit的id
 6     CWnd* pCtrl = CWnd::GetFocus();//得到当前控件的句柄
 7     if (IDC_EDIT1 == pCtrl->GetDlgCtrlID())//已知的edit id == 当前控件的id
 8     {
 9         if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)//键盘 回车键
10         {
11             //在这里添加edit回车响应代码
12             return TRUE;
13         }
14     }
15     
16     return CDialogEx::PreTranslateMessage(pMsg);
17 }

此时在edit中输入回车和ctrl+回车都会被捕获了

但是断点打在12行,调试时有bug,调试正常停顿在12行,f5后说第7行内存冲突,但不调试时没发现问题

上面的getwindowLong没有这个问题

 

上一篇:业务驱动创新,ZKEYS更懂IDC企业


下一篇:Win32窗口控件的创建与响应