Keine Messages von CButton

Klaus1311

Grünschnabel
Hallo,

nachdem mein erstes Problem so schnell gelöst wurde, hoffe ich mit meinem 2. Problem geht es genau schnell. Ich habe eine Windows MFC Anwendung. In das Window habe ich 1 Pushbutton eingefügt. Leider reagiert dieser Button überhaupt nicht, er ändert weder den Zustand bei überfahren mit der Maus, noch sendet er eine Meldung. Mein Code:

CButton *buttonNew global definiert,

über Assistent Klasse CButton CButtonNew eingefügt (liegt in App-Datei),
über Assistent Messagehandler void CButtonNew::OnBnClicked() eingefügt(liegt in App-Datei),

in MainFrm zum Zeitpunkt OnCreate
buttonNew->Create(_T("Neu"),WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,rect,this,WM_USER+2);

Der Button wird angezeigt, aber wie gesagt, keine Reaktion.
Was mache ich falsch?

Gruß
Klaus
 
Füge mal nach dem Create ein
Code:
buttonNew->EnableWindow(true);
ein.
Das sollte eigentlich schon helfen.
 
Sorry, hatte mir Deinen Post offensichtlich nicht richtig durchgelesen.

Du erzeugst das Ganze leider etwas falsch.
Wie sieht denn Deine Anwendung aus (MDI/SDI/Dialogbasiert) und wo wird der Button angezeigt?
 
Hallo,

meine Anwendung ist eine SDI-Anwendung. Mit dem Wizzard habe ich die class CButtonNew und danach über Eigenschaft und BN_CLICKED OnBnClicked eingefügt. In MainFrm habe ich global CButton buttonNew definiert. In MainFrm::OnCreate liegt buttonNew.Create(_T("Neu"),WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,rect,this,WM_USER+2);

Ich habe das Gefühl die Messages von dem button gehen überall hin nur nicht an mein Window.

viele Grüße
Klaus
 
Wenn ich das richtig verstanden habe, dann hast Du eine eigene Button-Klasse von CButton abgeleitet. Verwenden tust Du aber eine Variable von Typ CButton als Member von CMainFrame.
Dort erzeugst du das Button-Fenster mit Create und der ID 'WM_USER+2'.

Die erzeugte Basisklasse hat also mit dem Button selber überhaupt nichts zu tun. Die brauchst Du eigentlich auch gar nicht, wenn Du nicht irgendwelche zusätzlichen Funktionen für diesen Button-Typ implementieren willst.

Wenn Du jetzt einen Handler für diesen Button (z.B. in der Klasees CMainFrame) willst, mußt Du in der MessageMap von CMainFrame einen Eintrag der Form
Code:
ON_BN_CLICKED(WM_USER+2, OnBnClickedNew)
einfügen, wobei 'OnBnClickedNew' der frei wählbare Name der Handlerfunktion ist, die aufgerufen wird, wenn das Hauptfenster eine BN_CLICKED-Nachricht von der ID WM_USER+2 erhält. Du kannst also auch einen anderen Namen wählen. Die Funktionsdelaration in der Klassendefinition des Hauptfensters in MainFrm.h sieht dann so aus:
Code:
afx_msg void OnBnClickedNew();
die Definition so:
Code:
void CMainFrame::OnBnClickedNew()
{
  //Hier Code einbauen
}

Mit dem Assistenten kannst Du nur Handler für Controls einbauen, die im Resourceneditor angelegt wurden, z.B. auf Dialogen oder PropertyPages.
 
Hallo jokey2,

vielen Dank für die ausführliche Beschreibung und Erklärung. Scheinbar bin ich zu dumm, die Daten in mein Programm einzufügen. Ich habe mir eine Testanwendung generiert und nur die Code Teile Deiner Antwort eingefügt. Immer noch dasselbe. Der button verändert weder sein Erscheinungsbild, wenn der cursor über dem button liegt, noch sendet er eine message. Wenn ich mit Spy die Meldungen des buttons überwache (alle Meldungsarten on), kommt keine message, im Gegenteil, mein komplettes System ist blockiert. Nach drücken von "Ctrl Alt Del" dauert es etwa 20sek, dann erscheint der taskmanager. Im Taskmanager wird VC und die Anwendung sowie Outlook mit "Keine Rückmeldung" angezeigt.


Gruß
Klaus
 
Vielleicht kannst Du mal den Code der MainFrm.h und MainFrm.cpp Deiner Testanwendung posten. Dann kann ich mal drüberschauen.
 
Hallo jokey2,

vielen Dank das Angebot nehme ich gerne an. In Anlage sind die beiden Dateien in gezippter Form. Meine Einträge sind mit //@ markiert.


viele Grüße
Klaus
 

Anhänge

Hallo jokey2,

ich habe ein bisschen herum probiert und dabei folgendes herausgefunden. Wenn ich anstelle von MainFrm , ..View benutzte funktioniert es.

nochmals vielen Dank
Klaus
 
Zurück