CDialogBar ...



  • Ich habe eine CDialogBar eingerichtet. Eine Combobox und zwei einfache
    Schaltflächen. Dann habe ich einen Event-Handler hinzugefügt, und das
    Programm gestartet. Ein Click auf die Schaltfläche, und es tat sich nichts.
    Gerade so, als wäre die Schaltfläche deaktiviert. Dann versuchte ich es
    mit GetDlgItem(IDC_BUTTON1)->EnableWindow(true); , kein Erfolg was nun ?



  • Aber du siehst, dass der Button beim Klicken grafisch absesenkt wird? Das würde er bei einem deaktivierten Button ja nicht tun. Mal einen Breakpoint im Event-Handler gesetzt? MFC-Message-Map ist korrekt (ON_BN_CLICKED-Makro)?


  • Mod

    Dir WM_COMMAND Nachrichten werden an den Owner des CDialogBar gesendet und IMHO nicht an den Bar selbst!



  • Danke! das hat mir geholfen!
    Nur noch eins: folgender Text:

    Mainframe.h ...

    CDialogBar dbr;

    Mainframe.cpp ...

    dbr.Create(this, IDD_DIALOG1, CBRS_TOP, 0x4801);

    In einem Buch habe ich gelesen, dass der letzte Parameter in einem
    Bereich zwischen: 0x4800 und 0x4820 liegen muss, es handelt sich um eine
    Fenster-ID. Was hat es damit auf sich ?


  • Mod

    Woher hast Du die ID? Dialogbars und Contrl Bars liegen hier
    #define AFX_IDW_CONTROLBAR_FIRST 0xE800
    #define AFX_IDW_CONTROLBAR_LAST 0xE8FF

    Bars werden automatisch von dem entsprechenden CFrameWnd angeordnet und auch angepasst, wenn sich die Fenstergröße ändert. Damit der Fensterhandler einen Bar erkennt wird ihm eine entsprechende ID gegeben.

    Speziell für den Preview Mode beim Drucken ist die Einhaltung dieser IDs sehr wichtig.

    Man sollte sich aber nicht täuschen lassen. Insgesammt sind nur 32 Controlbars erlaubt, außer man hat ein eigenes Handling entwickelt (oder verwendet MFCNext)



  • Die ID habe ich gelesen im Buch: Inside Visual C++ 6.0 von David Kruglinsky u.a.
    Seite 867-868. Wie Kann ich vermeiden, dass es einen (sag ich mal)
    ID-Konflikt gibt?


  • Mod

    GeorgC++ schrieb:

    Die ID habe ich gelesen im Buch: Inside Visual C++ 6.0 von David Kruglinsky u.a.
    Seite 867-868. Wie Kann ich vermeiden, dass es einen (sag ich mal)
    ID-Konflikt gibt?

    1. Wirst Du dort sicher keine festen Werte sondern symbolische Werte finden.
    2. Muasst Du eben aufpassen.



  • Entschuldige, dass ich dich nochmals nerve.
    Der ID_Bereich im Buch lag in der Tat zwischen 0xE800 und 0xE820;
    Wenn ich als ID 0xE801 wähle, kann ich sicher sein, dass der
    Anwendungsassistent, diese ID nicht schon vergeben hat? Oder gehört
    dieser Bereich mir ? Martin ich möchte mich an dieser Stelle, bei Dir
    recht herzlich bedanken. Du hast mir schon oft geholfen. Ich selber
    konnte erst drei Fragen beantworten.



  • Geh in die Ressourcenansicht, einfacher klick auf <projekt>.rc.
    Dann Menü "Bearbeiten->Ressourcesymbole", dort Neu wählen. Der Rest ist selbsterklärend 🙂


  • Mod

    GeorgC++ schrieb:

    Entschuldige, dass ich dich nochmals nerve.
    Der ID_Bereich im Buch lag in der Tat zwischen 0xE800 und 0xE820;
    Wenn ich als ID 0xE801 wähle, kann ich sicher sein, dass der
    Anwendungsassistent, diese ID nicht schon vergeben hat?

    Rserviert sind diese IDs und nur diese werden auch vom Wizard verwendet:
    #define AFX_IDW_TOOLBAR 0xE800 // main Toolbar for window
    #define AFX_IDW_STATUS_BAR 0xE801 // Status bar window
    #define AFX_IDW_PREVIEW_BAR 0xE802 // PrintPreview Dialog Bar
    #define AFX_IDW_RESIZE_BAR 0xE803 // OLE in-place resize bar
    #define AFX_IDW_REBAR 0xE804 // COMCTL32 "rebar" Bar
    #define AFX_IDW_DIALOGBAR 0xE805 // CDialogBar

    ...
    Du solltest also für eigene Bars höhere IDs verwenden, wobei Du AFX_IDW_DIALOGBAR verwenden kannst, denn es gibt keinen internen Bar mit dieser ID.



  • Noch etwas: Ich möchte eine DialogBar mit einer ComboBox ausstatten.

    folgender Text:

    class CMainFrame ..
    CDialogBar dbr;
    CComboBox* cbx;

    Mainframe.cpp .. OnCreate ...
    dbr.Create(this, IDD_DIALOG1, CBRS_TOP, 0xE80A);
    cdx = (CComboBox*)GetDlgItem(IDC_COMBO1);

    cdx.AddString("Ein String ..."); // Da kam ein Fehler-Abbruch

    Die Nachrichten der DialogBar werden an MainFrame gesendet,
    Damit ich arbeiten kann(Mit der ComboBox, ID: IDC_COMBO1),
    brauche ich einen Zeiger auf IDC_COMBO1, woher ?



  • Natürlich: cbx->AddString(....


Anmelden zum Antworten