Постоянное мерцание в настольном приложении C++ для Windows, когда дочернее окно становится дочерним для настольного приложения C#?

Я использовал информацию из следующих сообщений SO, чтобы сделать родителем элемента управления Picture в моем приложении C++ Desktop, дочерним элементом элемента управления Panel в моем приложении C#. Приложения C++ и C# - это отдельные приложения, работающие в своем собственном процессе:

Различные проблемы с использованием SetParent для встраивания окна во внешний процесс

Встраивание HWND во внешний процесс с использованием SetParent

Я использую код, показанный ниже, чтобы сделать перевоспитание. Приложение C# запускает приложение C++, передавая его в командной строке дескриптор Windows элемента управления Panel, который должен содержать элемент управления Picture приложения C++. Когда я запускаю приложение C#, я вижу схему элемента управления C++ Picture на назначенном элементе управления Panel, который является родным для приложения C#.

Однако у меня возникают следующие проблемы:

1) Оба приложения на C++ и C# мерцают ужасно, как будто их перекрашивают много раз в секунду.

2) Элемент управления изображением в приложении C++ обычно показывает видеопоток с моей веб-камеры. Я BitBlt() кадры с веб-камеры в C++ Picture Control. Он прекрасно работает без переучивания, но с ним я не вижу никаких кадров вообще.

ПРИМЕЧАНИЕ. Мерцание определенно является результатом рисования в теперь заново родившемся дочернем окне. Если я отключу эту операцию, мерцание не произойдет.

Кто-нибудь знает, что не так и как я могу это исправить? Вот код в приложении C++, который выполняет переопределение и присоединение основного потока ввода C++ (потока, которому принадлежит элемент управления Picture) к потоку ввода, принадлежащему основному потоку приложения C# (потоку, которому принадлежит Панель управления):

// The following code executes in the wWinMain() function of the C++
//  app after the main dialog window and it's child controls have been
//  setup and initialized.  The value assigned to g_VideoHostContainerHWnd
//  was passed to the C++ app by the C# app that launched it, as a 
//  command line argument, using the Panel control's Handle property
//  converted to an unsigned integer.
g_OurMainThreadID = GetCurrentThreadId();

if (g_VideoHostContainerHWnd > 0)
{
    // Make our video stream window a parent of the designated window
    //  in the HiveMind client.

    // Get the window handle for the video stream window: IDC_PANEL_PICTURE.
    HWND videoStreamWindow =
        GetDlgItem(
        g_HwndDlg,
        IDC_PANEL_PICTURE);

    if (videoStreamWindow > 0)
    {
        // Get the thread ID for the thread that owns the video host container window.

         g_VideoHostThreadID = GetWindowThreadProcessId(
            g_VideoHostContainerHWnd,
            &g_VideoHostProcessID);

         if (g_VideoHostThreadID > 0)
         {
             // Make the video stream window a child of the HiveMindClient window.
             if (NULL == SetParent(videoStreamWindow, g_VideoHostContainerHWnd))
                 OutputDebugString(L"The reparenting of the video stream window FAILED.");
             else
                 OutputDebugString(L"The reparenting of the video stream window SUCCEEDED.");

             // Attach the our input thread to the thread ID for the process that launched us
             //  (i.e. - owns the video host window).
             if (AttachThreadInput(g_OurMainThreadID, g_VideoHostThreadID, true))
                 OutputDebugString(L"Attaching our input thread to the video host thread SUCCEEDED.");
             else
                 OutputDebugString(L"Attaching our input thread to the video host thread FAILED.");
         }
         else
         {
             OutputDebugString(L"The thread ID of the video host container's owner thread is ZERO.");
         } // else - if (g_VideoHostThreadID > 0)
    }
    else
        OutputDebugString(L"The video stream window handle is INVALID.");
} // if (g_VideoHostContainerHWnd > 0)

1 ответ

У меня тоже возникла эта проблема, решение - родительский hwnd требует флаг WS_CLIPCHILDREN.

Другие вопросы по тегам