【问题标题】:displaying a text in a window with C++ Win32 GUI使用 C++ Win32 GUI 在窗口中显示文本
【发布时间】:2014-01-15 09:55:13
【问题描述】:

起初对不起我的英语:)

我有一个小问题。

我有一个用 C++ 编写的程序,它解析 JavaScript 文件以找到一些关键字。

我有一个主窗口和一个主菜单,当你点击菜单->打开文件夹时,你需要选择你的文件夹。 在此之后,我恢复此文件夹中的所有文件以打开它,阅读它以找到我的关键字。 当一切就绪时,我在子窗口中显示结果。 我想添加一个弹出窗口,显示“加载中,请稍候”之类的文本,但我有一个小问题。

这是我的代码:

// creating a "popup" display a text while loading
MainWindow::m_hwndResLoading = CreateWindow(   "edit",
    "",
    WS_VISIBLE|ES_MULTILINE|ES_READONLY|WS_OVERLAPPED,
    0,
    0,
    400,
    200,
    hwnd,
    NULL,
    NULL,
    NULL);

// creating my str, and asking my m_hwndLoading to display my text
string loading = "Chargement";
SetWindowText(MainWindow::m_hwndResLoading,TEXT(loading.c_str()));

MainWindow::projectPath = path;

// this function find every files in a specified directory which is source code file
getAllFile(path);

// creating my childwindow which will contain the result of the files parsing
MainWindow::m_hwndRes = CreateWindow(   "edit",
    "",
    WS_VISIBLE|WS_CHILD|WS_BORDER|
    WS_VSCROLL|WS_HSCROLL|ES_MULTILINE|
    ES_AUTOHSCROLL|ES_AUTOVSCROLL|ES_READONLY,
    0,
    0,
    1000,
    600,
    hwnd,
    NULL,
    NULL,
    NULL);

// create and instanciate my object
FileParser *fp;
fp = new FileParser();
string res = fp->init(files);

// close my loading "popup"
CloseWindow(MainWindow::m_hwndResLoading);

// display the result in my child window
SetWindowText(MainWindow::m_hwndRes,TEXT(res.c_str()));

当我运行应用程序时,当我打开新文件夹时,我的“弹出窗口”正在显示,但没有加载文本。 解析完成后,一切正常,弹出窗口关闭,子窗口填充结果。

我看到了,如果我评论这一行:

CloseWindow(MainWindow::m_hwndResLoading);

加载文本与结果在同一时刻显示。

有没有人有什么小想法可以帮帮我?

非常感谢

【问题讨论】:

  • 如果没有消息循环,就不会进行绘画。您可以使用UpdateWindow 强制立即绘制窗口(例如,您可以在调用SetWindowText 之后使用它)。

标签: c++ winapi user-interface text window


【解决方案1】:

我认为问题是缺少 (win32) 消息处理。我假设您在代码的某处有一个消息处理循环(如TranslateMessageDispatchMessage 等)?

我认为您的问题是您没有在弹出窗口创建和长时间加载例程之间处理消息(在这种情况下可能是 REPAINT 消息)。这就是为什么您的弹出窗口不绘制并且应用程序冻结的原因。尝试在CreateWindowFileParser::init 之间插入消息处理调用。

【讨论】:

  • 但是如果在init之前有消息循环,那么具体什么时候调用init代码呢?
  • @manuell:也许我不清楚:当我指的是消息循环时,我的意思是处理队列中的每条消息,然后继续 init——不要等待新消息。
  • @Antoine 好的,太好了,你救了我的命!我在我的代码中添加了这个 SendMessage(m_hwndResLoading,WM_PAINT,0,0);
  • @user3197506:永远不要将 WM_PAINT 消息直接发送到窗口。使用 InvalidateRect(m_hwndResLoading, NULL, TRUE/FALSE),最后一个参数表示是否要重新绘制背景。
猜你喜欢
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
  • 2020-08-01
  • 1970-01-01
相关资源
最近更新 更多