Stránka 4 z 7
Napsal: pát 17. srp 2007, 00:51
od Coburn
Thx
mam par novych problemku
1)
program mi kvuli nasledujicimu kodu pada. Vidis nekde chybu?
Kód: Vybrat vše
ifstream fintest("Data\\kniha01.txt");
char str[2000][600];
int i=0, e=0;
for(i=0; !!strcmp(str[i][e], "coburnend"); i++){
for(e=0; !!strcmp(str[i][e], "coburnendline"); e++){
fintest >> str[i][e];
}
}
2)
kdyz napíšu ifstream finxx (tmpName); z OPENFILENAMu, program sosá z např C:\slozka\soubor.txt. Když ale chci po tom něco zapsat do jiného souboru a napířu ofstream fout("Data\\xxx.txt");, program nezapisuje do kořenového adresáře programu, ale do C:\slozka\Data\xxx.txt.
Jak tam mám nastavit zpátky kořenový adresář jako defaultní?
3)
DT_NOCLIP nepomáhá

. Kdyby te ale nekdy pak jeste napadlo, co by mohlo zpusobovat prekresleni jen a pouze pri resizu, bylo by to super. Pro me je to zahada

Díky moc za vše
Napsal: sob 18. srp 2007, 00:11
od €agle
1) Ta funkce vypada cela nejak divne. Pada to nejspise proto, ze index arraye presahne definovane meze a nastane pokus o zapis do chranene casti pameti. !!strcmp je blbost, dva vykricniky maji stejny vyznam jako kdyz tam neni zadny... strcmp vraci nenulovou hodnotu, kdyz se retezce neshoduji, tzn kdyz jsou stejne, strcmp vrati 0 a tedy !strcmp = true. Navic nejprve porovnavas retezec a az potom ho nacitas, coz je samo o sobe zajimavy postup...
2) Pro ofstream pouzij absolutni cestu k souboru. Cestu k programu ziskas nasledujici funkci
Kód: Vybrat vše
TCHAR ProgramPath[256]
GetModuleFileName(NULL, ProgramPath, sizeof(ProgramPath));
Jelikoz nazev souboru dostanes jako TCHAR (tzn unicode), musis ho nejprve predelat na standardni char
Kód: Vybrat vše
//na zacatek programu
#include <tchar.h>
...
char Path[256] = {0};
for(int i = 0; i < _tcslen(ProgramPath); i++) Path[i] = (CHAR) ProgramPath[i];
Tim dostanes cestu k programu, ale obsahuje i nazev souboru programu, proto pouzij
cimz dostanes cestu k programu. Pak uz staci ji spojit s nazvem souboru
a Path obsahuje absolutni cestu k souboru...
3) A volas nekde z programu nejakou funkci na prekresleni okna? Kdyz mas tu funkci ve WM_PAINT, bude reagovat jedine kdyz zprava WM_PAINT prijde, tedy napriklad kdyz zmenis velikost okna...
Napsal: sob 18. srp 2007, 02:28
od Coburn
Dík, s tim prvnim jsi měl pravdu, druhy vyzkoušim, ale když si vytvořim novou funkci nad main funkci a pak ji z WM_PAINTu zavolám, nic se nevykreslí. Když zavolám ten listview, háže to chyby ohledně HINSTANCE hInst. Jako poslední bych se chtěl ještě zeptat, jak "vyvolám" dialog z *.rc souboru.
Díky
Napsal: sob 18. srp 2007, 22:39
od €agle
Nejde o volani funkce z WM_PAINT, ale o to poslat programu zpravu, aby WM_PAINT vykonal.
Abys mohl vyvolat dialog z .rc souboru, nejprve pridej ten .rc soubor do sveho projektu a pote:
Kód: Vybrat vše
HWND hwndDialog; //je dobre definovat globalne
int * CALLBACK DialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam); //deklarace funkce, ktera bude zpracovavat zpravy dialogu
...
//funkce pro vytvoreni dialogu, umistit na misto v programu, kdy chces dialog vytvorit (treba hned na zacatku v Main)
hwndDialog = CreateDialog(hThisInstance, MAKEINTRESOURCE(1000), HWND_DESKTOP, DialogProc);
//hThisInstance je instance programu, ziskas s Main funkce
//MAKEINTRESOURCE(1000) urcuje ID dialogu, ktery se ma vytvorit, v .rc souboru (v tomto pripade 1000)
//HWND_DESKTOP je handle parent okna dialogu (v tomto pripade je parentem plocha)
//DialogProc je funkce, ktera bude zpracovavat zpravy dialogu
...
//funkce na zpracovani zprav dialogu
int * CALLBACK DialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CLOSE:
PostQuitMessage(0);
break;
...
default:
return 0;
}
return 0;
}
Potom uz staci jenom standardne kontrolovat nove zpravy pomoci GetMessage/PeekMessage funkci...
Napsal: pon 20. srp 2007, 23:48
od Coburn
díky, ale chce to po mě deklaraci HINSTANCE, když před to napíšu HINSTANCE hInst, vyhodí to následující chyby:
na řádku s
hwndDialog = CreateDialog(hInst, MAKEINTRESOURCE(1000), HWND_DESKTOP, DialogProc);
Test.c In function `LRESULT MainWndProc(HWND__*, UINT, WPARAM, LPARAM)':
Test.c invalid conversion from `int*(*)(HWND__*, UINT, WPARAM, LPARAM)' to `BOOL (*)(HWND__*, UINT, WPARAM, LPARAM)'
Test.c initializing argument 4 of `HWND__* CreateDialogParamA(HINSTANCE__*, const CHAR*, HWND__*, BOOL (*)(HWND__*, UINT, WPARAM, LPARAM), LPARAM)'
Makefile.win [Build Error] [Test.o] Error 1
když to napíšu do main funkce, vyhazuje to stejné chyby.
Napsal: úte 21. srp 2007, 02:18
od €agle
hInst si definuj globalne jako HINSTANCE hInst; a potom mu v entry pointu (WinMain funkce) prirad hodnotu hThisInstance (hInst = hThisInstance). Potom budes mit instanci dostupnou v kazde casti souboru.
Co se te chyby tyce, tak odstran pointer (*) u DialogProc funkce, nebo lepe nahrad int * za INT_PTR tamtez. Jsem delal nejake pokusy a zapomnel jsem to tam...
Napsal: úte 21. srp 2007, 14:11
od Coburn
řve to, že hThisInstance neni deklarovana...
Napsal: úte 21. srp 2007, 15:55
od €agle
A jak mas deklarovany entry point (zakladni funkci) programu?
Napsal: stř 22. srp 2007, 00:36
od Coburn
Kód: Vybrat vše
int STDCALL
WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow)
{
Doufám že je to ono
Napsal: stř 22. srp 2007, 01:15
od €agle
Ano, to je ono... Tady mas definovano to HINSTANCE hInst, ktere po tobe chteji vsechny ty ostatni funkce. Mas dve moznosti: bud vsechny funkce, ktere vyzaduji hInst budes volat primo z teto hlavni funkce (horsi moznost), nebo si instanci deklarujes globalne treba jako hCurInst (globalni definice snad zvladas) a ve WinMain funkci ji priradis hodnotu (hCurInst = hInst). Potom muzes kdekoli v programu (v ramci daneho souboru), kdykoli po tobe bude nejaka funkce pozadovat instanci programu, pouzit hCurInst. Pro jistotu na prikladu:
Kód: Vybrat vše
//zacatek programu
#include <windows.h>
... //dalsi include
HINSTANCE hCurInst; //globalni definice instance programu
... //ostatni deklarace
int STDCALL WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow)
{
hCurInst = hInst; //prevedeme lokalni hInst na globalni hCurInst
... //zbytek funkce
}
void JinaFunkce()
{
HWND hwndDialog = CreateDialog(hCurInst, MAKEINTRESOURCE(1000), HWND_DESKTOP, DialogProc);
//instance je globalne definovana v hCurInst, muzeme ji pouzit treba pro vytvoreni dialogu
}
Napsal: stř 22. srp 2007, 02:51
od Coburn
Super, už to jede!

můžu ještě poprosit o příklad přidání sloupců a řádků do listviewu? btw na MSDN to je, ale neumim to zakomponovat
Kód: Vybrat vše
HWND CreateListView ()
{
RECT rcl;
InitCommonControls();
GetClientRect (hwnd, &rcl);
HWND hWndListView = CreateWindow(WC_LISTVIEW,
"",
WS_CHILD | LVS_REPORT | LVS_EDITLABELS,
100,
100,
rcl.right - rcl.left,
rcl.bottom - rcl.top,
hwnd,
(HMENU)ID_LISTVIEW,
hThisInstance,
NULL);
return (hWndListView);
}
thx
Napsal: stř 22. srp 2007, 19:46
od €agle
Ono s ListViewem je to slozitejsi a bylo by to na dlouho.
Tady jsem ti uploadnul zdrojak programu na zkousku ListViewu, tak se inspiruj...
Napsal: stř 22. srp 2007, 21:41
od Coburn
Dík,
když ten zdroják od tebe zkompiluju a spustim, objeví se jenom černý konzolový okno a nic se neděje...
Napsal: stř 22. srp 2007, 21:56
od €agle
Na zkompilovani musis k projektu pridat jeste .rc soubor s nasledujicim obsahem...
Kód: Vybrat vše
#define D_DIALOG 1000
#define R_LIST 1001
#define IDC_STC1 1002
#define IDC_BTN1 1003
#define IDC_BTN2 1004
#define IDC_EDT1 1005
#define IDC_BTN3 1006
#define IDC_BTN4 1007
D_DIALOG DIALOGEX 6,5,342,252
CAPTION "ListViewTest"
FONT 8,"MS Sans Serif",0,0
STYLE 0x10CE0000
BEGIN
CONTROL "",R_LIST,"Static",NOT 0x10000000|0x40000007,8,7,322,163
CONTROL "IDC_STC",IDC_STC1,"Static",0x50000000,10,179,104,9
CONTROL "Remove",IDC_BTN1,"Button",0x58010000,132,175,78,24
CONTROL "Remove all",IDC_BTN2,"Button",0x50010000,216,175,70,24
CONTROL "0",IDC_EDT1,"Edit",0x50012801,184,208,18,13,0x00000200
CONTROL ">",IDC_BTN3,"Button",0x58010000,204,208,10,13
CONTROL "<",IDC_BTN4,"Button",0x58010000,172,208,10,13
END
Napsal: čtv 23. srp 2007, 00:04
od Coburn
Ok,
Dá se vytvořit ListView i bez recource souboru? V příkladu se Listview dostává do programu přes *.rc soubor. Chtěl bych ho "zakomponovat" do source souboru.
Jestli jsem to správně pochopil, tak je to ten listview z MSDN, ale ten mi nefunguje (nehází chyby, ale nic se nezobrazuje), vidíš někde chybu?
Kód: Vybrat vše
HWND CreateListView ()
{
RECT rcl;
InitCommonControls();
GetClientRect (hwnd, &rcl);
HWND hWndListView = CreateWindow(WC_LISTVIEW,
"",
WS_CHILD | LVS_REPORT | LVS_EDITLABELS,
100,
100,
rcl.right - rcl.left,
rcl.bottom - rcl.top,
hwnd,
(HMENU)ID_LISTVIEW,
hThisInstance,
NULL);
return (hWndListView);
}
Díky
Napsal: čtv 23. srp 2007, 01:41
od €agle
V tom mem kodu se ListView tvori v podstate bez resource souboru. V tom .rc souboru je pro nej R_LIST, coz je jenom prazdny obdelnik, ktery oznacuje, kde list v dialogu bude + jsou tam nehazena nejaka tlacitka a texty se samotnou tvorbou listu nesouvisejici. Je to tak udelane, abych mohl dialog snadno editovat v resource editoru. Samotne vytvoreni listu ma ale na starosti funkce CreateListView. V tom mem prikladu ma jako parametr handle okna, do ktereho se ma vytvorit, takze staci zadat jako okno onen obdelnik a razem je z nej ListView. Nic ti ale nebrani tu funkci predelat, aby misto handlu okna brala za parametr treba RECT, takze by si specifikoval primo souradnice, kam se ma ten list vytvorit...
Napsal: pát 24. srp 2007, 19:44
od Coburn
thx
a dá se určit velikost okna *.rc souboru přes GetClientRect?
zkoušel jsem napsat
na uplnej začátek *.rc souboru, ale házelo to chybu.
Napsal: pát 24. srp 2007, 20:11
od €agle
.rc soubor obsahuje pouze definice oken, nemuzes do nej psat funkce... Velikost okna muzes zjistit v programu az kdyz je vytvorene a znas jeho handle (HWND). U dialogu ho dostanes pri vytvareni (HWND hwnd = CreateDialog(...)). Kdyz chces ziskat handle nejakeho prvku dialogu, tak pomoci funkce GetDlgItem():
Kód: Vybrat vše
HWND ButtonWnd = GetDlgItem(hwnd, 1005);
//ButtonWnd je vysledny handle k danemu prvku dialogu
//hwnd je handle dialogu, ktery prvek obsahuje
//1005 je ID prvku, ktery chces ziskat
Takto ziskany handle muzes potom pouzit ve vsech funkcich pracujicich s okny, at uz ziskani velikosti (GetWindowRect, GetClientRect) nebo treba nastaveni viditelnosti (ShowWindow).
Napsal: pát 24. srp 2007, 21:41
od Coburn
Thx,
měl jsem ale na mysli to, že třeba když mám "hlavní" okno v resource souboru s danou velikostí, jestli je nějaká možnost upravovat pozice child oken (třeba tlačítek) za běhu programu (WM_SIZE atd.), když je to všecko v *.rc souboru.
Napsal: sob 25. srp 2007, 02:31
od €agle
Jasne, ze jo. Jak rikam, v resource souboru jsou jenom definice oken, manipulovat s nimi muzes jako s kterymkoli jinym oknem. Vyse zminenym zpusobem ziskas handle okna a pak ho muzes pomoci funkce SetWindowPos libovolne presouvat a upravovat. To same plati i pro ostatni funkce (zobrazovani/skryvani okna, zapinani/vypinani apod.)