Stránka 6 z 7
Napsal: stř 5. zář 2007, 16:11
od Coburn
Dík moc!
btw neexistuje nějaká funkce, která by vyvolala něco jako dropmenu pod editboxem, nevim jak se to jmenuje... Je to strašně podobný comboboxu, ale nema to takovou tu dropšipku a je to automatický... Má to v sobě Internet explorer (třeba když píšu do googlu nějaký slovo, objeví se pod nim bílej obdelník a v něm se vypíšou poslední hledané výrazy)
Nevíš o něčem takovym?

Napsal: stř 5. zář 2007, 20:11
od €agle
Primo funkce na to nebude. Bud to muzes udelat jako listbox, ktery se po urcitem case zobrazi pod editboxem, nebo to muzes zkusit udelat pres ownerdrawn combobox...
Napsal: stř 5. zář 2007, 23:33
od Coburn
thx, listbox mám, ještě bych se chtěl zeptat
1) jak nastavim, aby se listbox zobrazoval nad ostatnimi DlgItemy v okně
2) dá se nastavit, abych mohl na list box kliknout a aktuální řádek se zvýrazní a načte do proměnný, nebo je lepší řešení to ownerdrawn combobox?
3) jak se zjistí hodnota comboboxu?
Napsal: čtv 6. zář 2007, 15:28
od €agle
Hodnota ComboBoxu, tedy text ktery je prave vybran ziskas poslanim zpravy CB_GETCURSEL. Dostanes index, pomoci ktereho pak zpravou CB_GETLBTEXT dostanes vlastni text. Pri zmene vyberu se navic posila notifikace CBN_SELCHANGE, takze lze zmenu snadno zpracovat.
Kód: Vybrat vše
char * ComboText = NULL; //globalne definovana promena pro ulozeni vybraneho textu z comboboxu
...
//ve funkci pro zpracovani zprav dialogu
...
case WM_COMMAND:
switch(LOWORD(wParam))
{
...
case 1002: //ID ComboBoxu
switch(HIWORD(wParam))
{
int CurIndex, TxtLen;
case CBN_SELCHANGE: //vybrana polozka v comboboxu
CurIndex = SendMessage((HWND) lParam, CB_GETCURSEL, 0, 0); //ziska index aktualni polozky
if(ComboText) delete [] ComboText; //smaze stary text
TxtLen = SendMessage((HWND) lParam, CB_GETLBTEXTLEN, CurIndex, 0); //ziska delku textu
ComboText = new char[TxtLen + 1]; //vytvori novy text ziskane delky
SendMessage((HWND) lParam, CB_GETLBTEXT, CurIndex, (LPARAM) ComboText); //nacte novy text
break;
}
...
}
S tim listboxem k textu to bude jednodussi, kdyz si ho vytvoris jako samostatne okno se stylem WS_POPUP, nejak takhle:
Kód: Vybrat vše
RECT tmpRect;
GetWindowRect(GetDlgItem(hwnd, 1002), &tmpRect);
hwndList = CreateWindow("LISTBOX", "ListBox", WS_POPUP | LBS_STANDARD, tmpRect.left, tmpRect.bottom, 200, 100, hwnd, 0, hThisInstance, NULL);
Tenhle kod vytvori samostatny listbox vznasejici se nad dialogem. Pokud s nim budes spravne zachazet (tzn nepisu text->schovat, pisu text->nacist do listboxu podobna slova a zobrazit), bude se to chovat stejne jako ten v exploreru. Jinak zpracovani zprav od ListBoxu je vicemene stejne jako od ComboBoxu, akorat misto CB_ je tam LB_,
Napsal: čtv 6. zář 2007, 23:18
od Coburn
no, tak jsem si udělal
staticHWND a pod něj napsal ten kód, ale mám s tim dva problémy:
1) listbox se vytvoří jako samostatný okno (je i v liště) a nakreslí se cca v levém horním rohu obrazovky, přestě ty rozměry získané GetwindowRectem
2) používá to system fixed font, nebo jak se to jmenuje, jak se tam nastavuje "Dialogovej" font?
THX za vše
Napsal: pát 7. zář 2007, 20:17
od Coburn
problém je v tom, že když něco píšu do editboxu, listbox se překryje oknem s editboxem a když si tam dám automatickou aktivaci listboxu, musim znova kliknout na editbox, abych mohl psát, čímž zase zmizí listbox.
Pak kdyby se dala zrušit to okno na liště...
díky

