Stránka: 1 z 1
| [ Príspevkov: 25 ] | |
Autor | Správa |
---|
Registrovaný: 02.12.09 Prihlásený: 03.04.11 Príspevky: 68 Témy: 18 | 18 Bydlisko: Dubnica nad... |
Ahojte
Prosim vas ako mam urobyt v C++ okno ktore nebude mat ten windows ramik.Napr... mam pozadie 400x300px dajme tomu bg.png ako nastavim toto pozadie ale tak aby tam nebolo to spominane windows okno len cisto to bg.png ...
Dakujem za pomoc
|
|
Registrovaný: 11.01.09 Prihlásený: 27.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Bodlo by dať aspoň kúsok kódu, ako vytváraš okno a hlavne napísať, v akom operačnom systéme a s čím pracuješ (WINAPI, MFC, QT, ...).
|
|
Registrovaný: 02.12.09 Prihlásený: 03.04.11 Príspevky: 68 Témy: 18 | 18 Bydlisko: Dubnica nad... |
ono este nic nevitvaram este lebo neviem urobit toto okno a malo by to vyzerat takto nejako akurat ze na pozadi chcem mat iny obrazok
http://hang-over.ucoz.ru/launcher.jpg
a tvorim do vo windows,snazim sa robyt vo Visual Studiu 2008
|
|
Registrovaný: 11.01.09 Prihlásený: 27.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Vo Visual Studiu je ešte stále široký pojem. Keď vytváraš projekt, dávaš voľbu Win32 projekt alebo MFC projekt alebo ako inak?
|
|
Registrovaný: 02.12.09 Prihlásený: 03.04.11 Príspevky: 68 Témy: 18 | 18 Bydlisko: Dubnica nad... |
jaj tak Win32 Projekt
|
|
Registrovaný: 11.01.09 Prihlásený: 27.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Takže WinAPI. Vo funkcii CreateWindowEx zmeň parameter WS_OVERLAPPEDWINDOW za WS_POPUPWINDOW.
|
|
Registrovaný: 02.12.09 Prihlásený: 03.04.11 Príspevky: 68 Témy: 18 | 18 Bydlisko: Dubnica nad... |
dakujem ked som to zmenil ... teraz mam otazku ako nastavim napr ... bg.png aby to boolo pozadie toho programu ? do takychto zlozitych veci som este nerobyl ... zacinal som na konzolovych aplikaciach ... a teraz sa chcem nieco nove naucit
|
|
Registrovaný: 11.01.09 Prihlásený: 27.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Ak si ešte nerobil nič s GUI, tak neskáč hneď na obrázky. V tejto téme sa riešila grafika v C++. Je tam riešené viacero spôsobov, ale keď si sa zameral na WinAPI, tak začni čítať tento tutoriál. Naučíš sa pekne poporiadku pracovať s oknami a pochopíš ako vlastne celý systém windows komunikuje medzi oknami (niekde v strede je aj práca s bitmapami).
|
|
Registrovaný: 02.12.09 Prihlásený: 03.04.11 Príspevky: 68 Témy: 18 | 18 Bydlisko: Dubnica nad... |
dik moc
|
|
Registrovaný: 02.12.09 Prihlásený: 03.04.11 Príspevky: 68 Témy: 18 | 18 Bydlisko: Dubnica nad... |
este sa chcem opytat :
Musim tam niekde potom nastavit velkost toho okna ? ak ano kde prosim
Lebo zamenil som to WS_OVERLAPPEDWINDOW za WS_POPUPWINDOW a teraz program ide ale nezobrazi mi ho ako keby tam bolo nastavene 0x0
|
|
Registrovaný: 11.01.09 Prihlásený: 27.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
7. a 8. parameter vo funkcii CreatWindowEx je šírka a výška vytváraného okna. Ale to nemusí byť jediný problém, ak okno nevidíš. Uisti sa, že, že za touto funkciou nasleduje funkcia ShowWindow, ktorá okno zobrazí. (zvykne sa ešte za ShowWindow volať funkcia UpdateWindow, ktorá okno ešte prekreslí, ale tuším to pôjde aj bez nej).
// ak potrebuješ vedieť popis nejakej API funkcie, tak použi stránky MSDN. Obsahujú podrobný manuál danej funkcie. Napr pre CreateWindowEx:
Citácia: http://msdn.microsoft.com/en-us/library/ms632680(VS.85).aspx
|
|
Registrovaný: 02.12.09 Prihlásený: 03.04.11 Príspevky: 68 Témy: 18 | 18 Bydlisko: Dubnica nad... |
citam ten WinAPI navod co si mi dal ... a chcem sa opytat :
Obrazok na pozadi programu musi byt len vo formate .bmp ? nemoze byt v tvare napr... .png ?
|
|
Registrovaný: 11.01.09 Prihlásený: 27.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Bitmapa je najzákladnejší formát obrazu - žiadna komprimácia, proste záznam štruktúr obsahujúcich farebné zložky jednotlivých pixelov. Bitmapa sa v podstate dá rovno vykresľovať, komprimované formáty sa musia najprv dekomprimovať, prepočítavať atď. Takže preto ich nemôžeš dávať do jedného vreca.
Nepoviem ti, ako vykresliť konkrétne PNG formát, lebo s grafikou som sa nezaoberal vo WinAPI, ale počkaj na radu iných užívateľov.
// nič ti ale nebráni otvoriť PNG obrázok v kreslení a uložiť ho ako 24-bitovú bitmapu BMP...
|
|
Registrovaný: 02.12.09 Prihlásený: 03.04.11 Príspevky: 68 Témy: 18 | 18 Bydlisko: Dubnica nad... |
uz mi to vsetko ide Dakujem ale to okno co mi vytvori mi nejde presuvat z pozicie X,Y na inu poziciu ... je na mieste kde mu nastavim kde sa ma mat miesto pri otvoreni programu
|
|
Registrovaný: 02.12.09 Prihlásený: 03.04.11 Príspevky: 68 Témy: 18 | 18 Bydlisko: Dubnica nad... |
viem ze je toho vela ale chcem sa nieco priucit
mam takyto source :
Kód: #include <stdio.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h>
int testport(const char *ipaddr, int port){ int mysocket = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in dest;
memset(&dest, 0, sizeof(dest)); dest.sin_family = AF_INET; dest.sin_addr.s_addr = inet_addr(ipaddr); dest.sin_port = htons(port);
if(connect(mysocket, (struct sockaddr *)&dest, sizeof(struct sockaddr)) != EOF){ close(mysocket); return 1; }
return 0; }
int main(void) { printf("ConnectServer: %s\n", testport("78.98.184.189", 44405) ? "Online" : "Offline");
return 0; }
ako urobym aby mi tu ip 78.98.184.189 a port 44405 nacitalo z config.ini ?
vlastne tento program je launcher pre viac MMORPG hier ... ide o to ze kazdy MMORPG server ma inu IP... a preto tento script naznacuje len pripojenie na jeden server ktory sa nebude dat zmenit (ta IP)... preto chcem nacitanie z config.ini
|
|
Registrovaný: 11.01.09 Prihlásený: 27.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
achbo píše: to okno co mi vytvori mi nejde presuvat z pozicie X,Y na inu poziciu To bude tým, že si tam nechcel mať hlavný panel . Budeš musieť pridať do tvojho projektu nasledujúcu časť kódu ( posnažím sa písať pochopiteľne, keďže si začiatočník ): 1.) pridaj si do kódu nové globálne premenné ( nesmú sa nachádzať v žiadnom bloku, teda ani vo funkcii. Môžeš ich napríklad umiestniť na samý vrch pod #include ): Kód: int mouse_catch = 0; POINT Coord_00, Coord_01; 2.) Do slučky správ pridaj reakciu na správy WM_LBUTTONDOWN, WM_LBUTTONUP a WM_MOUSEMOVE ( slučka správ začína nejako takto switch (message) ). Konkrétne toto: Kód: case WM_LBUTTONDOWN: mouse_catch = 1; // v tejto premennej sa uchova informacia, ze je drzane lave tlacidlo mysi Coord_00.x = LOWORD( lParam ); // X-ova suradnica, kde sa kliklo na formular Coord_00.y = HIWORD( lParam ); // X-ova suradnica, kde sa kliklo na formular break; case WM_LBUTTONUP: mouse_catch = 0; // lave tlacidlo sa uvolnilo break; case WM_MOUSEMOVE: if ( !mouse_catch ) // ak nie je stlacene lave tlacidlo a kurzorom sa hybe po formulari, ukonci obsluhu break; GetCursorPos( &Coord_01 ); // ziskaj aktualne suradnice kurzora SetWindowPos( hwnd, NULL, (Coord_01.x - Coord_00.x), (Coord_01.y - Coord_00.y), 500, 300, 0 ); // a nastav novu poziciu okna ( 500 a 300 je sirka a vyska formulara) break; Komentáre si kľudne zmaž, sú tam len pre pochopenie kódu. achbo píše: ako urobim aby mi tu ip 78.98.184.189 a port 44405 nacitalo z config.ini ? Bolo by dobré vedieť, kde v tom súbore sa nachádzajú jednotlivé údaje. Alebo v tom súbore je iba IP a port? Takto: Kód: 78.98.184.189 44405
???
// to, že sa chceš niečo naučiť, neznamená, že chceš veľa Na to je tu fórum
|
|
Registrovaný: 02.12.09 Prihlásený: 03.04.11 Príspevky: 68 Témy: 18 | 18 Bydlisko: Dubnica nad... |
No ten config.ini vypada takto :
Kód: [CONFIG] IP = 127.0.0.1 Port = 44405 Server = TestMU pri Kód: SetWindowPos( hwnd, NULL, (Coord_01.x - Coord_00.x), (Coord_01.y - Coord_00.y), 500, 300, 0 ); mi build log vipisuje : Kód: c:\documents and settings\achbo\desktop\program\index.cpp(186) : error C2065: 'hwnd' : undeclared identifier ale inac vsetko mam tak ako si napisal Takto vypadaja slucka spravy Kód: switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_DESTROY: PostQuitMessage(0); break; case WM_LBUTTONDOWN: mouse_catch = 1; // v tejto premennej sa uchova informacia, ze je drzane lave tlacidlo mysi Coord_00.x = LOWORD( lParam ); // X-ova suradnica, kde sa kliklo na formular Coord_00.y = HIWORD( lParam ); // X-ova suradnica, kde sa kliklo na formular break; case WM_LBUTTONUP: mouse_catch = 0; // lave tlacidlo sa uvolnilo break; case WM_MOUSEMOVE: if ( !mouse_catch ) // ak nie je stlacene lave tlacidlo a kurzorom sa hybe po formulari, ukonci obsluhu // tu je odkomentovany break; GetCursorPos( &Coord_01 ); // ziskaj aktualne suradnice kurzora SetWindowPos( hwnd, NULL, (Coord_01.x - Coord_00.x), (Coord_01.y - Coord_00.y), 500, 300, 0 ); // a nastav novu poziciu okna ( 500 a 300 je sirka a vyska formulara) break; default: return DefWindowProc(hWnd, message, wParam, lParam); }
|
|
Registrovaný: 11.01.09 Prihlásený: 27.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
achbo píše: // tu je odkomentovany break; Ten break tam MUSÍ byť, to nie je chyba !!! achbo píše: mi build log vipisuje : ...
Zmeň hwnd v tej funkcii za hWnd. C++ rozlišuje veľké a malé písmená. Ja som to robil v inom editore, ten vygeneroval toto meno s malými písmenami.
Pre prečítanie spomenutých údajov zo súboru si pridaj do kódu túto funkciu:
Kód: int ReadDataFromFile( char IPaddress[20], int* port, char fileName[100] ) {
std::string riadok; // kazdy riadok sa bude postupne ukladat sem char str_port[10]; // retazcove vyjadrenie portu std::ifstream subor( fileName ); // subor otovreny pre citanie
if ( subor.is_open() ) {
while ( ! subor.eof() ) { // citaj az po koniec suboru (end of file)
std::getline ( subor, riadok ); // precitaj jeden riadok
if ( riadok.compare( 0, 4, "IP =" ) == 0 ) { // ak sa zacina na "IP =". pokracuj int dlzka; dlzka = riadok.copy( IPaddress, riadok.length() - 5, 5 ); // skopiruj do IPaddress IPaddress[dlzka] = '\0'; // nezabudnut na ukoncenie retazca }
if ( riadok.compare( 0, 4, "Port" ) == 0 ) { // ak sa zacina na "Port". pokracuj int dlzka; dlzka = riadok.copy( str_port, riadok.length() - 7, 7 ); // skopiruj do str_port str_port[dlzka] = '\0'; // nezabudnut na ukoncenie retazca }
} subor.close();
riadok.assign( str_port ); std::istringstream ss( riadok ); ss >> *port; // konverzia string-u na int
return 1; // jedna, ak funkcia uspeje
}
return 0; // nula, ak zlyha
} + pridaj tieto knižnice: Kód: #include <fstream> #include <sstream> #include <string> + niekde pod knižnice dopíš prototyp tejto funkcie, aby si ju mohol správne použiť v celom projekte. Prototyp je toto: Kód: int ReadDataFromFile( char [20], int*, char [100] ); Potom takto môžeš túto funkciu volať: Kód: char IPadresa[20]; int port;
if ( !ReadDataFromFile( IPadresa, &port, "E:\\config.ini" ) ) MessageBox( 0, "Chyba pri citani zo suboru", "Error", 0 );
V premennej IPadresa bude znakove vyjadrenie IP adresy zo súboru a v port číslicové vyjadrenie portu.
E:\\config.ini nahraď svojim umiestnením v PC.
|
|
Registrovaný: 13.11.07 Prihlásený: 20.08.16 Príspevky: 1702 Témy: 0 | 0 |
Keď už v tom programe používa WinAPI nebolo by jednoduchšie WinAPI použiť aj na prácu s ini súbormi?
|
|
Registrovaný: 11.01.09 Prihlásený: 27.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Nevravím, že nie, len som zvyknutý používať na prácu so súbormi knižnicu fstream. Môžeš to upraviť, ak sa ti to nezdá.
_________________ Ak potrebujete pomoc s diagnostikou/opravou vasej elektroniky ( notebook, motherboard, GPU, a ine ), kontaktujte ma cez SS. |
|
Registrovaný: 02.12.09 Prihlásený: 03.04.11 Príspevky: 68 Témy: 18 | 18 Bydlisko: Dubnica nad... |
Dakujem a teraz otazka :
Kedze tento program bude pouzivat viacero PC nie len ten moj, tak ta cesta k suboru config.ini bude zakazdym ina ... ako mam teda urcit cestu ked viem len ze to bude spolu v zlozke ale pouzivatel si zlozku pomenuje podla svojho (Program.exe a config.ini budu spolu v tej zlozke ale ako sa bude volat ta zlozka to vie len buduci pouzivatel programu )
|
|
Registrovaný: 11.01.09 Prihlásený: 27.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Ak sa bude ten program spúšťať z tej zložky, kde je config, tak cestu k tomuto súboru nemusíš uvádzať, stačí iba napísať config.ini (čiže bez cesty).
// pre budúcnosť:
E:\config.ini - absolútna adresa
config.ini - relatívna adresa
Oba zápisy sú správne. Relatívna adresa sa používa, ak sa nachádzaš v adresári s daným súborom.
|
|
Registrovaný: 02.12.09 Prihlásený: 03.04.11 Príspevky: 68 Témy: 18 | 18 Bydlisko: Dubnica nad... |
a este prosim ta ... ked mam program.exe ten moj program a potrebujem otvorit mojim programom dalsi program ako to bude ? v konzolovej aplikacii som to urobyl takto :
Kód: PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si)); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi)); CreateProcess( NULL, "main.exe connect /u127.0.0.1 /p44405", NULL, NULL, FALSE, 0,NULL, NULL, &si, &pi );
Ako to bude vo WinAPI?
|
|
Registrovaný: 11.01.09 Prihlásený: 27.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Veď toto je vo WinAPI Aha:
Citácia: http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx
_________________ Ak potrebujete pomoc s diagnostikou/opravou vasej elektroniky ( notebook, motherboard, GPU, a ine ), kontaktujte ma cez SS. |
|
Registrovaný: 02.12.09 Prihlásený: 03.04.11 Príspevky: 68 Témy: 18 | 18 Bydlisko: Dubnica nad... |
O.K. Ďakujem za tvoju pomoc a čas veľmi si toho cením vďaka tebe som sa priučil niečomu novému
Dik moc ešte raz
|
|
Stránka: 1 z 1
| [ Príspevkov: 25 ] | |
|