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 »

Diky, ale ukazal bys mi ten msgbox na prikladu prosim? :-) Mnohem lip se v tom orientuju, zkousel jsem par moznosti, ale nak to nejelo.

Jinak tady mam celkem zavazny problem s jednim cyklem.
delam generator rejstriku:

xxxall je promenna oznacujici cisla stranek
xxxtext oznacuje cislo slova na strane xxxall
counter (char counter[200][1];)je pole o 200 retezcich s jednim znakem
Text je hledany vyraz
str[1000][50] je pole, ve kterem je ulozen kompletni text, ve kterem se vyhledava, porovnava se s polem Text

nevim, jak je to mozne, ale kdyz chci vypsat stranky(counter[xxxall]), na kterych se nachazi hledane slovo(Text), vystup vypise i predchozi stranku (napr kdyz se vyraz nachazi na strane 5, vypisou se strany 4, 5; kdyz se nachazi na stranach 3, 6, 7, vypise se 2, 3, 5, 6, 7)

Kód: Vybrat vše

xxxall=0; xxxtext=0;

while(xxxall < 200){
             
             if(counter[xxxall][0]!='1'){
                           while(xxxtext < 600){
                                          if(!strcmp(Text, str[xxxall][xxxtext]))
                                            {counter[xxxall][0]='1';}
             xxxtext++;
}}

                                    //cout << counter[xxxall][0] << " ";
xxxtext=0;
xxxall++;
}
Díky za jakoukoliv radu, kdyby zde bylo neco nejasneho, prosim napiste
Coburn[/list]

EDIT: problem vyresen
Naposledy upravil(a) Coburn dne pon 25. čer 2007, 23:53, celkem upraveno 1 x.
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
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 »

Jak zjistim u editboxu jeho obsah, abych ho mohl nacist do promenne? Muzu vyvolat nejakou funkci zadanim nejakeho znaku do editboxu?

Da se nejak vytvorit jednim prikazem vice promennych typu int za sebou?

Diky za rady
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 »

Priklad FileOpen:

Kód: Vybrat vše

 OPENFILENAME ofn;  //struktura na otevreni souboru
 char tmpName[250];   //retezec pro ulozeni cesty k souboru
 char tmpTitle[100];   //retezec pro ulozeni nazvu souboru
 ZeroMemory(&ofn, sizeof(ofn));   //nastaveni vsech hodnot na 0
 ofn.lStructSize = sizeof(ofn);   //velikost struktury
 ofn.hwndOwner = hwnd;   //handle okna, ktere dialog vyvolava
 ofn.lpstrFile = tmpName;   //retezec, kam se ulozi cesta
 ofn.lpstrFile[0] = '\0';   //defaultni nazev souboru
 ofn.nMaxFile = sizeof(tmpName);   //maximalni delka retezce cesty
 ofn.lpstrFilter = "Text(.txt)\0*.TXT\0All(*.*)\0*.*\0";   //filtr pro typy souboru
 ofn.nFilterIndex = 0;   //ktery typ je vybran defaultne
 ofn.lpstrFileTitle = tmpTitle;   //retezec, kam se ulozi nazev
 ofn.nMaxFileTitle = sizeof(tmpTitle);   //maximalni delka retezce nazvu
 ofn.lpstrInitialDir = NULL;   //defaultni adresar
 ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;   //parametry
// (priklad je z dialogu na otevreni, takze cesta i soubor jiz musi existovat)
 if(GetOpenFileName(&ofn)) // otevri dialog a pokud se podari (uzivatel vybere soubor a da OK)
 {
//  tmpName obsahuje cestu k souboru
//  tmpTitle obsahuje nazev souboru
 }
Priklad ziskani hodnoty MessageBoxu

Kód: Vybrat vše

if(MessageBox(hwnd, "Chcete opravdu zavrit okno?", "Zavrit?", MB_YESNO) == IDYES) ZavriOkno();
else NezavriOkno();
Coburn píše:Jak zjistim u editboxu jeho obsah, abych ho mohl nacist do promenne?
Priklad ziskani hodnoty EditBoxu

