Stránka 5 z 7
Napsal: sob 25. srp 2007, 20:55
od Coburn
Thx
dělal jsem pokus, že si to celý napíšu uplně znova, ale povedlo se mi, že tlačítko z resource souboru vykreslilo na plochu místo na základní okno z rc souboru, které se ani nezobrazuje. Místo hlavního okna z rc souboru se zobrazuje konzolové okno.
Netušíš, v čem může být chyba?
Díky

Napsal: sob 25. srp 2007, 22:52
od €agle
To se takhle bez kodu da tezko rict, kde je chyba... Popravde aby se mi vykreslilo tlacitko rovnou na plochu, to se mi jeste nepovedlo

Napsal: pon 27. srp 2007, 14:05
od Coburn
Tak jsem na to šel jinou cestou, ale ať dělám co dělám, tlačítko z *.rc souboru se ne a ne pohnout
Dělám něco špatně?
Kód: Vybrat vše
HWND hwbutton = GetDlgItem(hwndDlg, 2001);
...
case WM_SIZE:
SetWindowPos(hwbutton, hwndDlg, 50, 50, 50, 50, 2001);
break;
...
Dík moc
Napsal: stř 29. srp 2007, 02:53
od €agle
Kdyz to mas ve WM_SIZE, tak to bude reagovat jenom, kdyz se zmeni velikost dialogu. Taky mas spatne ten posledni parametr u SetWindowPos, nema tam byt cislo okna, ale parametry (viz
MSDN). K presunu okna je ale stejne lepsi pouzit funkci MoveWindow...
Napsal: stř 29. srp 2007, 22:10
od Coburn
MoveWindow taky nefunguje
mohl bys mi prosim ukázat nějaký příklad jako minule, kde se vytvořené tlačítko v rc souboru načte do nějakého HWND přes GetDlgItem() a pak se určuje jeho velikost?
Bez tohodle příkladu se neknu, protože tam dělám asi jednu věc špatně a netušim kterou
Díky
Napsal: čtv 30. srp 2007, 00:16
od €agle
Jednoduchy priklad, tlacitko, ktere po dialogu jezdi ze strany na stranu:
zdrojak,
.rc soubor
Napsal: čtv 30. srp 2007, 02:15
od Coburn
Super, už to chápu, Dík moc
nevěděl bys ještě, jak se aktivujou XP a Vista buttonky? v ResEdu to funguje normálně, ale v Programu to působí jak z NT4
Napsal: čtv 30. srp 2007, 13:17
od €agle
Na zacatek programu includovat <commctrl.h>, na zacatku WinMain zavolat InitCommonControls(); v nastaveni projektu hned na prvni strane povolit "Support Windows XP Themes" a pak pridat do linkeru libcomctl32.a (s patricnou cestou).
Napsal: čtv 30. srp 2007, 22:51
od Coburn
THX
Dá se nějakým jednodužším způsobem natáhnout do editboxu odstavec o cca 300 slovech po 30zn, než abyh ho musel natahovat do programu přes fstream a pak ho přes strcat spojovat. přijde mi to zbytečně komplikovaný...
Napsal: pát 31. srp 2007, 13:04
od €agle
Muzes u fsteamu pouzit funkci getline na nacteni radku celeho radku, tim se ti to zjednodusi. Druha moznost je zjistit velikost souboru a pouzit funkci read.
Napsal: pát 31. srp 2007, 14:08
od Coburn
ta read vypadá hezky, jinak je tohle ono?
http://msdn2.microsoft.com/en-us/library/db5x7c0d.aspx
nějak to nechápu
Pak ještě dotaz jak nastavim ikonu *.rc souboru?
Díky
Napsal: pát 31. srp 2007, 18:45
od €agle
Ne to neni ono, to je pro .NET respektive C#.
Tohle je ono...
Nastavenim ikony .rc souboru myslis asi nastaveni ikony dialogu. Nejprve v resource editoru pridej Resource, typ Icon, Name a ID jaky chces (nesmi byt stejne jako nektera cast dialogu) a jako Filename cestu k souboru .ico. V .rc souboru by to melo nasledne vypadat nejak takto:
Kód: Vybrat vše
TestIcon ICON DISCARDABLE "C:/Icons/General.ico"
pricemz TestIcon je na zacatku definovano jako 1100 (#define TestIcon 1100).
V samotnem programu pote pouzij nasledujici na nastaveni ikony:
Kód: Vybrat vše
HICON hIcon = (HICON) LoadImage(hThisInstance, MAKEINTRESOURCE(1100), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE);
//hThisInstance je instance programu
//MAKEINTRESOURCE(1100) udava ID ikony, ktera se ma pouzit (1100)
//IMAGE_ICON udava, ze se jedna o ikonu
//0, 0 jsou vyska a sirka ikony, pri pouziti LR_DEFAULTSIZE se pouzije automaticka
SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM) hIcon);
//hwnd je okno, kteremu se ma ikona nastavit
//WM_SETICON - zprava pro nastaveni ikony
//ICON_SMALL nastavi malou ikonu (viditelna v taskbaru a ramu okna), ICON_BIG nastavi velkou ikonu (viditelna pri Alt-Tab)
//hIcon je handle ikony vytvorene horni funkci
Vyse uvedene funkce muzes volat v podstate kdykoli po vytvoreni dialogu, treba hned po CreateDialog nebo treba pri zpracovani zpravy WM_INITDIALOG...
Napsal: sob 1. zář 2007, 17:03
od Coburn
THX
měl bych ješte pár detailů:
1) Jak se zapisuje ve WinApi PerformStep, aby se zvětšil obsah progressbaru o x;
2) Dá se nějak odchytit stisknutí klávesy třeba ctrl + s?
3) Jak přidám do ComboBoxu slova, jestliše ho mám vytvořeny v *.rc souboru? Tušim, že to bude jednodušší, než listview
4) Jak se načítá hodnota Trackbaru do proměnné?
Dá se v trackbaru nastavit, aby skákal po třeba 25%?
Díky
Napsal: sob 1. zář 2007, 21:45
od €agle
1) ProgressBar se ve WinApi ovlada pomoci zprav, ktere mu posilas pomoci SendMessage. Nejdriv pomoci PBM_SETRANGE nastav rozsah (muzes nechat i defaultni 0-100) a pak pomoci PBM_SETPOS nastavis hodnotu v danem rozsahu a progressbar ji zobrazi. Pripadne muzes pouzit PBM_SETSTEP na nastaveni delta hodnoty, ktera bude pri kazdem poslani zpravy PBM_STEPIT prictena k aktualni hodnote. Vice na
MSDN
2) Ano dá. Klávesové zkratky se v dialogu zpracovavaji pomoci takzvanych Acceleratoru. V resource editoru pridas do projektu tabulku akceleratoru (Project/Add accelerator), pak pomoci Add pridas vsechny klavesove zkratky co potrebujes, kazde priradis unikatni jmeno a ID. Tabulce akceleratoru taky prirad nejake unikatni ID (treba ID tabuky 2000 a zkratky 2001, 2002...). Po ulozeni by .rc souboru mela tabulka akceleratoru vypadat nejak takto
Kód: Vybrat vše
#define IDR_ACCEL 2000
#define CtrlShiftK 2001
#define CtrlF 2002
IDR_ACCEL ACCELERATORS
BEGIN
75,CtrlShiftK,VIRTKEY,CONTROL,SHIFT,NOINVERT
70,CtrlF,VIRTKEY,CONTROL,NOINVERT
END
V programu je pote nejdriv potreba nacist tabulku akceleratoru pomoci LoadAccelerators()
Kód: Vybrat vše
HACCEL hAccel = LoadAccelerators(hThisInstance, MAKEINTRESOURCE(2000));
//hThisInstance - instance programu
//MAKEINTRESOURCE(2000) - 2000 je ID tabulky akceleratoru
a nasledne pridat funkci TranslateAccelerator() k funkcim na zpracovani zprav
Kód: Vybrat vše
TranslateAccelerator(hwnd, hAccel, &messages);
...
TranslateMessage(&messages);
DispatchMessage(&messages);
Nyni ti pri stisknuti dane kombinace prijde notifikace ve forme zpravy WM_COMMAND stejne, jako ti chodi treba od tlacitek
Kód: Vybrat vše
case WM_COMMAND:
switch(LOWORD(wParam))
{
case 2001:
MessageBox(0, "Ctrl-Shift-K", "Prvni", 0);
break;
case 2002:
MessageBox(0, "Ctrl-F", "Druhy", 0);
break;
}
break;
Dalsi info na
MSDN
3)
Kód: Vybrat vše
SendMessage(GetDlgItem(hwnd, 1002), CB_ADDSTRING, 0, (LPARAM) "Text");
//hwnd - handle dialogu
//1002 - ID ComboBoxu
//CB_ADDSTRING - zprava pro pridani polozky
//0 - nepouziva se, musi byt 0
//"Text" - text, ktery chces pridat
Opet viz
MSDN
4)
Kód: Vybrat vše
int Val = SendMessage(GetDlgItem(hwnd, 1003), TBM_GETPOS, 0, 0);
//Val je vysledna hodnota v rozmezi MinRange a MaxRange Trackbaru
//hwnd - handle dialogu
//1003 - ID TrackBaru
//TBM_GETPOS - zprava pro ziskani hodnoty
//0 - nepouziva se, musi byt 0
//0 - nepouziva se, musi byt 0
Tradicne na
MSDN
5) Muzes mu bud nastavit TickFrequency
Kód: Vybrat vše
SendMessage(GetDlgItem(hwnd, 1003), TBM_SETTICFREQ, (WPARAM) 10, 0);
//hwnd - handle dialogu
//1003 - ID TrackBaru
//TBM_SETTICFREQ - zprava pro nastaveni frekvence ticku
//10 - tick kazdou 10. hodnotu
//0 - nepouziva se, musi byt 0
cimz budes mit porad moznost delat i jemne zmeny. Nebo nastav Trackbaru maly rozsah a vysledne hodnoty podle potreby vynasob...
(koukam, ze bych tenhle thread mohl pomalu vydat jako knizku

)
Napsal: pon 3. zář 2007, 17:43
od Coburn
hh, to je fakt
btw je normální, že Dialogy pracující přes LRESULTS CALLBACK nezaregistrovávaj globálně definovaný proměnný a fstreamy?

