Listbox dynamicky – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Listbox dynamicky – C / C++ – Fórum – Programujte.comListbox dynamicky – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
oxidián0
Věrný člen
5. 7. 2015   #1
-
0
-

Řeším dva problémy. Vytvořil jsem si formulář ve kterém je hodně comboboxů tak abych ušetřil místo chci je smrsknout, zužit, ale když na ně kliknu tak se mají roztáhnout tak aby byly vidět celé položky v seznamu. Druhý problém je to že těkových položek mám více pohybuje se to kolem 8-mi až 16-ti comboboxů na stránku.

Takže mám dvě otázky: dají se nějak jednoduše vytvořit combo boxy (mám Visual Studio C++ 2010) dynamicky? A jak udělat to automatické nastavení listboxu když na něj kliknu?

Nahlásit jako SPAM
IP: 78.45.87.–
Reklama
Reklama
Radek Chalupa
~ Redaktor
0
Super člen
5. 7. 2015   #2
-
0
-

Nenapsal jsi zda je to WinAPI nebco WinForms (tj .NET) aplikace...Pokud jde o roztažení té rozbalené rolety comboboxu na šířku větší než je vlastní šířka okna cb, tak pomocí zprávy CB_SETDROPPEDWIDTH, tj. např:

SendMessgae(hwnd_combo, CB_SETDROPPEDWIDTH, 500, 0); // nastaví šířku na 500 pixelů

Co myslíš tím "automatickým nastavením listboxu", bohužel netuším....

Radek Chalupa
- individuální konzultace, školení programování (C/C++, WinAPI, COM, ActiveX, ATL, C#, NET Framework, MFC)
- vývoj software na zakázku
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 89.177.51.–
oxidián0
Věrný člen
5. 7. 2015   #3
-
0
-
Nahlásit jako SPAM
IP: 78.45.87.–
oxidián0
Věrný člen
6. 7. 2015   #4
-
0
-

controlFunctions.h

#ifndef CONTROLFUNC_H
#define CONTROLFUNC_H
#include <windows.h>

bool setComboBox_width(HWND dialog, int CID, int width, bool status);

#endif	// CONTROLFUNC_H

controlFunctions.cpp

#include "controlFunctions.h"

bool setComboBox_width(HWND dialog, int CID, int width, bool status){
		HWND control = GetDlgItem(dialog, CID);
		SendMessage(control, CB_SETDROPPEDWIDTH, width, 0);
return !status;
}

editunits2.h

#ifndef EDITUNITS2_H
#define EDITUNITS2_H

// included files here...

#include "controlFunctions.h"

struct UWidthsbase_t 
{
    int collapse;
    int expand;
};

struct UWidths_t 
{
    UWidthsbase_t group;
    UWidthsbase_t terrain;
    UWidthsbase_t uConst;
};

UWidths_t UWidths = { {31, 85}, {31, 185}, {31, 200}};
UWidthsbase_t * pUWidthsClass = &(UWidths).group;
UWidthsbase_t * pUWidthsTerrain = &(UWidths).terrain;
UWidthsbase_t * pUWidthsConst = &(UWidths).uConst;

#endif	// EDITUNITS2_H
INT_PTR CALLBACK Units2DlgProc(HWND dialog, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch (msg)
		{
		case WM_INITDIALOG:
			ret = Units_HandleInit2(dialog);		
		break;

		case WM_COMMAND:
			ret = 0;
			Units_HandleCommand2(dialog, HIWORD(wParam), LOWORD(wParam), (HWND)lParam);
		break;
		}
}
void Units_HandleCommand2(HWND dialog, WORD code, WORD id, HWND control)
{
	switch (code)
	{ 
	  case BN_CLICKED:		
	  break;
	  case CBN_SELCHANGE:
	  break;

	case EN_SETFOCUS:
	break;

	case EN_KILLFOCUS:
	break;
	case CBN_DROPDOWN:
		if ( id >= IDC_UCLASS1 || id <= IDC_UCLASS16)
			setComboBox_width(dialog, id, (*pUWidthsClass).expand, true);
		else if ( id >= IDC_TERRAIN1 || id <= IDC_TERRAIN16 )
			setComboBox_width(dialog, id, (*pUWidthsTerrain).expand, true);
		else if ( id >= IDC_UCONST1 || id <= IDC_UCONST16 )
			setComboBox_width(dialog, id, (*pUWidthsConst).expand, true);
		
	break;
	case CBN_CLOSEUP:
		if ( id >= IDC_UCLASS1 || id <= IDC_UCLASS16)
			setComboBox_width(dialog, id, (*pUWidthsClass).collapse, false);
		else if ( id >= IDC_TERRAIN1 || id <= IDC_TERRAIN16 )
			setComboBox_width(dialog, id, (*pUWidthsTerrain).collapse, false);
		else if ( id >= IDC_UCONST1 || id <= IDC_UCONST16 )
			setComboBox_width(dialog, id, (*pUWidthsConst).collapse, false);		
	break;
	}
}

Mám hotovo, ale zatím nemohu přijít proč se mi všude nastavuje stejná šířka když rozbaluju.

Nahlásit jako SPAM
IP: 78.45.87.–
Radek Chalupa
~ Redaktor
0
Super člen
6. 7. 2015   #5
-
0
-

#4 oxidián
Samozřejmě můžeš to odkrokovat a zjistit kudy to jde a co se předává za hodnoty, ale určutě bych to nastavení šířky rozbalení dal do obsluhy WM_INITDIALOG (resp. pokud ty cb vytváříš ručně tak hned po vytvoření každého okna). Nejsem si jistý (samozřejmě není nic jednoduššího si to vyzkoušet), zda v obsluze CBN_DROPDOWN už není pozdě a ta hodnota musí být nastavená před inicializací rozbalení - každopádně tu hodnotu si cb pamatuje pro všechny další rozbalení až do zrušení okna nebo nastavení jiné šířky.

PS: Tu vlastní funkci pro nastavení šířky můžeš nahradit funkcí SendDlgItemMessage, která má jako první 2 parametry handle dialogu (resp. parent okna) a ID ovládacího prvku.

Radek Chalupa
- individuální konzultace, školení programování (C/C++, WinAPI, COM, ActiveX, ATL, C#, NET Framework, MFC)
- vývoj software na zakázku
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 89.177.51.–
oxidián0
Věrný člen
6. 7. 2015   #6
-
0
-

Toho že si pamatuje nastavení šířky jsem si už všiml a to druhé jsem opravil. Dík.

Nahlásit jako SPAM
IP: 78.45.87.–
oxidián0
Věrný člen
7. 7. 2015   #7
-
0
-

A jak vyřešit ten druhý problém? Tj. vytvořit prvky dynamicky. Mám okno a do něj potřebuju umístit editboxy s číslama které si tam dosadím. Má to být taková tabulka (matice) řekněme 9x9 edit boxů. Myslím že je vhodné to vytvořit dynamicky.

Nahlásit jako SPAM
IP: 78.45.87.–
Radek Chalupa
~ Redaktor
0
Super člen
7. 7. 2015   #8
-
0
-

#7 oxidián
Jistě, pomocí CreateWindowEx...

Nahlásit jako SPAM
IP: 89.177.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 143 hostů

Podobná vlákna

ListBox C# — založil ListBox C#

Listbox HELP — založil Ghafan

Listbox — založil Synek

ListBox zo súboru — založil lukyno010

C# listbox sloupce — založil crash

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý