Постоянное мерцание в настольном приложении 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)

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]