Napsal: pon 3. zář 2007, 22:01
od €agle
Heh, neni

Napsal: úte 4. zář 2007, 15:14
od Coburn
sry, špatně jsem se vyjádřil
program se zkompiluje bez problémů, ale když v tý funkci zpracovávající zprávy dialogu mám fin >> Text;, nic se nenačte
když napíšu ifstream fin(xxx) nad switch, tak se načítá pořád stejné slovo.
Díky

Napsal: úte 4. zář 2007, 15:41
od €agle
Globalne (na zacatek kodu) si definuj fstream fin; (nebo istream), v main funkci (nebo proste tam kde chces soubor otevrit) dej fin.open("soubor.txt") a pak z nej muzes vsude dal vesele cist. Na konci programu potom zavolej fin.close() pro zavreni souboru...
Napsal: úte 4. zář 2007, 22:53
od Coburn
Díkec, už to maká
ještě dotaz, jak se disabluje MAXIMILIZACE okna (aby to nereagovalo ani na dvojklik na lištu okna), jak se nastavuje sysmenu, aby tam byl jenom CLOSE
THX

Napsal: stř 5. zář 2007, 00:14
od €agle
V resource editoru mas polozku MinButton a MaxButton, kdyz je nastavis obe na false, zustane ti jenom Close. Kdyz je MaxButton na false, nejde okno maximalizovat zadnym zpusobem.