C++ a odkazovani, jak je to vlastně?

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
Odpovědět
Coburn
Začátečník
Začátečník
Registrován: 12. čer 2006
Bydliště: Kobenhavn, Denmark
Kontaktovat uživatele:

Příspěvek 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
Díky moc za vše
CPU: Intel Core2 Duo E6300 2,33Ghz, GPU: Leadtek Winfast PX7600GS, MB: MSI P965 NEO-F, PSU-ASUS XXX 450W, HDD: Seagate Barracuda 7200.10, 320GB
€agle
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 13. lis 2003
Bydliště: Vlastní 3D svět :)
Kontaktovat uživatele:

Příspěvek 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

Kód: Vybrat vše

 *(strrchr(Path, '\\') + 1) = 0;
cimz dostanes cestu k programu. Pak uz staci ji spojit s nazvem souboru

Kód: Vybrat vše

strcat(Path, "Data\\kniha01.txt");
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...
Eagle3D Engine under developement

Hledáme do firmy schopného ASP/VB.NET/C# programátora, více po SZ
Coburn
Začátečník
Začátečník
Registrován: 12. čer 2006
Bydliště: Kobenhavn, Denmark
Kontaktovat uživatele:

Příspěvek 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
CPU: Intel Core2 Duo E6300 2,33Ghz, GPU: Leadtek Winfast PX7600GS, MB: MSI P965 NEO-F, PSU-ASUS XXX 450W, HDD: Seagate Barracuda 7200.10, 320GB
€agle
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 13. lis 2003
Bydliště: Vlastní 3D svět :)
Kontaktovat uživatele:

Příspěvek 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...
Eagle3D Engine under developement

Hledáme do firmy schopného ASP/VB.NET/C# programátora, více po SZ
Coburn
Začátečník
Začátečník
Registrován: 12. čer 2006
Bydliště: Kobenhavn, Denmark
Kontaktovat uživatele:

Příspěvek 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.
CPU: Intel Core2 Duo E6300 2,33Ghz, GPU: Leadtek Winfast PX7600GS, MB: MSI P965 NEO-F, PSU-ASUS XXX 450W, HDD: Seagate Barracuda 7200.10, 320GB
€agle
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 13. lis 2003
Bydliště: Vlastní 3D svět :)
Kontaktovat uživatele:

Příspěvek 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...
Eagle3D Engine under developement

Hledáme do firmy schopného ASP/VB.NET/C# programátora, více po SZ
Coburn
Začátečník
Začátečník
Registrován: 12. čer 2006
Bydliště: Kobenhavn, Denmark
Kontaktovat uživatele:

Příspěvek od Coburn »

řve to, že hThisInstance neni deklarovana...
CPU: Intel Core2 Duo E6300 2,33Ghz, GPU: Leadtek Winfast PX7600GS, MB: MSI P965 NEO-F, PSU-ASUS XXX 450W, HDD: Seagate Barracuda 7200.10, 320GB
€agle
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 13. lis 2003
Bydliště: Vlastní 3D svět :)
Kontaktovat uživatele:

Příspěvek od €agle »

A jak mas deklarovany entry point (zakladni funkci) programu?
Eagle3D Engine under developement

Hledáme do firmy schopného ASP/VB.NET/C# programátora, více po SZ
Coburn
Začátečník
Začátečník
Registrován: 12. čer 2006
Bydliště: Kobenhavn, Denmark
Kontaktovat uživatele:

Příspěvek od Coburn »

Kód: Vybrat vše

int STDCALL
WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow)
{
Doufám že je to ono
CPU: Intel Core2 Duo E6300 2,33Ghz, GPU: Leadtek Winfast PX7600GS, MB: MSI P965 NEO-F, PSU-ASUS XXX 450W, HDD: Seagate Barracuda 7200.10, 320GB
€agle
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 13. lis 2003
Bydliště: Vlastní 3D svět :)
Kontaktovat uživatele:

Příspěvek 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
}
Eagle3D Engine under developement

