在Win32应用程序中绘制问题

时间:2010-12-15 10:17:48

标签: c++ winapi

我正在开发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);

提前致谢

2 个答案:

答案 0 :(得分:4)

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

这意味着在此之前,您的程序会停留在此行,因此不处理消息(包括WM_PAINT)。 CreateProcess没有这个问题,但你在等它吗?

答案 1 :(得分:0)

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

你需要解决的问题是“现在当我移动Cmd.exe而不是在背景绘图中没有完成”时,问题是在等待这个过程时考虑你在做什么。在等待进程时,您仍然需要处理传入的消息(至少WM_PAINT一个)。

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

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