mfc刷新dialog对话框
时间: 2023-07-22 10:04:36 浏览: 252
在 MFC 中,可以通过以下两种方式来刷新对话框:
1. 调用 `Invalidate()` 函数。
```
Invalidate();
UpdateWindow();
```
这会使对话框的 `OnPaint()` 函数被调用,从而更新对话框的显示。
2. 调用 `UpdateData(FALSE)` 函数。
```
UpdateData(FALSE);
```
这会使对话框中的控件重新从对应的变量中读取数据,并更新显示。注意,如果你修改了控件中的数据,需要先调用 `UpdateData(TRUE)` 函数将数据写回到对应的变量中。
一般情况下,推荐使用第二种方式刷新对话框,因为它比第一种方式更方便,而且能够保持对话框中控件的状态不变。
相关问题
MFC设计一个对话框退出时显示自绘的进度条,直到新的对话框弹出,进度条消失。这个进度条同样可以在多个对话框切换时使用。写出多个方法,比较清楚详细的代码,包括怎么自绘进度条。
在MFC (Microsoft Foundation Classes) 中创建一个可以跨对话框使用的进度条通常涉及到定制窗口、消息处理以及在适当的时候绘制进度条。这里是一个简化的示例,展示如何在一个基类对话框上添加进度条,并在子类中使用:
1. 首先,在一个公共头文件 `ProgressCommon.h` 中定义一个 `CPgProgressDialog` 类,用于管理进度条的基本属性:
```cpp
// ProgressCommon.h
#pragma once
class CPgProgressDialog : public CDialogEx
{
public:
enum { IDD = IDD_DIALOG_PROGRESS };
protected:
CProgressCtrl m_ProgressBar; // 创建进度条控件
DECLARE_MESSAGE_MAP()
public:
virtual void OnPaint();
virtual BOOL OnInitDialog();
// 其他方法,比如开始/结束更新进度等...
};
```
2. 然后在 `ProgressCommon.cpp` 文件中实现这两个方法:
```cpp
// ProgressCommon.cpp
#include "ProgressCommon.h"
BEGIN_MESSAGE_MAP(CPgProgressDialog, CDialogEx)
ON_WM_PAINT()
ON_INIT_DIALOG()
END_MESSAGE_MAP()
void CPgProgressDialog::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将进度条添加到对话框布局
int x, y;
GetDlgItemRect(IDC_PROGRESS1, &x, &y);
m_ProgressBar.Create(_T("IDC_PROGRESS1"), CRect(x, y, x + 200, y + 50), this, WS_VISIBLE | CBS_NORMAL);
}
void CPgProgressDialog::OnPaint()
{
if (!IsIconic())
{
CPaintDC dc(this); // 创建设备上下文
// 在对话框重绘时绘制进度条
CDC* memDC = new CDC(dc); // 创建内存DC
memDC->SelectObject(&m_ProgressBar.GetSafeHdc()); // 选择进度条的设备上下文
memDC->DrawProgress(m_CurrentProgress / 100.0f, 0, 100, RGB(255, 0, 0)); // 绘制进度
delete memDC; // 删除内存DC
}
CDialogEx::OnPaint();
}
```
3. 在需要使用进度条的对话框中,只需继承 `CPgProgressDialog` 并覆盖相应部分即可:
```cpp
// ChildDialog.h
class CDlgChild : public CPgProgressDialog
{
public:
// 添加更多对话框特有的数据和方法
};
// ChildDialog.cpp
CDlgChild::CDlgChild()
{
// 设置进度条初始值或其他设置...
}
void CDlgChild::DoSomethingAsync(int totalSteps)
{
// 执行异步任务并更新进度...
}
```
在这个例子中,当 `CDlgChild` 对话框打开时,会自动显示进度条。在 `DoSomethingAsync` 或其他耗时操作中,你可以更新进度并在 `OnPaint` 被调用时刷新进度条。
阅读全文