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

Vytvoření oedit boxů dynamicky – C / C++ – Fórum – Programujte.comVytvoření oedit boxů 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
7. 7. 2015   #1
-
0
-

Začínám s dynamickým vytvářením edit boxů. Cílem je vytvořit číselnou matici pomocí editboxů:

void createEditbox1(HWND dialog, int id, int x, int y, int w, int h){
    HWND hwndEdit = CreateWindowEx(
            0, "EDIT",   // predefined class 
            NULL,         // no window title 
            WS_CHILD | WS_VISIBLE | WS_BORDER |
            ES_NUMBER, 
            x, y, w, h,   // set size in WM_SIZE message 
            dialog,         // parent window 
            (HMENU) id,   // edit control ID 
            (HINSTANCE) GetWindowLong(dialog, GWL_HINSTANCE), 
            NULL);        // pointer not needed 
	SendMessage(hwndEdit, WM_SETTEXT, 0, 0); // add text to window
}
void Display_Matrix(HWND dialog, int matrixSize = 4){
	int w = 23;
	int h = 16;
	int paddingx = 2;
	int paddingy = 2;
	int offsetx = 130;
	int offsety = 130;
	int beginx = offsetx;
	int beginy = offsety;
	int stepx = w + paddingx;
	int stepy = h + paddingy;
	int endx = offsetx + ( matrixSize * stepx );
	int endy = offsety + ( matrixSize * stepy );
	int x, y, i = 0;
	int count = matrixSize * matrixSize;
	int id = 5000;
	for (x = beginx; x <= endx; x += stepx )
		for (y = beginy; y <= endy; y += stepx )
			{
			id++;
		    createEditbox1(dialog, id, x, y, w, h);
			}
}

Mám dva, tři problémy možná víc.

1) Proč se mi nastavilo písmo jako u nadpisu okna? Je to velké tlusté písmo a očekával bych tam font který používám v oknech pro čtení běžného textu, asi Arial 10 normal. Jak toto opravit nebo nastavit aby se to nemuselo dodatečně opravovat?

2) nefungují mi tam taby na přepínání mezi prvky co s tím? Je třeba tam nastavit zachytávání zpráv? To je asi dost náročné na výkon a na kód nastavit všechny zprávy těm 100 edit boxům, co?

3) Jakým způsobem bych to měl udělat když bych chtěl zpracovat zprávy je nutné vytvořit pro každý control samostatnou funkci? To by bylo asi dost strašně nepřehledné. Vytvořit 100 funkcí na zachytávání zpráv? Se vsadím že by ta aplikace brzo zamrzla.

Nahlásit jako SPAM
IP: 78.45.87.–
Reklama
Reklama
Radek Chalupa
~ Redaktor
0
Super člen
7. 7. 2015   #2
-
+1
-
Zajímavé

#1 oxidián
1. HFONT hf = (HFONT)GetStockObject(DEFAULT_GUI_FONT);

A tenhle múžeš nastavit pomocí WM_SETFONT těm vytvořeným oknům.

Pokud to chceš mít "lepší", tak zavolat IsAppThemed a pokud vrátí TRUE tak ten font vytvořit třeba takhle

LOGFONT logfont;
if (GetThemeSysFont(OpenThemeData(hwnd_okna, L"Window"), TMT_MSGBOXFONT, &logfont) != S_OK)
{

 // něco je v prd...

}
hf = CreateFontIndirect(&logfont);

2. Do stylu těch editů přidat WS_TABSTOP

3. Ty standardní ovl. prvky mají svoji výchozí proceduru okna v systému, ale hodně zpráv o událostech posílají rodičovskému okno pomocí tzv. notifykačních zpráv - u editcontrol jejich čísla začínají na EN_...

Pokud chceš něco co nejde předs notifykaci, musíš ty edity tzv. subclassovat, viz, např. zde" http://www.radekchalupa.cz/…ss-ovl-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
8. 7. 2015   #3
-
0
-

Používám Windows XP, takže tu funkci nemohu použít. Zkoušel jsem místo ní tuto:

http://www.codeproject.com/Articles/10564/How-to-accurately-detect-if-an-application-is-them

ale hlásí mi to chybu zde:

HMODULE hMod = LoadLibrary(_T("uxtheme.dll"));

_T není definováno

Kdyby se to nepovedlo rozjet tak tam hodím to první cos mi dal.

Zbytek ještě musím dočíst a prostudovat.

Zatím díky

Edit:

někdo mi poradil:

před vytvořením ovládacího prvku
HFONT hDefaultFont = (HFONT) SendMessage(dialog, WM_GETFONT, 0, 0);
a

SendMessage(hwndEdit, WM_SETFONT, (WPARAM)hFont, false);

před vložením vytvořeného okna do rodiče.

Zdá se mi to mnohem jednodušší než šaškovat s funkcí pro Themes. Ten font co tam mám je z themes a funguje mi to.

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

Tak se pomalu dostávám do toho Vašeho tutorialu. Takže chápu to správně?

case WM_INITDIALOG:
  oldProc = (WNDPROC)SetWindowLongPtr(GetDlgItem(hWnd, IDC_EDIT1),
    GWLP_WNDPROC, (LONG_PTR)WindowProcEdit);
  oldProc = (WNDPROC)SetWindowLongPtr(GetDlgItem(hWnd, IDC_EDIT2),
    GWLP_WNDPROC, (LONG_PTR)WindowProcEdit);
	break;

Že vlastně musím všem prvkům (editům) podobným způsobem přiřadit jednu a tu samou proceduru, pokud nebudu chtit jinou, a to udělám pravděpodoně pomocí smyčky, místo IDC_EDIT1, IDC_EDIT2, IDC_EDIT3 atd. dosadím proměnnou int i, která se bude navyšovat, v mém případě od id 5001 do id 50121  (tj. matice 11x11).
 

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

#3 oxidián
Ten výchozí font z "themes" se v XP neprojeví, ale ve Vistě a výš je to o něco ivětší a čitelnější písmo. Jinak ty zmíněné funkce jsou (podle MSDN dokumentace) i ve Windows XP (runtime), jen musíš mít nastavenou dostatečně vysokouu hodnotu _WINVER a samozřejmě distatečně aktuální Windows SDK - tj. headery a .lib knihovny.

_T je makro pro univerzálnost textových konstant ve smyslu ansi vs. unicode. Mělo by být v tchar.h, nebo totéž dělá makro TEXT, které je v  "běžnějším headeru". Ale v dnešná době bych doporučil kompilovat výhradně pro unicode a pak textové konstanty uvádět pomcí L"nejaký unicode text".

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.–
Radek Chalupa
~ Redaktor
0
Super člen
8. 7. 2015   #6
-
0
-

#4 oxidián
Ano lze to tak udělat, jen nesmíš zapomenout defaultně volat CallWindowProc (pro výchozí obsluhu editu) a to kterému konkrétnímu okno zpráva patří je v parametru HWND té procedury.

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, 63 hostů

Podobná vlákna

Teletext do boxu — založil Matěj Andrle

Mazani boxu — založil Hurys

Pole picture boxu? — založil Karel

C# - Enabled na Check boxu — založil polerok

Winapi pozadí Edit boxu — založil vollf82

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ý