【问题标题】:Drawing Issue in Win32 applicationWin32 应用程序中的绘图问题
【发布时间】:2010-12-15 22:59:16
【问题描述】:

我正在开发 Win32 应用程序。所有绘图都在 WM_PAINT 中完成。它工作正常。我在其中添加了一项功能。当我单击按钮时,会执行命令提示符。这我可以使用 WinExec 完成。现在当我移动 Cmd.exe 比在后台绘图时没有完成。 我用 CreateProcess 更新代码,而不是发生同样的事情。谁能帮我看看这段代码有什么问题。是不是因为当我专注于这个窗口时,焦点会丢失并且绘图没有完成。

代码

    STARTUPINFO si;
    PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );          
    si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

TCHAR  wchCmdPath[MAX_PATH];
memset(wchCmdPath,_T('\0'),MAX_PATH);
GetSystemDirectory(wchCmdPath,MAX_PATH);
wcscat(wchCmdPath,_T("\\cmd.exe"));
// Start the child process. 
    if( !CreateProcess( NULL,   // No module name (use command line)
    wchCmdPath,        // Command line
    NULL,           // Process handle not inheritable
    NULL,           // Thread handle not inheritable
    FALSE,          // Set handle inheritance to FALSE
    0,              // No creation flags
    NULL,           // Use parent's environment block
    NULL,           // Use parent's starting directory 
    &si,            // Pointer to STARTUPINFO structure
    &pi )           // Pointer to PROCESS_INFORMATION structure
) 
{
    printf( "CreateProcess failed (%d).\n", GetLastError() );
    return;
}



// Close process and thread handles. 
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );


        InvalidateRect(hwnd,NULL,TRUE);
        UpdateWindow(hwnd);

提前致谢

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

    这可能是因为WinExec 在生成的可执行文件调用GetMessage 时返回或直到指定超时(参见:http://msdn.microsoft.com/en-us/library/ms687393(v=vs.85).aspx)。

    这意味着在这种情况发生之前,您的程序会停留在这一行,因此不会处理消息(包括WM_PAINT)。 CreateProcess 没有这个问题,但你是不是一直在等呢?

    【讨论】:

      【解决方案2】:

      问题很可能出在您发布的代码之外。您的 InvalidateRect / UpdateWindow 将在子进程生成后绘制一次窗口,但在您稍后移动它时它不会处理重绘。

      您需要解决“现在当我移动 Cmd.exe 而不是在后台绘制未完成”问题时,您需要考虑在等待进程时您在做什么。在等待进程的同时,您仍然需要处理传入的消息(至少是WM_PAINT 一个)。

      你不能使用 WaitForSingleObject 来等待进程,你需要使用一些可以让你处理消息的函数,比如 MsgWaitForMultipleObjects - 这是你的应用程序需要在每次发送 WM_PAINT 时重新绘制窗口,没有人会这样做给你。

      另一种方法是根本不等待进程,而是在主消息循环中以事件驱动的方式处理其结果(您现在所做的可以被视为“模态”进程,也许您可以重新考虑您的应用程序以使其“无模式”)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-04
        • 2017-05-05
        • 1970-01-01
        • 2020-03-12
        • 1970-01-01
        相关资源
        最近更新 更多