Hledáme do firmy schopného ASP/VB.NET/C# programátora, více po SZ
Coburn
Začátečník
Začátečník
Registrován: 12. čer 2006
Bydliště: Kobenhavn, Denmark
Kontaktovat uživatele:

Příspěvek 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 :-P

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
CPU: Intel Core2 Duo E6300 2,33Ghz, GPU: Leadtek Winfast PX7600GS, MB: MSI P965 NEO-F, PSU-ASUS XXX 450W, HDD: Seagate Barracuda 7200.10, 320GB
€agle
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 13. lis 2003
Bydliště: Vlastní 3D svět :)
Kontaktovat uživatele:

Příspěvek 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...
Eagle3D Engine under developement

Hledáme do firmy schopného ASP/VB.NET/C# programátora, více po SZ
Coburn
Začátečník
Začátečník
Registrován: 12. čer 2006
Bydliště: Kobenhavn, Denmark
Kontaktovat uživatele:

Příspěvek od Coburn »

Dík,
když ten zdroják od tebe zkompiluju a spustim, objeví se jenom černý konzolový okno a nic se neděje...
CPU: Intel Core2 Duo E6300 2,33Ghz, GPU: Leadtek Winfast PX7600GS, MB: MSI P965 NEO-F, PSU-ASUS XXX 450W, HDD: Seagate Barracuda 7200.10, 320GB
€agle
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 13. lis 2003
Bydliště: Vlastní 3D svět :)
Kontaktovat uživatele:

Příspěvek 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
Eagle3D Engine under developement

Hledáme do firmy schopného ASP/VB.NET/C# programátora, více po SZ
Coburn
Začátečník
Začátečník
Registrován: 12. čer 2006
Bydliště: Kobenhavn, Denmark
Kontaktovat uživatele:

Příspěvek 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
CPU: Intel Core2 Duo E6300 2,33Ghz, GPU: Leadtek Winfast PX7600GS, MB: MSI P965 NEO-F, PSU-ASUS XXX 450W, HDD: Seagate Barracuda 7200.10, 320GB
€agle
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 13. lis 2003
Bydliště: Vlastní 3D svět :)
Kontaktovat uživatele:

Příspěvek 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...
Eagle3D Engine under developement

Hledáme do firmy schopného ASP/VB.NET/C# programátora, více po SZ
Coburn
Začátečník
Začátečník
Registrován: 12. čer 2006
Bydliště: Kobenhavn, Denmark
Kontaktovat uživatele:

Příspěvek od Coburn »

thx
a dá se určit velikost okna *.rc souboru přes GetClientRect?
zkoušel jsem napsat

Kód: Vybrat vše

RECT rc;
GetClientRect(hwnd, &rc);
na uplnej začátek *.rc souboru, ale házelo to chybu.
CPU: Intel Core2 Duo E6300 2,33Ghz, GPU: Leadtek Winfast PX7600GS, MB: MSI P965 NEO-F, PSU-ASUS XXX 450W, HDD: Seagate Barracuda 7200.10, 320GB
€agle
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 13. lis 2003
Bydliště: Vlastní 3D svět :)
Kontaktovat uživatele:

Příspěvek 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).
Eagle3D Engine under developement

Hledáme do firmy schopného ASP/VB.NET/C# programátora, více po SZ
Coburn
Začátečník
Začátečník
Registrován: 12. čer 2006
Bydliště: Kobenhavn, Denmark
Kontaktovat uživatele:

Příspěvek 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.
CPU: Intel Core2 Duo E6300 2,33Ghz, GPU: Leadtek Winfast PX7600GS, MB: MSI P965 NEO-F, PSU-ASUS XXX 450W, HDD: Seagate Barracuda 7200.10, 320GB
€agle
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 13. lis 2003
Bydliště: Vlastní 3D svět :)
Kontaktovat uživatele:

Příspěvek 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.)
Eagle3D Engine under developement

Hledáme do firmy schopného ASP/VB.NET/C# programátora, více po SZ
Odpovědět

Zpět na „Programování a web“