myDilog.Create(IDD_DIALOG1) , PreTranslateMessage oder wie?

Reticent

Erfahrenes Mitglied
Hallo zusammen,


ich hoffe ihr habt alle einen guten Morgen/Tag/Abend.

bei mir kocht mein Kopf schon langsam. :confused: Die Zait drängt mich, aber ich schaffe es net alleine zu finden.
Was ich brauche ist einfach in PreTranslateMessage die messages behandeln.
Ich habe ein Dialog, den ich nihct in doModal() starten möchte. Deswegen habe ich es mit ScanDlg.Create(IDD_DIALOG1); gemacht. Jetzt kommt die frage:
Wie kann ich die Messages trotzdem abfangen, oder kann man irgendwie dem Windows sagen, dass er alle messages an dieses Dialog senden soll?
Oder gibt es eine Funktion, mit der ich die messages in Timer abfragen kann?
Oder macht man es ganz anders?

gleich Danke!!
 
Sobald du den Dialog mit Create erstellt hast, läuft die Nachrichtenbearbeitung über seine Funktionen. Da kannst du PreTranslateMessage und WindowProc genauso einsetzen wie in modalen Dialogen.

Du musst allerdings irgendwo eine MessagePump haben. Normalerweise ist dieser modale Dialog im selben Thread wie dein Hauptprogramm und die Nachrichten werden über die versteckte MFC-MessagePump weitergeschoben. Da sollte dann eigentlich nichts zu tun sein und der Dialog trotzdem laufen.
 
Code:
		ScanDlg.Create(IDD_DIALOG1);
		ScanDlg.ShowWindow(SW_HIDE);
		ScanDlg.MainFunktion();
so mache ich das. in Pretrans-dings:
Code:
	//<<<<<<<TWAIN>>>>>>>>
	ProcessMessage(*pMsg);

es kommt aber irgendwie nihct hierrein :confused: auch wenn ich ein AfxMessageBox setze --> passiert nix :(

soll dieser MessagePump hier eine Rolle spielen? hm.. ich kenne mich damit nicht aus? kann mir einer helfen?
 
Was genau willst du denn da machen?

Was passiert in der MainFunktion?

Bei MFC ist die MessagePump netterweise in eine einzelne Funktion verpackt:

Einmal über extern die Deklaration holen:
extern BOOL __stdcall AfxPumpMessage();

Und dann aufrufen

while ( AfxPumpMessage() );

Das würde solange laufen, bis eine WM_QUIT-Nachricht (von PostQuitMessage) ausgelesen wird.
 
Wenn du deine Klasse hast CXyzDlg dann kannst du doch einfach

CXyzDlg *m_dlg = new CXyzDlg;
m_dlg->Create( IDC_XYZ_DIALOG, this );
m_dlg->ShowWindow( TRUE );

machen und die stink normale Nachrichtenverwaltung der Dialog Klasse nutzen - alles wie gewohnt bei einem modalem Dialog - nur das OnInitDialo() bei Create(...) aufgerufen wird und man evtl. bestimmte Sachen erst bei OnShowDialog() machen muss/darf .
 
ich möchte das Dialogfenster so starten, dass es nicht angezeigt wird, aber die Nachrichten dennoch an ihn schicken. Ich benutze TWAIN in eigenen DLL und er braucht seine ProcessMessage(*pMsg) in der der PreTranslateMessage-Funktion con meinem Dialog haben. Aber irgendwie läuft es nicht richtig. Ich komme in PreTranslateMessage nur wenn ich mein Dialogfenster anzeigen lasse. hmm... was kann man da machen?
 
Aha, da wird es schon aufschlussreicher.

Der Punkt: Der Dialog wird nicht-modal erzeugt, das heisst, jemand muss seine Nachrichten "pumpen". Die Nachrichten sollten auch bei nicht sichtbarem Fenster geschickt werden.

Wie prüfst du denn, ob Nachrichten ankommen? Wenn das Fenster nicht sichtbar ist, hast du nicht wirklich die Möglichkeit, Nachrichten zu erzwingen.

Wenn du die Nachrichten nicht über die MFC-Standard-Messagepump ablaufen lässt, wird PreTranslateMessage auch nicht aufgerufen. PreTranslateMessage ist ein MFC-eigenes Gehacke. Du kannst aber ProcessMessage genauso von der WindowProc deines Dialogs (einfach überladen) aufrufen lassen.
 
WindowProc bekommt ALLE Nachrichten.

Du kannst die vom Assistenten überschreiben lassen, jedes von CWnd* abgeleitete Element hat eine virtuelle WindowProc-Funktion.
 
Zurück