DialogBox aus Resource erstellen



  • Hi C++-Community!
    Ich schreib gerade eine kleine Windows-Anwendung und hatte folgendes Problem:
    Ich wollte mir eine ComboBox (DropDownList) erstellen, nur wenn ich einen String per CB_ADDSTRING anfügen wollte, wurde er nur angezeigt, wenn ich mich per Mausrad durch die einzelnen Einträge gewühlt habe (er wurde aber nicht angezeigt, wenn ich das DropDown-menü geöffnet habe).
    Schließlich habe ich mir Beispielcodes agesehen, die sich eine DialogBox und seine Childwindows (darunter auch funktionierende ComboBoxen) aus einer Resource erzeugt haben. Das Problem war, ich habe es nicht geschafft, die DialogBox zu erstellen (ErrorCode: ERROR_RESOURCE_TYPE_NOT_FOUND).
    Nach der Fehlermeldung zu folgen, könnte man meinen, er könnte die Resource nicht finden, aber ich habe meine Resourcen-Datei in mein Projekt eingebunden, einen ResourcenHeader eingebunden, der die Ressourcen-IDs definiert und dann per MAKEINTRESOURCE die Resource geladen.

    Vielleicht hattet ihr ja mal ein ähnliches Problem, und wisst, wie man damit umgehen kann.

    Ich kann gerne die Quellcodes posten, wenn ihr wollt.
    Danke,

    mfg DaDrivel



  • genau versteh ich dich nich ..
    du sagst erst der string wird angezeigt, wenn du mit dem mausrand scollst, und später sagst du kannst den dialog gar nich erstellen?

    naja, zu erstens:
    Beim dialogeditor, wenn du da eine combobox setzt. du musst noch einstellen wie weit die box aufklappen soll. auf den pfeil der box klicken und nach unte ziehen, dann kannst du die dorpdown-tiefe einstellen.


  • Mod

    Hast Du bei der Größe der ComboBox auch die gesamte aufklappbare Größe angegeben?
    Die Höhe im zugeklappten Zustand ermittelt die ComboBox Anhand des Fonts von selbst.

    Zu Deinem Ressource Problem: Ich vermute, dass die Ressource wirklich nicht drin ist. Öffne mal die EXE Datei im Visual STudio und schau die Ressourcen an. Ist dort wirklich der Dialog unter der ID drin, oder evtl. unter einem Textnamen abgespeichert!



  • @Martin Richter:
    Danke, des Problem lag daran, dass ich nicht die komplette Höhe im ausgeklappten Zustand beachtet habe.

    Das andere Problem ist etwas koplizierter, aber da des Problem gelöst ist, verzichte ich darauf, es genauer zu erklären.

    Danke an euch für die Hilfe.

    mfg DaDrivel



  • Sry, für den Doppelpost, aber mir ist da gerade noch eine Frage gekommen:
    Gibts es eine Möglichkeit, die Größe der ComboBoxen "dynamisch" zu erstellen, damit man nicht selber immer rumprobieren muss, wie groß man die Box machen muss, sondern, dass die Größe automatisch so groß gemacht wird, dass alles (auch im ausgeklappten Zustand) hineinpasst.
    Bei den ComboBox-Styles gab es so eine Möglichkeit leider nicht.

    Danke !

    mfg DaDrivel



  • Gibts es eine Möglichkeit, die Größe der ComboBoxen "dynamisch" zu erstellen, damit man nicht selber immer rumprobieren muss,

    Bin grade am Rum Probieren...

    char templ[1000];
    
    char *Even4(char *s)
    {
      unsigned long l;
    
      l = (long)s;
      l = (l+3)&~3;
      return (char *)l;
    }
    
    char *CopyWide(short *dest, char *src)
    {
      do
          *dest++ = *src;
      while(*src++);
      return (char *)dest;
    }
    
    void CreatTempl(void)
    {
      DLGTEMPLATE *dlgt;
      DLGITEMTEMPLATE *dlgit;
      char *s;
    
      dlgt = (DLGTEMPLATE *)templ;
      dlgt->style           = WS_SYSMENU;
      dlgt->dwExtendedStyle = 0;
      dlgt->cdit            = 1;
      dlgt->x               = 10;
      dlgt->y               = 10;
      dlgt->cx              = 200;
      dlgt->cy              = 200;
      s = (char *)(dlgt+1);
      s += 2;/* menu */
      s += 2;/* class */
      /*s += 2;*//* title */
      s = CopyWide((short *)s, "Schweine im Weltall");
    
      s = Even4(s);
      dlgit = (DLGITEMTEMPLATE *)s;
      dlgit->style           = WS_CHILD | WS_VISIBLE;
      dlgit->dwExtendedStyle = 0;
      dlgit->x               = 10;
      dlgit->y               = 10;
      dlgit->cx              = 40;
      dlgit->cy              = 40;
      dlgit->id              = 20;
      s = (char *)(dlgit+1);
      /*s += 2;*//* class */
      s = CopyWide((short *)s, "button");
      /*s += 2;*//* title */
      s = CopyWide((short *)s, "OK");
      s += 2;/* dsize */ 
    }
    
    int _stdcall dialogproc(HWND hwnd, unsigned int message, unsigned int wParam, long lParam)
    {
      switch(message)
        { case WM_INITDIALOG:
    	  return 1;
          case WM_KEYDOWN:
    	  EndDialog(hwnd, 28);
    	  return 1;
          case WM_COMMAND:
    	  EndDialog(hwnd, 30);
              return 1;
        }
      useparms(0, wParam, lParam);
      return 0;
    }
    
    void DoDialogBox(HWND hwnd)
    {
      CreatTempl();
      ReturnValue = DialogBoxIndirectParam(hInstGlobal, (DLGTEMPLATE *)templ, hwnd,
    				       dialogproc, 0);
    }
    

Log in to reply