CDialog не получает сообщения Windows в элементе управления ActiveX - PullRequest
0 голосов
/ 02 апреля 2009

У меня есть элемент управления ActiveX в MFC, который управляет изображениями, и я пытаюсь добавить к нему функциональность сканирования TWAIN.

Мне нужно иметь возможность получить обратно сообщение Windows от драйвера TWAIN, которое сообщает моему элементу управления, когда изображение было отсканировано, поэтому я создал CDialog и передаю HWND диалога в драйвер.

ALI пример кода, который я видел в сети, затем использует PreTranslateMessage для захвата сообщения из TWAIN, но в моем элементе ActiveX этот метод никогда не вызывается.

Кто-нибудь знает, как я могу получить сообщения для этого диалога? Я также пытался использовать PeekMessage безуспешно.

Большое спасибо

1 Ответ

1 голос
/ 07 апреля 2009

Вам не нужно создавать CDialog. Вам просто нужно любое окно для обработки сообщений. Все, что связано с TWAIN, лучше всего обрабатывать в своем собственном потоке. Итак, создайте новый поток для MFC (через CWinThread или AfxBeginThread). В этой теме создайте CWnd. HWND этого CWnd - это тот, который вы передадите со всеми вызовами в DSM и т. Д. Каждый поток имеет свою собственную очередь сообщений, поэтому установите ее там. Общайтесь с этим потоком через PostMessage, SendMessage, PostThreadMessage и т. Д. Предполагая, что вы публикуете сообщение MY_SPECIAL_MESSAGE, чтобы сообщить о получении изображения, ваш цикл сообщений должен выглядеть примерно так:

MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
    if (msg.message == MY_SPECIAL_MESSAGE)
    {   
        GetImageFromTWAIN();
    }
    else if (!ProcessTWAINMessage(&msg)) {
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    }
}

Обязательно посмотрите исходный код в комплекте разработки TWAIN, чтобы увидеть, как все это работает в деталях. TWAIN - хитрое существо.

Поверь мне, это лучший подход. Вы можете сделать все это в одном потоке, используя очередь сообщений вашего основного потока, но этого следует избегать.

...