Änderungen von Angaben in einem Formular ermöglichen

@jokey2: Die Funktion OnLButtonClk() habe ich nirgends gefunden, nur OnLButtonDown und OnLButtonUp.

Ein anderes Problem. Ich habe, wie oben vorgeschlagen, das CEdit als Child erzeugen wollen. Dazu genau wie vorgeschlagen
Code:
// Anlegen einer Membervariablen in der Viewklasse
CEdit m_edit; 

// Erzeugen des Controls bei der Initialisierung des Views
m_edit.Create(WS_CHILD | WS_BORDER, CRect(0,0,0,0), this, 1);
geschrieben. Die Initialisierung habe ich in die Funktion OnInitialInit() der View-Klasse untergebracht. Aber es funktioniert nicht nur nicht, ich erhalte eine Exception. Wenn ich den Code nach der Exception richtig interpretiere, ist wohl das Window-Handle = NULL und damit ungültig. Wo muß ich die Initialisierung denn vornehmen, damit es klappt?

Danke

langer
 
Habe noch ein bißchen experimentiert und festgestellt, daß die Exeption nur auftritt, wenn die Funktion OnNewDocument aufgerufen wird. In der ersten Initialisierung nach Start des Programms passiert nichts. Aber wenn ich dann diese Funktion aufrufe, sei es über den Menu-Punkt Datei->Neu oder beim Laden einer Datei, kracht es. Ich vermute mal, daß ich vor Aufrufen der Funktion das CEdit zerstören muß. Aber wo? In der Dokumentenklasse habe ich es in OnNewDocument vor Aufruf der Basisfunktion versucht, aber da klappt es nicht, sondern produziert auch nur Exceptions.

langer
 
Ich glaube, ich habs.
Wenn ich schreibe
Code:
m_edit.DestroyWindow();
// Erzeugen des Controls bei der Initialisierung des Views
m_edit.Create(WS_CHILD | WS_BORDER, CRect(0,0,0,0), this, 1);
dann gibts keinen Absturz mehr. Aber ist das auch sauber?Oder lauern da noch Gefahren im Hintergrund, weil ich ja beim ersten Mal ein Fenster zerstöre, das gar nicht vorhanden ist.

langer
 
Noch 'ne Anmerkung:
Wenn ich díe Beschreibung der Funktion DestroyWindow in der MSDN richtig verstanden habe, ist diese Funktion wohl fehlerresistent. Das heisst, wenn das Fenster nicht existiert, passiert nix, außer daß ein Fehler zurückgegeben wird (ein Wert ungleich Null). Aber das stört in meinem Fall ja nicht. Ich gehe also davon aus, daß es so, wie ich es implementiert habe, ohne Crash läuft.

Mfg

langer
 
Ich glaube, mit OnInitialInit() hatte ich auch schon mal Probleme, da die Funktion mehr als einmal aufgerufen wird.
Neben dem "blinden" Zerstören des Edit-Controls könntest du vor dem Erzeugen auch testen, ob das Fenster schon existiert:

Code:
if( !::IsWindow(m_edit.GetSafeHwnd()) )
{
    m_edit.Create(WS_CHILD | WS_BORDER, CRect(0,0,0,0), this, 1);
}
 
Danke für den Hinweis, ich denke, dein Vorschlag ist die bessere Methode, auch wenn meine funktioniert hat. Ich werde das so ändern.

Mfg

langer
 
Hi,
ich habe jetzt alles so implementiert, daß es so arbeitet, wie ich es möchte. Die Abfrage der Position klappt problemlos und das EditControl erscheint nach dem Maus-Klick auch an der Stelle, wo es hin sollte. Ich habe jetzt nur ein Problem:
Wie fange ich die Nachrichten des CEditControl ab? Ich muß wenigstens das Betätigen der Enter-Taste auswerten. Das EditControl ist als Child-Window in der View-Klasse erzeugt. Muß ich dazu die Funktion PreTranslateMessage verwenden oder gibt es eine Möglichkeit, die Abfrage in der MessageMap unterzubringen?

Mfg

langer
 
Du kannst schon PreTranslateMessage() verwenden, anderfalls musst du eine eingene Klasse von CEdit ableiten und darin die Tastatureingaben verarbeiten.
 
Danke für die Antwort.
Mit PreTranslateMessage hab ich überhaupt keine Erfahrung. Ich wüßte also gar nicht, wie ich das Betätigen der Enter-Taste herausfiltern soll. Ich hätt's schon gemacht (und sicher mit eurer Hilfe rausbekommen), aber die Idee, eine Klasse von CEdit abzuleiten, gefällt mir besser. Damit hab ich Erfahrung ;) . Aber es gibt eben neue Sachen, die ich vorher nie verwendet habe wie ein Edit-Control als Child-Window, wo ich erstmal viel fragen oder experimentieren muß.
Werde also mal damit arbeiten und experimentieren.

Mfg

langer
 

Neue Beiträge

Zurück