DLGTEMPLATE-Erklärung



  • Gibt es irgendwo ein Tutorial, das mal ausführlich das Erstellen einer Dialogressource mit Hilfe der DLGTEMPLATE-Struktur erklärt? Aus diesen stückchenweisen Erklärungen der MSDN werde ich einfach nicht schlau und jedes WinAPI-Tutorial erklärt lediglich, wie man Dialogfelder mit Ressourcen erstellen kann, die bereits in einer RC-Datei liegen.
    Ich brauche also ein Tutorial, das mal genau zeigt, wie man diese DLGTEMPLATE-Struktur eigentlich zusammenbaut (Buttons, ein Menü etc. hinzufügt), bevor man es der DialogBoxIndirect-Funktion übergibt. Wenn's kein Tutorial gibt, wäre ich auch für ein Sample-Programm dankbar, doch es sollte schon etwas komplett Zusammenhängendes sein, das man sich wirklich mal von vorne bis hinten angucken kann und das nicht wieder nur fragmentiert präsentiert wird.


  • Mod



  • was willst Du denn noch wissen?

    Ich würde gern wissen, wie das ganze im Gesamtzusammenhang aussieht. Ich kann damit nichts anfangen, wenn mir nur der Datentyp erklärt, aber nicht gezeigt wird, wie man ihn verwendet. Schon alleine dieser Satz hier:

    In a standard template for a dialog box, the DLGTEMPLATE structure is always immediately followed by three variable-length arrays that specify the menu, class, and title for the dialog box.

    Was genau meinen die jetzt? Wie soll das Menü der DLGTEMPLATE-Struktur "folgen"? Heißt das, ich muß die Menüvariable gleich danach deklarieren? Und wieso definiert sich das Menü durch ein Feld? Wie gesagt, statt hier irgendwelche gedanklichen Verrenkungen zu machen, um mir selbst zu erklären, was es bedeutet, wenn ein Menü in Form eines Feldes mit variabler Länge der DLGTEMPLATE-Struktur folgt, möchte ich einfach nur mal ein Beispielprogramm sehen. Keine Codeschnipsel, die die Funktionalität irgendwie aufteilen und großartig optimieren, so daß ich wieder alles mühsam zusammensetzen muß (ich hasse es zum Beispiel, wenn jemand versucht, einen einfachen programmiertechnischen Sachverhalt zu erklären und dabei schon gleich alles in eine Klasse gekapselt hat), sondern ein kurzes Sample-Programm "Wir erstellen ein Dialog-Template mit einem Menü und einem Button und weisen dieses der DialogBox-Funktion zu". Keine fragmentarischen Erklärungen im Stil von "Hier hast Du den DLGTEMPLATE-Datentyp und nun mach was draus" und kein "Ich habe dazu mal eine komplexe Klassenbibliothek geschrieben, mit der man Controls ganz leicht hinzufügen kann", sondern ein einfaches minimales Demonstrationsprogramm.





  • Naja, ich kann mich da ja mal durchkämpfen, obwohl ich (sorry) ehrlich sagen muß: Besonders übersichtlich ist das nicht:

    dlg.dlgTempl.tmpl.style
    

    Das war's, was ich meinte: Alles wird gekapselt und optimiert, obwohl es nur darum geht, einen Sachverhalt grundlegend zu erklären. Das wäre ungefähr so, als würde ich das typische Einführungsprogramm "Hello World" so schreiben:

    "Hello World.h":

    #ifndef HELLO_WORLD_H
    #define HELLO_WORLD_H
    
    #include <string>
    
    class Output
    {
    public:
    
        Output ();
        Output (std::string text);
    
        void Write ();
    
    private:
    
        std::string text;
    }
    
    #endif
    

    "Hello World.cpp":

    #include <iostream>
    #include "Hello World.h"
    
    using namespace std;
    
    Output::Output ():
        text ("")
    {
    }
    
    Output::Output (std::string text):
        text (text)
    {
    }
    
    void Output::Write ()
    {
        cout<<text<<'\n';
    }
    

    "Main.cpp":

    #include "Hello World.h"
    
    int main ()
    {
        Output o ("Hello World");
    
        o.write ();
    }
    

    Ich weiß, ich weiß, ich maul im Moment ziemlich rum. Das geht aber nicht gegen Euch, die versuchen, mir zu helfen, sondern an die Leute, die es nicht schaffen, das mal einfach und übersichtlich zu programmieren. Wie gesagt, diese ganze Strukturverkapselung muß man jetzt erstmal entwirren, um rauszufinden, was eigentlich dahinter steckt. (Schrecklicher Programmierstil.)


  • Mod

    NES-Spieler schrieb:

    was willst Du denn noch wissen?

    Ich würde gern wissen, wie das ganze im Gesamtzusammenhang aussieht. Ich kann damit nichts anfangen, wenn mir nur der Datentyp erklärt, aber nicht gezeigt wird, wie man ihn verwendet. Schon alleine dieser Satz hier:

    In a standard template for a dialog box, the DLGTEMPLATE structure is always immediately followed by three variable-length arrays that specify the menu, class, and title for the dialog box.

    Was genau meinen die jetzt? Wie soll das Menü der DLGTEMPLATE-Struktur "folgen"? Heißt das, ich muß die Menüvariable gleich danach deklarieren?

    Das ist ein Stream von Daten. Direkt danach folgt ein NULL terminierer Array von Zeichen, die Menü, Klasse und Titel angeben.

    NES-Spieler schrieb:

    Und wieso definiert sich das Menü durch ein Feld?

    Weil dann festgelegt sein müsste wie Ein Menü als Id oder Resosource-Text lang ist. Das ist aber nicht definiert!

    NES-Spieler schrieb:

    Wie gesagt, statt hier irgendwelche gedanklichen Verrenkungen zu machen, um mir selbst zu erklären, was es bedeutet, wenn ein Menü in Form eines Feldes mit variabler Länge der DLGTEMPLATE-Struktur folgt, möchte ich einfach nur mal ein Beispielprogramm sehen.

    Manchmal hilft ein einfacher Blick in den MFC Source Code. Selbst wenn Du hier im WinAPI Forum postest. Wie etwas geht, steht auch dort.
    Siehe Klasse: CDialogTemplate!

    Weiterhin findest Du sofort bei der Suche nach DLGTEMPLATE und DLGTEMPLATEEX unter Google ohne Angabe weiterer Parameter 8 Links auf MS und davon einen auf einen MS-Journal Artikel von Matt Pietreck:
    http://www.microsoft.com/msj/0198/hood0198.aspx



  • Aus dem PE-Betrachter :> und der Win32-Referenz rausgeschrieben:

    === DLGTEMPLATE ===
    long  style, dwExtendedStyle
    short cdit
    short x, y, cx, cy
    menu  0000 | FFFFordx | M0E0N0U000 (unicode)
        ordx "ordinal value of a menu resource"
    class 0000 | FFFFordx | C0A0S0S000 (unicode)
        ordx "ordinal value of a predefined system window class"
    title 0000 | T0I0T0L0E000 (unicode)
    if DS_SETFONT
      short fontsize
      F0O0N0T0N0A0M0E000 (unicode)
    
    === DLGITEMTEMPLATE ===
    for (i = 0; i < cdit; i++)
    {
    .align 4
    long style, dwExtendedStyle
    short x, y, cx, cy
    short id
    class 0000 | FFFFordx | C0L0A0S0S000 (unicode)
          FFFF0080 Button
          FFFF0081 Edit
          FFFF0082 Static
          FFFF0083 List box
          FFFF0084 Scroll bar
          FFFF0085 Combo box
    title 0000 | FFFFordx | T0I0T0L0E000 (unicode)
        ordx "ordinal value of a resource, such as an icon"
    short creation_data 0000
    "the creation data array begins at the next
    DWORD boundary after the title array"
    (.align 4 0xDEADBEEF 0xDEADBEEF...)
    }
    
    === DLGTEMPLATEEX ===
    short signature (oder dlgVer zuerst?)
    short dlgVer
    long helpID
    long exStyle, style
    short cDlgItems
    short x, y, cx, cy
    menu  0000 | FFFFordx | M0E0N0U000 (unicode)
    class 0000 | FFFFordx | C0L0A0S0S000 (unicode)
    title 0000 | T0I0T0L0E000 (unicode)
    if DS_SETFONT
      short fontsize
      short weight (oder mit bitalic vertauscht)
      short bitalic
      F0O0N0T0N0A0M0E000 (unicode)
    
    === DLGITEMTEMPLATEEX ===
    for (i = 0; i < cDlgItems; i++)
    {
    .align 4
    long helpID
    long exStyle, style
    short x, y, cx, cy
    short id
    class FFFFordx | C0L0A0S0S000 (unicode)
        FFFF0080 Button
        FFFF0081 Edit
        FFFF0082 Static
        FFFF0083 List box
        FFFF0084 Scroll bar
        FFFF0085 Combo box
    title 0000 | FFFFordx | T0I0T0L0E000 (unicode)
    short extraCount 0000
    "If this value is greater than zero,
    the creation data begins at the next
    DWORD boundary."
    (.align 4 0xDEADBEEF...)
    }
    

Anmelden zum Antworten