Napsal: sob 8. zář 2007, 14:15
od €agle
Ten kod, co jsem psal o kus vyse vytvori ListBox tesne pod EditBoxem, bez okraju, bez zobrazeni v liste a navic zustava v popredi i kdyz pises do EditBoxu... Akorat tam musis spravne nastavit handly (hwnd je handle dialogu, 1002 je ID editboxu, hwndList je vysledny handle ListBoxu).
Napsal: ned 9. zář 2007, 12:44
od Coburn
chápu správně, že handle dialogu(hwnd) je okno, kde je nakreslený editbox a vysledny handle ListBoxu(hwndList) je HWND okno, které tvoří Listbox?
Pořád to tam mám jako dvě okna...
pak jeden irelevantní dotaz: dá se vytvořit multiline char
nebo přidat do editboxu text, aby se nesmazal původní text?
Díky
Napsal: ned 9. zář 2007, 14:27
od €agle
To je divne, ze by ten samy kod delal u tebe neco jineho, nez u me... Posli kod, kterym vytvaris ten ListBox.
Multiline char takto vytvorit muzes. Pridat do editboxu text, aby se nesmazal puvodni nejde, muzes nacist stary, spojit s novym a nastavit editboxu.
Napsal: ned 9. zář 2007, 14:56
od Coburn
no, tak z googlu jsem vyčetl, že na podporu newline v editboxu musim přidat nějaky parametry
ES_MULTILINE
ES_WANTRETURN
ES_AUTOHSCROLL
Nemůžu je ale přidat, protože ho mám vytvořenej v rc.souboru
existuje nějaká alternativa? V ResEdu mám multiline aktivovaný...
kód s listboxem osekám a pošlu, díky moc
EDIT: OK, v pohodě, problém byl v tom, že jsem volal dialog až po vytvoření listboxu

. Mám tam víc dialogovejch oken tak "se to nalepilo" z pro mě neznámýho důvodu na ten dialog, co byl volán před ním.
btw jak se mění font?
Napsal: ned 9. zář 2007, 18:01
od €agle
Kdyz mas ty parametry zadane v resource editoru, tak je v programu nemusis zadavat znovu. Multiline se tam zadat da, WantReturn (Wantcr) taktez a AutoScroll taky. Jediny problem je, ze na ukonceni radku musis misto standartniho \n pouzit \r\n pak to jde bez problemu.
Font se meni bud v resource editoru pro cely dialog, nebo pomoci zpravy WM_SETFONT pro jednotliva okna. Nejprve treba pomoci funkce
CreateFont vytvoris font, ktery chces pouzit a pak pomoci SendMessage(DestHwnd, WM_SETFONT, (WPARAM) Font, true); nastavis font prislusnemu oknu. Font musi byt v pameti po celou dobu behu programu, takze ho doporucuji vytvorit nekde na zacatku.
Napsal: úte 18. zář 2007, 12:44
od Coburn
díky za všecko

,
btw neexistuje něco jako getfont, že by si to okopírovalo font z konkretniho dialogovyho okna?
Pak ještě jestli existuje nějaká funkce, která by seřadila 50 charů podle abecedy...
THX

Napsal: stř 19. zář 2007, 23:37
od €agle
Myslis jako ziskat font nejakeho konkretniho prvku v dialogu? Melo by fungovat tohle:
Kód: Vybrat vše
HDC hDC = GetDC(HwndTarget);
HFONT Font = GetCurrentObject(hDC, OBJ_FONT);
ReleaseDC(hDC);
Funkce na razeni zadna obecna neni, ale radicich algoritmu je spousta a napsat vlastni neni zadny problem...
Napsal: pon 24. zář 2007, 17:14
od Coburn
THX, měl bych tady ještě jeden lamackej dotaz
Např v průvodci instalací nějakého programu má okno nějaký obsah a tlačítko další. když na něj kliknu, tak se obsah změní (někdy je tam licenční smlouva, někdy editbox atd). ty všechny položky tam jsou od začátku načtené za běhu programu a skrývají se něčím podobným jako
, nebo je to jinak. Chtěl bych se zaptat, jak to vlastně funguje

