2010-01-25 9 views
6

Ich frage mich, wie Visual Studio assoziierte MFC CDialog abgeleitete Klassen mit ihren entsprechenden Dialogressourcen. Ich bin nicht daran interessiert, wie die Verbindung zur Laufzeit hergestellt wird (wie here gefragt), sondern zur Entwurfszeit.Wie assoziiert Visual Studio MFC-Dialog-Klassen mit Dialog-Ressourcen?

Wenn ich einem Dialogfeld einen Nachrichtenhandler hinzufüge, wie weiß es, welcher Klasse der Handler hinzugefügt werden soll. Ist es auch möglich, mehrere CDialog abgeleitete Klassen zu haben, die mit derselben Dialogressource verknüpft sind und umgekehrt?

ich das Projektverzeichnis für den IDD_SOMEDIALOG Zeichenfolge gesucht habe, aber fand nur in SomeDialog.h, resource.h und Project.rc in den erwarteten Orten, damit ich es irgendwie denke, die Verbindung aus diesen Dateien, höchstwahrscheinlich die Enum in SomeDialog.h folgert:

// in class CSomeDialog: 
    enum { IDD = IDD_SOMEDIALOG }; 

Ich frage dies vor allem aus Neugier.

Antwort

4

Es hängt davon ab, welche Version von dev Studio.

In VS6 wurde alles in der CLW (Class Wizard File) gespeichert.

In neueren Versionen von dev Studio verwendet es nicht mehr den CLW und ich weiß nicht genau, wie es weiß, aber ich vermute, es ist ein Live-Parsing statt mit einem zwischengespeicherten CLW.

Für mehrere abgeleitete Dialoge mit der gleichen Ressource kann es manuell durchgeführt werden. Sie können die erstellten Klassendateien duplizieren und umbenennen und die Aufzählung aus der Kopfzeile entfernen und die Verwendung der IDD-Aufzählung in der Quelldatei als tatsächliche ID der Dialogressource (IDD_SOMEDIALOG) bearbeiten.

AFAIK Dev Studio wird nur "glücklich" eine Klasse zu einem Zeitpunkt auf einmal behandeln. Nach meiner Erfahrung endet der Versuch, eine Dialog-Ressource wie diese wiederzuverwenden, in einem Kampf mit MFC & Dev Studio, da sie nicht dazu gedacht waren.

+0

Dies scheint definitiv der Fall zu sein, siehe mein Update für weitere Details. –

2

zu Ruddy Antwort hinzu:

I, in dem einige meiner Dialog Klassen bemerkte ich den enum { IDD } mit static const int IDD ersetzt länger wurde nicht mit seiner Dialogressource zugeordnet ist. Durch die Rückkehr zur Enumeration wurden sie erneut verknüpft. So scheint es, dass Visual Studio den Quellcode analysiert, um die Beziehungen zu bestimmen.

Bei der gemeinsamen Nutzung von Ressourcen wäre es zweideutig, welche Klasse den Ereignisbehandlungscode erhalten soll. Klassenfreigabe scheint unmöglich zu sein, da sie sich auf die IDD stützt, die nicht gleichzeitig einer IDD_SOMETHING und IDD_SOMETHING_ELSE zugeordnet werden kann.