非模式对话框的一个奇怪问题

问题描述 投票:0回答:1

我已经解决了问题!在程序的原始版本中,我在长循环中调用 PeekMessage(),使用 PM_REMOVE 过滤 WM_KEYDOWN 并检查 VK_ESCAPE。我收到反馈说我正在停止消息循环,因此我将 PeekMessage() 调用更改为根本不进行过滤,然后检查 WM_KEYDOWN 和 VK_ESCAPE。问题解决了。无论在调试模式还是非调试模式下,代码都不再冻结。

// Check for ESC pressed - Abort if so.
MSG msg;
if (!PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) continue;
if (msg.message != WM_KEYDOWN || msg.wParam != VK_ESCAPE) continue;
pCHashedFiles->Reset();
bEscapePressed = true;
break;

我保留原来的帖子,以供参考......

我在使用非模式对话框时遇到问题。我有一个循环扫描目录中的文件,将文件添加到链接列表类以供以后处理,使用无模式对话框作为进度框。当我使用调试器 F5 运行时,它工作正常。当我在没有调试器的情况下运行 Ctrl-F5 时,该框在五秒后停止更新,鼠标光标变为沙漏,窗口右上角的“X”按钮变为暗红色。这种情况一直持续到循环完成为止,此时程序将正常继续。

我已将代码合并为一个简单的示例,说明正在发生的情况,仅使用对话框和循环,它只是计数到 100,迭代之间有 100 毫秒的延迟。

这是我的全局变量...

HWND hwndDialog1;
HDC dc;
UINT_PTR upTimer;
int wmId;
HDC hdc;

这是 Windows 进程...

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CREATE:
        hwndDialog1 = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, NULL);
        break;
    
    case WM_COMMAND:
        wmId = LOWORD(wParam);
        // Parse the menu selections:
        switch (wmId)
        {
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        case ID_TEST_FIRE:
            dc = GetDC(hwndDialog1);
            ShowWindow(hwndDialog1, SW_SHOW);
            TCHAR sz[5];
            for (int i = 1; i <= 100; ++i)
            {
                StringCchPrintf(sz, 5, _T("%d"), i);
                SetBkColor(dc, RGB(240, 240, 240));
                TextOut(dc, 50, 50, sz, lstrlen(sz));
                Sleep(100);
            }
            upTimer = SetTimer(hWnd, 1, 2000, NULL);
            break;
            
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        
        break;

    case WM_TIMER:
        KillTimer(hWnd, upTimer);
        ShowWindow(hwndDialog1, SW_HIDE);
        break;

    case WM_DESTROY:
        DestroyWindow(hwndDialog1);
        PostQuitMessage(0);
        break;

    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

我已经搜索了非模式对话框的文档,但找不到解释。奇怪的是,当我使用调试器运行时,代码可以正常工作,而当我不使用调试器运行时,代码会在五秒后冻结。请看一下我是否遗漏了什么。谢谢你。

c++ winapi
1个回答
0
投票

问题已得到解答。详情请参阅问题正文。

© www.soinside.com 2019 - 2024. All rights reserved.