díky
Napsal: čtv 27. zář 2007, 15:47
od €agle
Muzes to udelat jako dialog v dialogu, tzn udelas si jeden hlavni, ktery bude obsahovat ty tlacitka dalsi, konec a tak a umististis do nej ram, ve kterem se bude zobrazovat aktualni stranka. Pak si udelas vlastni dialogy pro jednotlive podstranky. Dale mas dve moznosti, bud vytvoris vsechny podstranky najednou a vsechny krome aktualni skryjes, nebo vytvoris jen jednu a pri kazde zmene stranky tu starou znicis a vytvoris novou... Ta prvni moznost ma vyhodu v tom, ze si bude pamatovat predchozi zadane hodnoty, tzn prechod na predchozi stranku bude bez problemu... Dialog v dialogu vytvoris normalne pomoci funkce CreateDialog, akorat jako handle parent okna das misto HWND_DESKTOP handle ramu, kam ho chces umstit.
Dalsi variantou by pak bylo udelat to jako TabStrip, kde by kazda zalozka obsahovala jeden dialog, coz by ale funkcne bylo stejne, jako vyse uvedene reseni...
Napsal: úte 2. říj 2007, 19:06
od Coburn
hh, dík, nechápu ale jak mám do rámu načíst dialog

. Je na to nějaká funkce?
Pak bych tady měl jeden o něco důležitější dotaz, a to jak načtu do obrázkovýho pole v rc souboru jpg/bmp soubor. zkoušel jsem LoadImage, ale asi špatně.
btw dá se tlačítko vytvořené za běhu programu attachnout do okna z rc souboru?
Díky
Napsal: stř 3. říj 2007, 21:45
od €agle
Normalne jako vytvaris dialog z .rc souboru pomoci funkce
Kód: Vybrat vše
HWND hwndDialog = CreateDialog(hThisInstance, MAKEINTRESOURCE(1000), HWND_DESKTOP, DialogProc);
tak pouzijes tu samou funkci, ale misto HWND_DESKTOP zadas handle toho ramu. Pokud chces treba vytvorit dialog s ID 2000 do ramu s ID 1001 v prvnim dialogu, pouzijes
Kód: Vybrat vše
HWND hwndInDialog = CreateDialog(hThisInstance, MAKEINTRESOURCE(2000), GetDlgItem(hwndDialog, 1001), DialogProc);
Funkci pro zpracovani zprav muzes bud pouzit tu samou (a odlisit IDcka), nebo samostatnou...
Kdyz chces vytvorit tlacitko, postupujes stejne - do CreateWindow zadas jako parent handle ne HWND_DESKTOP, ale handle dialogu. Tlacitko se ti vytvori do nej a bude fungovat jako kdyby bylo jeho soucasti uz v .rc souboru.
Co se tyce nacitani obrazku, tak by melo jit, ze ho zadas v ResEdu a pak ho prave pomoci LoadImage nactes. Podporovany jsou ovsem myslim pouze formaty .ico a .bmp... Ja zobrazovani obrazku v dialogu resim pres GDI+, coz je takove univerzalnejsi...
Napsal: čtv 4. říj 2007, 02:33
od Coburn
Díky moc.
Nějak mi nefunguje WM_NOTIFY u těch novejch "přidanejch" tlačítek. Neexistuje nějaká aternativa?
zkoušel jsem vložit jeden dialog do TAB-pole v jiném dialogu, ale pořád se mi zobrazují dvě okna...
Napsal: ned 7. říj 2007, 22:51
od Coburn
hodil bys mi sem prosim kód na vytvoreni prazdneho obdelniku za behu programu?
jinak ten dialog v dialogu mi nejde ani, když je R_LIST v rc souboru...
thx...
Napsal: stř 10. říj 2007, 14:51
od €agle
Obdelniku jako okna, nebo obdelniku jako grafickeho obdelniku?
Jinak posli kod, kterym vytvaris ten dialog v dialogu, prece to zas nepujde jenom u me a u tebe uz ne...