Проблема с рисованием в приложении Win32 - PullRequest
1 голос
/ 15 декабря 2010

Я работаю над приложением 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 ]

4 голосов
/ 15 декабря 2010

Это может быть связано с тем, что WinExec возвращается, когда вызываемый исполняемый файл вызывает GetMessage или до тех пор, пока не истечет время ожидания (см .: http://msdn.microsoft.com/en-us/library/ms687393(v=vs.85).aspx).

Это означает, что до тех пор, пока это не произойдет, ваша программа застревает в этой строке и поэтому не обрабатывает сообщения (включая WM_PAINT).CreateProcess не имеет этой проблемы, но вы вообще ее ждали?

0 голосов
/ 15 декабря 2010

Скорее всего, проблема лежит за пределами кода, который вы опубликовали. Ваш InvalidateRect / UpdateWindow закрасит окно один раз после того, как дочерний процесс будет порожден, но он не будет обрабатывать перерисовку при перемещении его позже.

Чтобы решить проблему «Теперь, когда я перемещаю Cmd.exe, а не в фоновом режиме рисования», нужно подумать о том, что вы делаете, пока ожидаете процесс. В ожидании процесса вам все еще нужно обработать входящие сообщения (по крайней мере, WM_PAINT один).

Вы не можете использовать WaitForSingleObject для ожидания процесса, вам нужно использовать некоторую функцию, которая также позволит вам обрабатывать сообщения, например, MsgWaitForMultipleObjects - это ваше приложение, которому нужно перерисовывать окно каждый раз при отправке WM_PAINT, никто не будет делать это для тебя.

Другой подход заключается в том, чтобы вообще не ждать процесса, а реализовать обработку его результата управляемым событиями способом, прямо в главном цикле сообщений (то, что вы делаете сейчас, можно рассматривать как «модальный» процесс, возможно, вы может переосмыслить ваше приложение, чтобы оно стало "немодальным").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...