Kód: Vybrat vše

char Promenna[51];
GetDlgItemText(HwndDialog, ID_EDITBOX1, Promenna, 50);
// HwndDialog je handle dialogu, na kterem je EditBox
// ID_EDITBOX1 je ID EditBoxu (definovane pri vytvareni dialogu)
// Promenna je pointer na retezec znaku, kam se ma hodnota ulozit
// 50 je maximalni delka retezce, co smi funkce nacist
Coburn píše:Muzu vyvolat nejakou funkci zadanim nejakeho znaku do editboxu?
Pokud pouzivas pro ovladni dialogu zpravy, tak EditBox posila notifikaci EN_CHANGE prostrednictvim zpravy WM_COMMAND kdykokoli se se jeho obsah zmeni. Na prikladu

Kód: Vybrat vše

INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)   //funkce pro zpracovani zprav
{
 switch (message)
 {
   ...   //sem patri zpracovani ostatnich zprav

  case WM_COMMAND:   //zprava WM_COMMAND
   switch(LOWORD(wParam))   //zjisteni od ktereho prvku prichazi
   {
    ...   //sem patri zpracovani zprav od ostatnich prvku
   
    case ID_EDITBOX1:   //prichazi od EditBox1
     if(HIWORD(wParam) == EN_CHANGE)   //pokud doslo ke zmene
     {
      TextSeZmenil();   //zavolej funkci TextSeZmenil()
     }
     break;

    ...   //sem patri zpracovani zprav od ostatnich prvku
   }
   break;

   ...   //sem patri zpracovani dalsich zprav
 }
} //konec funkce
Coburn píše:Da se nejak vytvorit jednim prikazem vice promennych typu int za sebou?

Kód: Vybrat vše

int Pole[50];   //vytvori pole 50 integeru
Uz jsem to jednou rikal, ale dovolim si to zopakovat. Nauc se nejdrive poradne zaklady a pak az se pust do slozitejsich veci. Doporucuju ti mit tu trpelivost a zacit s programovanim pekne od zacatku v dosovem okenku. Sice to nebude tak zajimavy a nebudes mit hned nejakou krasne vypadajici aplikaci, ale naucis se zaklady, ktere pak muzes (ci spis musis) pri tvoreni tech hezcich programu vyuzit. Kdyz ctu tenhle thread a vidim, ze nevis, jak se deklaruje pole, jak se delaji cykly, ci jak porovnavat text a rovnou se poustis do Windows aplikaci, dialogu a WinApi, ktere znalost tech zakladu vyzaduji, obavam se, ze nemas moc sanci na uspech.

(Neber to nejak osobne, spis jako doporuceni nekoho, kdo uz se tim programovanim nejaky ten rok zabyva :))
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 »

Souhlasim :-D
Jinak diky
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
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 »

Kdybys pak nekdy mel cas, tak mi pls nais, kde mam chybu

Kód: Vybrat vše

static HWND EDITBOX1 = 0;
.............
switch (message)
{
case WM_CREATE:
..............
EDITBOX1 = CreateWindow(TEXT("edit"), NULL,
WS_CHILD | WS_VISIBLE | WS_BORDER,
10, 10, 500, 20, hwnd, (HMENU) 1,
((LPCREATESTRUCT) lParam)->hInstance, NULL);
break;
..............
case WM_COMMAND:
switch(LOWORD(wParam))
   { 
    case ID_EDITBOX1:
     if(HIWORD(wParam) == EN_CHANGE)
     { 
      TextSeZmenil();
     } 
     break; 
}
break;
}
nechce mi to rozpoznat EDITBOX1... btw delam to podle prikladu v Dev-cpp, takze potrebne funkce, knihovny a casy nechybi.
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 »

Pokud vytvaris dialogy rucne a nepouzivas Resource soubory (.rc), tak musis pri vytvareni daneho ovladaciho prvku zadat jeho ID jako hMenu pri vytvareni okna. ID si definujes sam, jedinou podminkou je, ze musi byt pro kazdy prvek unikatni. Cislovani se vetsinou pocita od 1000 (tzn prvni prvek ma ID 1000, dalsi 1001 atd), ale neni to podminkou. Na tvem prikladu by to bylo

