参考:
通过发送 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函数
此时在edit中输入回车和ctrl+回车都会被捕获了
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 CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1); 7 if (pMsg->hwnd == pEdit->GetSafeHwnd()) 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 }