我的MFC程序中edit ctrl编辑框 (已绑定控件类型变量m_Edit)显示的是某一个全局变量的值,当全局变量的值被某个线程修改后,编辑框的内容也立即增加全局变量最新的值(保留以前显示的值),如何实现?
时间: 2023-06-26 08:07:13 浏览: 91
可以使用消息机制来实现。当全局变量被修改时,向主线程发送一个自定义消息,主线程接收到消息后更新编辑框的内容即可。
具体实现步骤如下:
1. 定义一个自定义消息,在程序初始化时注册该消息:
```cpp
const UINT WM_UPDATE_EDIT_CTRL = WM_USER + 1;
```
2. 在主线程的消息循环中添加对自定义消息的处理:
```cpp
// 处理自定义消息
case WM_UPDATE_EDIT_CTRL:
{
// 更新编辑框内容
CString strText;
m_Edit.GetWindowText(strText);
strText += CString::Format(_T("\r\n%d"), g_nGlobalVar); // 增加最新的值
m_Edit.SetWindowText(strText);
break;
}
```
3. 在全局变量被修改的地方,向主线程发送自定义消息:
```cpp
// 修改全局变量
g_nGlobalVar = nNewValue;
// 发送自定义消息
::PostMessage(hWndMain, WM_UPDATE_EDIT_CTRL, 0, 0);
```
其中,`hWndMain`为主窗口句柄,可通过`AfxGetMainWnd()->GetSafeHwnd()`获取。
这样,当全局变量被修改时,主线程会收到自定义消息并更新编辑框内容,保留以前显示的值。
相关问题
MFC如何去掉Edit编辑框控件默认右键菜单
要去掉MFC中Edit编辑框控件的默认右键菜单,可以通过以下步骤实现:
1. 在资源编辑器中选中Edit控件。
2. 在属性窗口中找到"ContextMenu"属性,将其设置为"None"。
3. 在MFC类文件中找到Edit控件的变量声明,例如"CEdit m_edit;"。
4. 在类的OnInitDialog函数中添加以下代码:
BOOL bRet = CDialogEx::OnInitDialog();
m_edit.ModifyStyle(0, ES_NOHIDESEL); // 去掉选中文本后的灰色背景
m_edit.ModifyStyleEx(0, WS_EX_CLIENTEDGE); // 添加边框
m_edit.SetWindowTextW(_T("")); // 清空文本
CMenu* pMenu = m_edit.GetContextMenu(); // 获取右键菜单
if (pMenu != NULL)
{
pMenu->DestroyMenu(); // 销毁右键菜单
}
以上代码中,ES_NOHIDESEL表示去掉选中文本后的灰色背景,WS_EX_CLIENTEDGE表示添加边框,SetWindowTextW函数用于清空文本,GetContextMenu函数用于获取右键菜单,DestroyMenu函数用于销毁右键菜单。
C++ MFC 编辑框控件与CString类型的值变量m_second进行DDX绑定。当焦点离开改控件后,程序将m_second的值转为int变量second,如果转换失败,提醒用户“应输入数值”,如果转换成功,检查second的值是否在0到59(两侧能取到)之间
首先,在对话框的.h文件中声明变量m_second和second:
```cpp
class CMyDialog : public CDialogEx
{
// ...
private:
CString m_second;
int second;
// ...
};
```
然后,在对话框的.rc文件中添加一个编辑框控件:
```xml
CONTROL "",IDC_EDIT_SECOND,"EDIT",ES_AUTOHSCROLL | ES_NUMBER | WS_BORDER,15,80,40,14
```
在对话框的.cpp文件中,通过DDX_Control函数和IDC_EDIT_SECOND控件ID将编辑框控件与变量m_second绑定:
```cpp
void CMyDialog::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
// ...
DDX_Control(pDX, IDC_EDIT_SECOND, m_editSecond);
DDX_Text(pDX, IDC_EDIT_SECOND, m_second);
// ...
}
```
接下来,在控件失去焦点的消息响应函数里,将m_second的值转为int变量second,并检查其值是否在0到59之间:
```cpp
void CMyDialog::OnEnKillfocusEditSecond()
{
UpdateData(TRUE);
CString strTemp;
int nTemp = 0;
if (!m_second.IsEmpty())
{
nTemp = _ttoi(m_second);
if (nTemp < 0 || nTemp > 59)
{
strTemp.Format(_T("输入有误,应输入0到59之间的数字!"));
MessageBox(strTemp);
nTemp = 0;
}
}
second = nTemp;
UpdateData(FALSE);
}
```
其中,_ttoi函数用于将CString类型的值转为int类型的值。如果转换失败,返回0。如果转换成功,检查其值是否在0到59之间,若不在,则弹出提示框提醒用户重新输入。
最后,记得在OnInitDialog函数中初始化m_second和second变量:
```cpp
BOOL CMyDialog::OnInitDialog()
{
CDialogEx::OnInitDialog();
// ...
m_second = _T("0");
second = _ttoi(m_second);
UpdateData(FALSE);
// ...
}
```