2009-04-02 9 views
0

J'ai un contrôle ActiveX dans MFC qui manipule des images et j'essaye d'ajouter la fonctionnalité de balayage TWAIN à lui.CDialog ne pas recevoir les messages Windows dans le contrôle ActiveX

Je dois être en mesure de recevoir un message Windows retour du pilote TWAIN qui indique mon contrôle lorsqu'une image a été scannée, j'ai donc créé un CDialog et je passe le HWND du dialogue au pilote. ALl l'exemple de code que j'ai vu sur le net utilise ensuite PreTranslateMessage pour capturer le message de TWAIN, mais dans mon contrôle ActiveX cette méthode n'est jamais appelée.

Est-ce que quelqu'un sait comment je peux obtenir les messages pour ce dialogue? J'ai également essayé d'utiliser PeekMessage sans succès.

Merci beaucoup

+0

Avez-vous défini PreTranslateMessage dans votre contrôle ou dans le dialogue? –

Répondre

1

Vous n'avez pas besoin de créer un CDialog. Vous avez juste besoin de n'importe quelle fenêtre pour traiter les messages. Tout ce qui concerne TWAIN est mieux géré dans son propre fil. Créez un nouveau thread pour MFC (via CWinThread ou AfxBeginThread). Dans ce fil, créez un CWnd. Le HWND de ce CWnd est celui que vous passerez avec tous les appels au DSM, etc. Chaque thread a sa propre file d'attente de messages, donc en créer un là-haut. Communiquer avec ce fil via PostMessage, SendMessage, PostThreadMessage, etc. En supposant que vous postez un message MY_SPECIAL_MESSAGE signaler à être l'acquisition d'une image, votre boucle de message devrait ressembler à ceci:

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

vraiment regarder le code source dans le kit de développement TWAIN pour voir comment tout cela fonctionne en détail. TWAIN est une créature difficile.

Croyez-moi, c'est la meilleure approche. Vous pouvez tout faire en un seul thread en utilisant la file d'attente des messages de votre thread principal, mais cela doit être évité.

+0

Hey adzm - Je l'ai fait à la dure (boucles GetMessage synchrones) pendant des années, mais votre façon sonne mieux - permettant les maux de tête de synchronisation et de communication inter-thread. Hmm - et le débogage multithread ... Avez-vous utilisé ceci, et si oui puis-je demander à quelle variété d'environnements a-t-il été exposé? – Spike0xff

+0

Oui, cette méthode exacte est actuellement en production dans plus d'un millier d'institutions médicales, dont certaines scannent des centaines d'images par jour. – adzm

+0

(et a été utilisé pendant plusieurs années) – adzm

Questions connexes