Kód: Vybrat vše

#define ID_EDITBOX1 1000
//nebo int ID_EDITBOX1 = 1000;
static HWND EDITBOX1 = 0; 
............. 
switch (message) 
{ 
case WM_CREATE: 
.............. 
EDITBOX1 = CreateWindow(TEXT("edit"), NULL, 
WS_CHILD | WS_VISIBLE | WS_BORDER, 
10, 10, 500, 20, hwnd, (HMENU) ID_EDITBOX1, 
((LPCREATESTRUCT) lParam)->hInstance, NULL); 
break; 
...
//zbytek zustava stejny
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 »

dikec, tohle jsem presne potreboval.

Posledni otazka na delsi dobu: jak muzu vyvolat funkci ve switchi (treba WM_PAINT)?

tohle mi nefunguje:

Kód: Vybrat vše

message = WM_PAINT;
Diky
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 »

Kód: Vybrat vše

message = WM_PAINT;
by fungovalo jenom kdybys to napsal jeste pred switch a v tom pripade by zase switch nemel smysl, jelikoz hodnota by byla stale stejna. Pokud potrebujes "zavolat" vykonani WM_PAINT, musis to poslat oknu jako dalsi zpravu. Nektere zpravy maji rovnou vlastni funkce, konkretne v pripade WM_PAINT muzes pouzit funkci

Kód: Vybrat vše

UpdateWindow(hwnd);

//hwnd je handle k oknu, kam chces WM_PAINT poslat (vetsinou hlavni okno)
Obecne se da poslat jakakoli zprava pomoci funkce

Kód: Vybrat vše

SendMessage(hwnd, Message, wParam, lParam);

//hwnd je handle k oknu, kteremu chces poslat zpravu
//Message je zprava, kterou chces poslat (treba WM_PAINT, WM_CLOSE atd)
//wParam je prvni parametr (v pripade WM_PAINT nema vyznam)
//lParam je druhy parametr (v pripade WM_PAINT take nema vyznam)
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 »

Nejde to ani takhle :-(

Kód: Vybrat vše

switch(LOWORD(wParam))
   {
    case ID_EDITBOX1:
     if(HIWORD(wParam) == EN_CHANGE)
     {
      GetDlgItemText(hwnd, ID_EDITBOX1, xxx[0], 50);
      SendMessage(hwnd, WM_SIZE, wParam, lParam);
      UpdateWindow(hwnd);
      EnableWindow(hwndButton1, TRUE);
     }
     break;
}
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
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 »

mam tam nejakej Drawtext, ale u nej nefunguje automaticka aktualizace
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 »

Jako jak nefunguje? Nebo spis co chces, aby to delalo?
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 »

mam např promennou

Kód: Vybrat vše

char x[20] = "Text";
po zadani prikazu by se vykonala funkce

Kód: Vybrat vše

strcpy(x, "obsah02");
"Text" by se mel automaticky zmenit na "obsah02", ale zmeni se az potom, co okno zatahnutim za okraj resizenu. Pochopil jsem, ze tohle by mel vyresit prikaz UpdateWindow, ale program se chova, jako by tam prikaz nebyl.

Da se udelat neco jako

Kód: Vybrat vše

hwnd = SIZEFULLSCREEN;
hwnd = SIZENORMAL;
abych primel okno k prekresleni?
Diky
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 »

To se divim, ze to vubec funguje pri tom resizu. Pokud chces zmenit text nejake casti dialogu, pouziva se na to funkce SetDlgItemText (pripadne SetDlgItemInt, pokud chces nastavit cislo). Na prikladu

Kód: Vybrat vše

SetDlgItemText(hwnd, ID_STATIC1, "Test");
//hwnd je handle okna dialogu
//ID_STATIC1 je ID ovladaciho prvku
//"Test" je text, ktery se ma zobrazit, lze samozrejme pouzit i normalni pointer a ne primo text
Pokud chces nastavit text hlavnimu oknu, nebo znas konkretni handle okna, kteremu chces nastavit text, pouziva se funkce SetWindowText:

Kód: Vybrat vše

SetWindowText(hwnd, "Text");
//hwnd je handle okna
//"Text" je text, ktery se ma nstavit
Zmeny se samozrejme projevi okamzite a ne az po manipulaci s oknem. Jinak k nastavovani velikosti okna slouzi funkce ShowWindow, jejiz jednotlive parametry najdes tady.
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
no, přes ShowWindow to v tomto případě není moc dobré řešení, při psaní okno blika. To jsem nepředpokládal :-).
Existuje nějaké jiné řešení vytvoření textového pole než Drawtext?

Kód: Vybrat vše

//osekanej WM_PAINT

case WM_PAINT:

hdc = BeginPaint (hwnd, &ps);
GetClientRect (hwnd, &rc);

rc.bottom = rc.bottom*2-9;

DrawText (hdc, "Coburn", -1, &rc,
DT_SINGLELINE | DT_CENTER | DT_VCENTER);

EndPaint (hwnd, &ps);

return 0;
break;
UpdateWindow(hwnd); zde nefunguje

co znamená to "-1" (3. parametr) v Drawtextu? Dá se nahradit proměnnou #define ID_xxx?
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 mas nejaky konkretni duvod, proc kreslis EditBox (jestli se tedy snazis o pouziti EditBoxu) vlastnim kodem a nenechas to na Windowsech?
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 »

Editbox pracuje normalne. Textovym polem nemyslim editbox, jenom obycejny text.

Da se udělat nějakým způsobem tabulka nebo mřížka? Něco na způsob excelove tabulky nebo tabulky v clientu azureus.

změní se jenom několik názvů, nebo je to složitější?
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 »

Obycejny text se vetsinou dela pomoci Static prvku, nez aby se kreslil rucne. Kazdopadne jestli si chces usnadnit praci s tvorbou dialogu, doporucil bych ti nejaky resource editor, treba ResEd. Na vytvoreni tabulky se pouziva prvek ListView, viz. tady na MSDN. Vytvoreni a pouzivani ale zas az tak jednoduche neni, rozhodne slozitejsi, nez treba EditBox.
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 »

nn, mam na mysli jinou tabulku :-D
neco jako <table> v html

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
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 »

pak mi jeste prosim rekni, jak ten *.rc soubor převedu, nebo spíš zakomponuju do winapi.
dikec
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 »

No nevim, jakou jinou tabulku mas na mysli, ListView v rezimu Details view ti vytvori tabulku stejnou jako je v Excelu, s urcitym poctem sloupcu a radku kde muzes bud vybirat jednotliva pole, nebo cele radky, pripadne i radit, nebo menit vodici linky...

.rc soubor normalne pridas do projektu a on se zkompiluje s nim. Pokud mas v .rc vytvoreny treba dialog, musis pak zavolat patricne funkce, v pripade dialogu CreateDialog

Kód: Vybrat vše

hwnd = CreateDialog(hThisInstance, MAKEINTRESOURCE(1000), HWND_DESKTOP, DialogProc);
//hwnd se po uspesnem vykonani nastavi na handle dialogu
//hThisInstance je instance aplikace (ziskas ji v Main funkci)
//MAKEINTRESOURCE(1000) predela ID dialogu, ktery se ma pouzit (1000) do pozadovane formy. ID dialogu se da nastavit resource editoru a defaultne je prave 1000
//HWND_DESKTOP je handle parent okna, kteremu se ma dialog vytvorit. Pomoci teto hodnoty muzes napriklad seskupit vice dialogu do kaskady, kdy zavreni jednoho znamena zavreni vsech.
//DialogProc je funkce, ktera bude zpracovavat zpravy dialogu, jeji definice je

INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam);
S takto vytvorenym dialogem pracujes normalne pomoci zpracovani jeho zprav a pouzivani dialogovych funkci...
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“