Nach Upgrade von c++ VS2003 auf VS2005 Combo-Boxen defekt


  • Mod

    Und Du initialisierst sWindowInfo auch?

    Ansonsten ware das ein Bug Deinerseits.



  • Ich würde sagen, dass es initialisiert ist.
    Wie könnte es anders gehen, als mit:

    pControl->GetWindowInfo(&sWindowInfo);

    Unter VS2003 hat noch alles funktioniert.



  • Lies doch bitte zuerst immer die Doku dazu: GetWindowInfo:

    MSDN schrieb:

    pwi [in, out]

    Type: PWINDOWINFO

    A pointer to a WINDOWINFO structure to receive the information. Note that you must set the cbSize member to sizeof(WINDOWINFO) before calling this function.

    Und den Rückgabewert solltest du auch auswerten.


  • Mod

    elmut19 schrieb:

    Ich würde sagen, dass es initialisiert ist.
    Wie könnte es anders gehen, als mit:

    pControl->GetWindowInfo(&sWindowInfo);

    Unter VS2003 hat noch alles funktioniert.

    Du verstehst es nicht.
    sWindowInfo.cbSizemuss gefüllt warden!
    Hast Du esnun gefüllt? Oder nicht. Wenn es unter 2003 geklappt hat, dann war es evtl. reiner Zuifall, weil der Speicherinmhalt zufällig anders war und es dort gekalppt hat.

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms632610(v=vs.85).aspx

    Wenn Du cbSize nicht gesetzt hast ist es Dein Fehler. Nicht der von VS!



  • [quote="Martin Richter"]

    elmut19 schrieb:

    sWindowInfo.cbSizemuss gefüllt warden!
    Hast Du esnun gefüllt? Oder nicht.

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms632610(v=vs.85).aspx

    Wenn Du cbSize nicht gesetzt hast ist es Dein Fehler. Nicht der von VS!

    Ich habe es, wie beschrieben nun eingesetzt. Es hatte gefehlt.
    Nun rufe ich es so auf:

    sWindowInfo.cbSize=sizeof(WINDOWINFO);
    if (pControl->GetWindowInfo(&sWindowInfo))
       pControl->SetWindowPos(NULL,(int)(((ItemRect.left-Di ....
    

    Es klappt leider immer noch nicht.
    Ich habe in der Zwischenzeit nach einigen Code-Beispielen gesucht.
    Dort sind auch keine anderen Lösungen zu sehen.


  • Mod

    Was sagt dert Debugger. Sind die Werte wenigstens OK?



  • Die Übergabe Parameter habe ich weitgehend getestet.
    Es stehen immer integers zwischen 17 und 580 drin.
    Da dieses "SetWindowPos" in eier Schleife über alle Controls geht,
    die auf dem Dialog sind, weiss ich nicht genau, ob ich auch eine
    der Combo-Boxen erwischt habe. Denke aber schon (nach ca. 20 Durchläufen habe ich abgebrochen).

    Und sobald ich dieses "SetWindowPos" auskommentiere, gehen die Combos wieder.

    Da das Programm mein Vorgänger geschrieben hat, weiss ich nicht mal genau,
    wofür das eigentlich gut ist. Das Aussehen verändert sich für mich nicht erkennbar.
    Das Dialogfenster ist auch in der Grösse unveränderlich.



  • Hallo zusammen.
    Ich hab nun das Problem doch gelöst bekommen.
    Hab lange dafür suchen müssen. Ev. sind immer noch subjektive
    Eindrücke mit dabei, aber es geht nun.

    Letzlich liegt es doch daran, dass der neuere Compiler sich anders
    verhält als der alte. Und das hier durchgeführte "SetWindoPos" auf
    die Controls mit ihrer ermittelten Grösse (siehe oben), hat eine
    weitere Einflussnahme anscheinend auch unterdrückt, wie auch immer.
    Jedenfalls wurde auch versucht, in der OnInitDialog-Methode des
    betroffenen Views, die Grösse der ComboBox durch eine "SetDropDownHeight"-
    Methode zu korrigieren (Unter VS2003 unnötig, unter VS2005 zunächst wirkungslos).

    Dann bin ich in meine BaseDialog-Zwischenklasse gegangen und habe für die
    Controls vom Typ CComboBox die Höhe auf 4 Zeilen gesetzt (nachfolgender Code):

    if(pControl->IsKindOf( RUNTIME_CLASS( CComboBox ) ))
    	ItemRect.bottom = ItemRect.bottom + ((ItemRect.bottom - ItemRect.top)*4);
    

    Diese Änderung alleine hats dann auch noch nicht getan, da der Typ des Controls
    nicht erkannt wurde.

    Nun bin ich in meine Dialog-Klasse gegangen und habe die COmboBoxen
    als public Member und als "DDX_Conrol" definiert. Hierdurch wurde dann erst
    der Typ des Controls in der Basis-Klasse erkannt, und die Grösse wurde angepasst.

    DDX_Control(pDX, IDC_COMBO_VAR1, m_cmbVar1);
    

    Dass ich die Höhe fix auf 4 Zeilen gesetzt habe hatte keine EInfluss auf die
    tatsächlich angewandt Höhe. Diese hat sich der Anzahl Elemente angepasst.
    BEi 3 Elementen wara sie 3 Zeilen hoch und bei 10 Elementen war sie ca. 6 Zeilen
    hoch, mit Scrollbar.

    Aber nochmals vielen Dank für Eure Beteiligung.
    Das hat mir auch geholfen


  • Mod

    Es ware weitaus einfacher gewesen, wenn Du Dir einfach den Klassennamen geholt hättest. Dann hättest Du nicht für alles Membervariablen einbauen müssen.



  • genau das habe ich ja nun gemacht.
    Aber das scheint nur zu funktionieren, wenn man dieses Control
    als DDX_Control definiert. War jedenfalls hier so.
    Vielleicht ist es beim nächsten Compiler wieder anders.

    Und in meiner zwischengeschalteten Basisklasse CBaseDialog wird dieses
    "SetWindowPos" eben für alle Controls in einer Schleife durchgeführt,
    als Anpassung auf verschiedene Systeme (z.B. auch WinCE). Dazu wurde
    auch "SetWindowPos überschrieben, wie ich eben erst auch herausgefunden habe.


  • Mod

    Nein. Das ist nicht so.

    Den Classname kannst Du immer bekommen.
    IsKindOf kann nur funktionieren wenn Du DDX_Control verwendets. Sonst erkennt das System immer nur ein CWnd.


Anmelden zum Antworten