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 :-D

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.