在 VC++ 中,我们可以通过调用 Invalidate() 函数来使指定的 STATIC 控件或某个 rect 区域重绘。这样可以确保界面的实时更新,以便用户能够看到最新的信息。
假设我们有一个 STATIC 控件,它用于显示从磁盘中选择的图片。我们将该 STATIC 控件与一个控件变量 m35_cpicture1 关联,以便在程序中处理和操作图片。
为了处理用户可能选错图片的情况,我们需要提供重新选择图片的功能。当用户点击“重新选择图片”按钮时,我们可以弹出一个文件选择对话框,让用户选择另一张图片。然后,我们将新选择的图片路径赋值给 m35_cpicture1 变量,以便 STATIC 控件显示新的图片。
以下是一个简单的示例代码,演示了如何在 VC++ 中实现上述功能:
cpp
#include <afxwin.h>
#include <iostream>
// 用于存储图片路径的控件变量
CStatic m35_cpicture1;
// “重新选择图片”按钮的 ID
const int ID_RESELECT = 1001;
// 图片文件的扩展名
const std::wstring EXT = L"bmp";
// 初始化函数
void init() {
// 创建一个对话框窗口
CDialogEx dlg;
dlg.Create(NULL, L"图片浏览器", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, 600, 400);
// 获取对话框窗口的客户区大小
CRect rect;
dlg.GetClientRect(&rect);
// 创建一个STATIC控件,并设置其位置和大小
m35_cpicture1.Create(L"", WS_CHILD | WS_VISIBLE | SS_BITMAP, rect, NULL, ID_RESELECT);
// 设置STATIC控件的图片
m35_cpicture1.LoadBitmapW(IDB_BITMAP1);
// 调整STATIC控件的大小以适应图片
CBitmap bitmap;
m35_cpicture1.GetBitmap(&bitmap);
CSize size = bitmap.GetBitmapDimension();
m35_cpicture1.SetWindowPos(NULL, 0, 0, size.cx, size.cy, SWP_NOMOVE | SWP_NOZORDER);
// 注册“重新选择图片”按钮的消息处理函数
dlg.SubclassDlgItem(ID_RESELECT, this);
// 显示对话框窗口
dlg.ShowWindow(SW_SHOW);
}
// “重新选择图片”按钮的消息处理函数
void OnReselect() {
// 显示文件选择对话框
CFileDialog dlgOpen(TRUE, EXT, NULL, OFN_FILEMUSTEXIST, L"图片 (*.bmp)|*.bmp||", NULL, NULL);
// 如果用户选择了文件
if (dlgOpen.DoModal() == IDOK) {
// 获取选择的文件路径
std::wstring path = dlgOpen.GetPathName();
// 显示图片
m35_cpicture1.LoadBitmapW(path.c_str());
m35_cpicture1.Invalidate();
}
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
// 初始化应用程序
init();
// 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
// 处理消息
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
在上面的代码中,我们首先创建了一个 CDialogEx 对话框窗口,并在其中创建了一个 STATIC 控件。然后,我们通过调用 LoadBitmapW() 函数加载了一张图片,并将其显示在 STATIC 控件中。
接下来,我们注册了“重新选择图片”按钮的消息处理函数 OnReselect()。当用户点击该按钮时,我们显示一个文件选择对话框,让用户选择另一张图片。然后,我们将新选择的图片路径赋值给 m35_cpicture1 变量,并调用 Invalidate() 函数使 STATIC 控件重绘,以显示新的图片。
最后,我们进入消息循环,等待用户操作。当用户关闭对话框窗口时,程序结束。