Combobox dropdownfeld automatisch an inhalt anpassen
-
hallo,
ich bin mir nicht sicher ob es das überhaupt gibt, aber wenn ja, wie kann ich erreichen, dass wenn ich eine Combobox anklicke und sich die liste öffnet, sich die listenbreite automatisch an den breitesten eintrag anpasst? Ich will also nicht die komplette Combobox verbreitert haben sondern nur die liste.
ich hoffe mein anliegen ist halbwegs verständlich erklärt
danke schonmal für eure antworten
mfg, TFTS
-
gabs da nich was mit SetHorizontal...irgendwas???
-
Frisch aus der MSDN
// The pointer to my combo box. extern CComboBox* pmyComboBox; // Find the longest string in the combo box. CString str; CSize sz; int dx = 0; TEXTMETRIC tm; CDC* pDC = pmyComboBox->GetDC(); CFont* pFont = pmyComboBox->GetFont(); // Select the listbox font, save the old font CFont* pOldFont = pDC->SelectObject(pFont); // Get the text metrics for avg char width pDC->GetTextMetrics(&tm); for (int i = 0; i < pmyComboBox->GetCount(); i++) { pmyComboBox->GetLBText(i, str); sz = pDC->GetTextExtent(str); // Add the avg width to prevent clipping sz.cx += tm.tmAveCharWidth; if (sz.cx > dx) dx = sz.cx; } // Select the old font back into the DC pDC->SelectObject(pOldFont); pmyComboBox->ReleaseDC(pDC); // Set the horizontal extent so every character of all strings can // be scrolled to. pmyComboBox->SetHorizontalExtent(dx);
-
ohje, das iss ja fett, ich glaub das musst du mir heut abend nochmal erläutern.
wäre es denn eventuell einfacher die liste auf eine feste breite zusetzen, die aber dennoch breiter als die eigentliche combobox ist?
danke erstmal,
mfg, TFTS
-
TFTomSun schrieb:
ohje, das iss ja fett, ich glaub das musst du mir heut abend nochmal erläutern.
das mit der festen Breite musst du probieren...
pmyComboBox->SetHorizontalExtent(250);
-
mein problem ist, wie kann ich meine combobox dort bekannt machen... irgendwo muss doch die IDC_COMBO_meineCombo hin oder? bzw. in welche funktion muss ich das reinschreiben?
außerdem muss ich doch dafür bestimmt irgendne headerdatei includen oder?
mfg, TFTS
-
hmm, ich denke mal du kannst das in die OnInitDialog schreiben...
und du hast ja eine Membervariable vom Typ CComboBox... z.B. m_combo.
die tutentust du dann nehmen
-
hab ich versucht ... hat natürlich prompt nicht geklappt *g* ... naja ich probier weiter
mfg, TFTS
-
m_meineComboVariable.SetHorizontalExtent(breite);
nimmt der compiler zwar, aber ich konnte keinen effekt feststellen. wenn ich:
m_meineComboVariable->SetHorizontalExtent(breite);
eingebe, meckert der compiler dass der -> operator für die klasse CCombobox nicht überladen ist ... ist ja auch irgendwo verständlich.
also wo bring ich meine Combobox variable unter, damit ich den -> operator verwenden kann?
mfg, TFTS
-
Hallo,
das geht auf alle Fälle auch mit der ersten Variante. Schreibe doch einfach mal ein paar feste Zahlen in die Funktion und schau was passiert. Vergiss nicht das UpdateData hinterher bzw. nimm einen Hilfsbutton und versuch es erstmal auf Konopfdruck. Wenns dann dort funktioniert geht es meist auch wo anders. Es kann aber auch sein, das du so keine Reaktion siehst, weil die Box noch garnicht wircklich da ist(deshalb mal mit Hlfsbutton versuchen.
-
hm.
ich hab folgendes in eine OnButtonClick Funktion eingegeben:
m_combo.SetHorizontalExtent(250); UpdateData(false);
doch nix passiert. was müsste den eigentlich für ein effekt zu sehen sein? hätte ich dann einen horizontalen scrollbalken in meiner geöffneten combobox?
müssen vielleicht spezielle Einstellungen bei den Eigenschaften der Combobox vorgenommen sein, damit SetHorizontalExtent funktioniert?
mfg, TFTS
-
Hallo,
also das steht in der MSDN:
Sets the width, in pixels, by which the list-box portion of the combo box can be scrolled horizontally.
void SetHorizontalExtent(
UINT nExtent
);
Parameters
nExtent
Specifies the number of pixels by which the list-box portion of the combo box can be scrolled horizontally.
Remarks
If the width of the list box is smaller than this value, the horizontal scroll bar will horizontally scroll items in the list box. If the width of the list box is equal to or greater than this value, the horizontal scroll bar is hidden or, if the combo box has the CBS_DISABLENOSCROLL style, disabled.
Example// The pointer to my combo box. extern CComboBox* pmyComboBox; // Find the longest string in the combo box. CString str; CSize sz; int dx = 0; TEXTMETRIC tm; CDC* pDC = pmyComboBox->GetDC(); CFont* pFont = pmyComboBox->GetFont(); // Select the listbox font, save the old font CFont* pOldFont = pDC->SelectObject(pFont); // Get the text metrics for avg char width pDC->GetTextMetrics(&tm); for (int i = 0; i < pmyComboBox->GetCount(); i++) { pmyComboBox->GetLBText(i, str); sz = pDC->GetTextExtent(str); // Add the avg width to prevent clipping sz.cx += tm.tmAveCharWidth; if (sz.cx > dx) dx = sz.cx; } // Select the old font back into the DC pDC->SelectObject(pOldFont); pmyComboBox->ReleaseDC(pDC); // Set the horizontal extent so every character of all strings can // be scrolled to. pmyComboBox->SetHorizontalExtent(dx);
-
ja das hab ich natürlich auch schon gelesen. aber da wird das ja mit diesem -> operator gemacht. ich weiss nur nicht wie ich den verwenden soll wenn ich ne einfache combobox mit membervariable hab. ich glaub das problem ist, wie ich einen pointer erzeuge der auf meine combobox zeigt. das übersteigt mein derzeitiges wissen
mfg, TFTS
-
If the width of the list box is smaller than this value, the horizontal scroll bar will horizontally scroll items in the list box. If the width of the list box is equal to or greater than this value, the horizontal scroll bar is hidden or, if the combo box has the CBS_DISABLENOSCROLL style, disabled.
schonmal probiert einen seeeeehr langen String in die Combobox zu werfen?
Übrigens: in vielen Fällen ist es absolut Latte, ob du nen Pointer hast oder ni, also mach es mit dem "." - Das muss auch gehen...
Greez
EDIT: wenn das alles nix hilft, such dir ein anderes Control (CodeGuru, Codeproject, www) ein neues zu schreiben schlag ich dir lieber ni vor
-
ja ich hab nen ganz langen string drin. und er wird nicht komplett angezeigt. meine combobox liste ist genauso breit wie die combobox und hat auch keinen horizontalen scrollbalken. Vielleicht muss man ja in den eigenschaften was bestimmtes drin haben. zb. Dropdown-Listenfeld anschatt nur dropdown oder sowas. ich weiss halt nicht wo ich anfangen soll zu suchen.
selbst gemacht hat das hier noch niemand oder?
mfg, TFTS
PS: wie meinst du das mit dem anderen control? einer andere/neue combobox bzw. etwas combobox ähnliches in mein c einbinden?`
-
wie könnte ich denn den pointer erstellen? wäre das denn so schwer? vielleicht gehts ja dann mit pointer
-
Anscheinend nicht...
Die Eigenschaften musst du aber schon selber durchprobieren, oft genug hat ein Haken hier oder da das ganze verbessert, oft genug aber auch ni...
Also nicht entmutigen lassen, und nicht ewig rumfrikkeln... wenn es ni geht, dann lass es oder mach es komplett anders...Greez
Edit: na klar ein anderes Control... oder dachtest du die paar Dinger im Visual Studio sind alle?
-
was ist rumfrikkeln? hab schon alle eigenschaften, die in meinen augen relevant sein könnten durchprobiert ... kein erfolg
wie geht das mit dem pointer? (das ist jetz mein versuch, es komplett anders zu machen
)
mfg, TFTS
-
#define rumfrikkeln ewiganeinersachesitzenundnichtweiterkommen
-
#define Zeit istetwaswovonichgenughab
nochmal die frage... wie mach ich das mit dem Pointer?