Voisko joku kirjottaa esimerkin, miten c++ssalla saa win-apia käyttämällä ikkunan auki ja sinne tekstiä. Sen pitäis kääntyä Devc++:ssalla. Olen ettinyt kirjastosta varmaan jokasen kirjan joka käsittelee aihetta mutta ei toimi. ne on kaikki visual c++ssalle ja oon yrittäny jättää kmaiken hötön pois mitä niissä on, muitta kun ei kieltä osaa niin on kai turha yrittää arvailla. Vinkkiä kiitos!
http://cpp.mureakuha.com/ Sieltä saat toimivan esimerkin ja paljon muuta ryönää.
Giitos paljon. ...mutte miten sinne ikkunaan voi kirjoittaa? Täytyypäs lukea joku kirja! :-P
No yksi tapa on luoda STATIC kontrolli CreateWindow() -funkkaria käyttämällä ja laittaa siihen tekstiä käyttäen SendMessage() -funkkaria.
Toinen tapa on puskea TextOutilla teksti suoraan ikkunaan.
Laitan tähän ohjelman, jonka tein ohjelmointikurssilla. Ohjelma ei itsessään tee mitään, mutta demonstroi erilaisten kontrollin käyttöä.
//========================================================================== // Päätin tehdä ihan Win32-ohjelman kurssia varten. // Ohjelma on yksinkertainen ja aika pieni esimerkki Win32-ohjelmoinnista, // mutta luulisi riittävän kurssin läpipääsemiseksi. :-) // // Koodi on aika laiskasti kommentoitu. // // Jos koitat kääntää tätä ohjelmaa itse muista linkata comctl32.lib // projektiin mukaan. // // Kääntyy ainakin Microsoft Visual C++ 6.0:lla. //========================================================================== // Otsikkotiedostot #include <iostream> #include <windows.h> #include <windowsx.h> #include <commctrl.h> #include <math.h> // Ikkunaproseduurifunktion esittely LRESULT CALLBACK IkkunaProseduuri (HWND, UINT, WPARAM, LPARAM); // Funktio, joka suoritetaan kun ohjelma käynnistyy int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iShowCmd) { // Sanomastruktuurimuuttuja MSG iMsg; // Ikkunan luokkastruktuurimuuttuja WNDCLASSEX wndClass; wndClass.cbSize = sizeof(wndClass); wndClass.style = CS_HREDRAW | CS_VREDRAW; wndClass.lpfnWndProc = IkkunaProseduuri; // Ikkunaproseduurin nimi (Tärkeä) wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hInstance = hInstance; // Ohjelman ilmentymän kahva (Tärkeä) wndClass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndClass.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wndClass.hCursor = LoadCursor (NULL, IDC_ARROW); wndClass.hbrBackground = (HBRUSH) COLOR_WINDOW; wndClass.lpszMenuName = NULL; wndClass.lpszClassName = "Ohjelma"; // Ikkunan luokan nimi (Tärkeä) // Rekisteröidään ikkunan luokka RegisterClassEx (&wndClass); // Luodaan ikkuna HWND hWnd = CreateWindow ("Ohjelma", "TI3-kurssin työ", WS_OVERLAPPEDWINDOW, 100, 100, 371, 397, NULL, NULL, hInstance, NULL); // Piirretään ikkuna ShowWindow (hWnd, iShowCmd); // Päivitetään ikkuna UpdateWindow (hWnd); // Yleisten kontrollien rekisteröinti InitCommonControls (); // Sanomien käsittelysilmukka while (GetMessage(&iMsg, NULL, 0, 0) > 0) { TranslateMessage (&iMsg); DispatchMessage (&iMsg); } // Käyttöjärjestelmälle palautuva arvo return iMsg.wParam; } // Ikkunaproseduurifunktio LRESULT CALLBACK IkkunaProseduuri (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { // Esitellään muuttujat (Staattiset muuttujat säilyvät kun funktiota ei olla suorittamassa) static HWND hwndStatus, hwndEdit1, hwndEdit2, hwndButton1, hwndButton2, hwndButton3, hwndButton4, hwndButton5, hwndButton6, hwndButton7, hwndButton8, hwndList1, hwndList2, hwndBox; static HFONT hfDefault; static char chBuffer[80]; static RECT rSize; static int parts[1], iIndex; // Haetaan systemfontti hfDefault = (HFONT) GetStockObject(DEFAULT_GUI_FONT); // Käsitellään lomakkeelta tulleet sanomat switch (uMsg) { // Ikkuna on luotu (Initiaalisanoma) case WM_CREATE: // Luodaan kontrollit GetClientRect (hWnd, &rSize); hwndBox = CreateWindowEx (NULL, "BUTTON", "Listat:", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 5, 5, rSize.right - 10, rSize.bottom - 32, hWnd, (HMENU) 0, GetModuleHandle(NULL), NULL); SendMessage (hwndBox, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); hwndStatus = CreateWindowEx (NULL, STATUSCLASSNAME, "Lisää/Poista/Muokkaa/Vaihda listoissa olevia rivejä...", WS_CHILD | WS_VISIBLE | CCS_BOTTOM | SBARS_SIZEGRIP, 0, 0, 0, 0, hWnd, (HMENU) 1, GetModuleHandle(NULL), NULL); SendMessage (hwndStatus, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); SendMessage (hwndStatus, SB_SETPARTS, 1, (LPARAM) parts); hwndEdit1 = CreateWindowEx (WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL, 15, 25, rSize.right - (ceil(rSize.right / 2)) - 50 - 15, 20, hWnd, (HMENU) 2, GetModuleHandle(NULL), NULL); SendMessage (hwndEdit1, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); hwndEdit2 = CreateWindowEx (WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL, ceil(rSize.right / 2) + 50, 25, ceil(rSize.right / 2) - 50 - 15, 20, hWnd, (HMENU) 3, GetModuleHandle(NULL), NULL); SendMessage (hwndEdit2, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); hwndButton1 = CreateWindowEx (NULL, "BUTTON", "->", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, ceil(rSize.right / 2) - 15, ceil(rSize.bottom / 2) - 110, 30, 30, hWnd, (HMENU) 4, GetModuleHandle(NULL), NULL); SendMessage (hwndButton1, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); hwndButton2 = CreateWindowEx (NULL, "BUTTON", "<-", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, ceil(rSize.right / 2) - 15, ceil(rSize.bottom / 2) - 80, 30, 30, hWnd, (HMENU) 5, GetModuleHandle(NULL), NULL); SendMessage (hwndButton2, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); hwndButton3 = CreateWindowEx (NULL, "BUTTON", "Lisää", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 15, rSize.bottom - 125, rSize.right - (ceil(rSize.right / 2)) - 50 - 15, 25, hWnd, (HMENU) 6, GetModuleHandle(NULL), NULL); SendMessage (hwndButton3, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); hwndButton4 = CreateWindowEx (NULL, "BUTTON", "Poista", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 15, rSize.bottom - 95, rSize.right - (ceil(rSize.right / 2)) - 50 - 15, 25, hWnd, (HMENU) 7, GetModuleHandle(NULL), NULL); SendMessage (hwndButton4, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); hwndButton5 = CreateWindowEx (NULL, "BUTTON", "Tyhjennä", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 15, rSize.bottom - 65, rSize.right - (ceil(rSize.right / 2)) - 50 - 15, 25, hWnd, (HMENU) 8, GetModuleHandle(NULL), NULL); SendMessage (hwndButton5, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); hwndButton6 = CreateWindowEx (NULL, "BUTTON", "Lisää", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, ceil(rSize.right / 2) + 50, rSize.bottom - 125, ceil(rSize.right / 2) - 50 - 15, 25, hWnd, (HMENU) 9, GetModuleHandle(NULL), NULL); SendMessage (hwndButton6, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); hwndButton7 = CreateWindowEx (NULL, "BUTTON", "Poista", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, ceil(rSize.right / 2) + 50, rSize.bottom - 95, ceil(rSize.right / 2) - 50 - 15, 25, hWnd, (HMENU) 10, GetModuleHandle(NULL), NULL); SendMessage (hwndButton7, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); hwndButton8 = CreateWindowEx (NULL, "BUTTON", "Tyhjennä", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, ceil(rSize.right / 2) + 50, rSize.bottom - 65, ceil(rSize.right / 2) - 50 - 15, 25, hWnd, (HMENU) 11, GetModuleHandle(NULL), NULL); SendMessage (hwndButton8, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); hwndList1 = CreateWindowEx (WS_EX_CLIENTEDGE, "LISTBOX", NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD, 15, 50, rSize.right - (ceil(rSize.right / 2)) - 50 - 15, rSize.bottom - 190, hWnd, (HMENU) 12, GetModuleHandle(NULL), NULL); SendMessage (hwndList1, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); hwndList2 = CreateWindowEx (WS_EX_CLIENTEDGE, "LISTBOX", NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD, ceil(rSize.right / 2) + 50, 50, ceil(rSize.right / 2) - 50 - 15, rSize.bottom - 190, hWnd, (HMENU) 13, GetModuleHandle(NULL), NULL); SendMessage (hwndList2, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); break; case WM_SIZE: // Ikkunan koko on muuttunut. Tämä on vain koordinaattien lasketaa. parts[0] = LOWORD(lParam); GetClientRect (hWnd, &rSize); MoveWindow (hwndBox, 5, 5, rSize.right - 10, rSize.bottom - 32, TRUE); MoveWindow (hwndStatus, NULL, NULL, NULL, NULL, NULL); SendMessage (hwndStatus, SB_SETPARTS, 1, (LPARAM) parts); MoveWindow (hwndEdit1, 15, 25, rSize.right - (ceil(rSize.right / 2)) - 50 - 15, 20, TRUE); MoveWindow (hwndEdit2, ceil(rSize.right / 2) + 50, 25, ceil(rSize.right / 2) - 50 - 15, 20, TRUE); MoveWindow (hwndButton1, ceil(rSize.right / 2) - 15, ceil(rSize.bottom / 2) - 110, 30, 30, TRUE); MoveWindow (hwndButton2, ceil(rSize.right / 2) - 15, ceil(rSize.bottom / 2) - 80, 30, 30, TRUE); MoveWindow (hwndButton3, 15, rSize.bottom - 125, rSize.right - (ceil(rSize.right / 2)) - 50 - 15, 25, TRUE); MoveWindow (hwndButton4, 15, rSize.bottom - 95, rSize.right - (ceil(rSize.right / 2)) - 50 - 15, 25, TRUE); MoveWindow (hwndButton5, 15, rSize.bottom - 65, rSize.right - (ceil(rSize.right / 2)) - 50 - 15, 25, TRUE); MoveWindow (hwndButton6, ceil(rSize.right / 2) + 50, rSize.bottom - 125, ceil(rSize.right / 2) - 50 - 15, 25, TRUE); MoveWindow (hwndButton7, ceil(rSize.right / 2) + 50, rSize.bottom - 95, ceil(rSize.right / 2) - 50 - 15, 25, TRUE); MoveWindow (hwndButton8, ceil(rSize.right / 2) + 50, rSize.bottom - 65, ceil(rSize.right / 2) - 50 - 15, 25, TRUE); MoveWindow (hwndList1, 15, 50, rSize.right - (ceil(rSize.right / 2)) - 50 - 15, rSize.bottom - 190, TRUE); MoveWindow (hwndList2, ceil(rSize.right / 2) + 50, 50, ceil(rSize.right / 2) - 50 - 15, rSize.bottom - 190, TRUE); break; case WM_COMMAND: switch (HIWORD(wParam)) { case BN_CLICKED: if (LOWORD(wParam) == 4) { iIndex = SendMessage (hwndList1, LB_GETCURSEL, 0, 0); if (iIndex != LB_ERR) { ListBox_GetText (hwndList1, iIndex, chBuffer); SendMessage (hwndList2, LB_ADDSTRING, 0, (LPARAM) chBuffer); SendMessage (hwndList1, LB_DELETESTRING, iIndex, 0); SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) "Rivi siirrettiin vasemmalta oikealle..."); } else { SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) "Rivin siirrossa tapahtui virhe ja toiminto keskeytettiin!"); } } else if (LOWORD(wParam) == 5) { iIndex = SendMessage (hwndList2, LB_GETCURSEL, 0, 0); if (iIndex != LB_ERR) { ListBox_GetText (hwndList2, iIndex, chBuffer); SendMessage (hwndList1, LB_ADDSTRING, 0, (LPARAM) chBuffer); SendMessage (hwndList2, LB_DELETESTRING, iIndex, 0); SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) "Rivi siirrettiin oikealta vasemmalle..."); } else { SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) "Rivin siirrossa tapahtui virhe ja toiminto keskeytettiin!"); } } else if (LOWORD(wParam) == 6) { GetWindowText (hwndEdit1, chBuffer, 80); if (strcmp(chBuffer, "") == TRUE) { SendMessage (hwndList1, LB_ADDSTRING, 0, (LPARAM) chBuffer); SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) "Rivi lisätty vasempaan listaan..."); } else { SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) "Rivin lisäyksessä tapahtui virhe ja toiminto keskeytettiin!"); } } else if (LOWORD(wParam) == 7) { iIndex = SendMessage (hwndList1, LB_GETCURSEL, 0, 0); if (iIndex != LB_ERR) { SendMessage (hwndList1, LB_DELETESTRING, iIndex, 0); SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) "Rivi poistettu vasemmasta listasta..."); } else { SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) "Rivin poistossa tapahtui virhe ja toiminto lopetettiin!"); } } else if (LOWORD(wParam) == 8) { SendMessage (hwndList1, LB_RESETCONTENT, 0, 0); SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) "Vasemmanpuoleinen lista tyhjennetty..."); } else if (LOWORD(wParam) == 9) { GetWindowText (hwndEdit2, chBuffer, 80); if (strcmp(chBuffer, "") == TRUE) { SendMessage (hwndList2, LB_ADDSTRING, 0, (LPARAM) chBuffer); SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) "Rivi lisätty oikeaan listaan..."); } else { SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) "Rivin lisäyksessä tapahtui virhe ja toiminto keskeytettiin!"); } } else if (LOWORD(wParam) == 10) { iIndex = SendMessage (hwndList2, LB_GETCURSEL, 0, 0); if (iIndex != LB_ERR) { SendMessage (hwndList2, LB_DELETESTRING, iIndex, 0); SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) "Rivi poistettu oikeasta listasta..."); } else { SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) "Rivin poistossa tapahtui virhe ja toiminto lopetettiin!"); } } else if (LOWORD(wParam) == 11) { SendMessage (hwndList2, LB_RESETCONTENT, 0, 0); SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) "Oikeanpuoleinen lista tyhjennetty..."); } break; } break; case WM_DESTROY: PostQuitMessage (0); return 0; break; default: return DefWindowProc (hWnd, uMsg, wParam, lParam); break; } }
Aijjai nyt kyllä häpäisee putkan leiskan tämä koodinpätkä :P
Tulipas vielä mieleen että tämän voisi laittaa koodivinkkeihin. Taidanpa laittaa.
Huhhuh! Meinasin ihan hukkua koodiin! Olen saanut jo tekstiä ja alertinkin toimimaan, mutta jokin mättää kun en saa valikkoa näkyviin. Se on kyllä määritelty resurssitiedostoon ja cpp-hen mutta ei näy. Missäköhän vika on. Voisiko joku kertoa. Samoin kuvake ei vaihdu. Se laittaa oman kuvakkeen tilalle semmosen windows lipun. default-kuvake kyllä toimii.
Lähdekoodi:
#include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); HINSTANCE hInstance; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MSG msg; WNDCLASSEX wndclass; wndclass.cbSize = sizeof (wndclass); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wndclass.lpszMenuName = "MyMenu"; wndclass.lpszClassName = "OmaLuokka"; wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION); RegisterClassEx (&wndclass); HWND hwnd = CreateWindow ("OmaLuokka", "ApuOhjelma", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); MessageBox (hwnd, "Tervetuloa käyttämään ApuOhjelmaa!", "ApuOhjelma", MB_OK); while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { static HDC hdc; static PAINTSTRUCT ps; static RECT rect; static HWND hwndGroupbox; static HFONT hFont; switch (iMsg) { case WM_CREATE : hFont = (HFONT) GetStockObject(DEFAULT_GUI_FONT) ; return 0; case WM_COMMAND: return 0; case WM_PAINT : hdc = BeginPaint (hwnd, &ps); GetClientRect (hwnd, &rect); DrawText (hdc, "Helollo!", -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); EndPaint (hwnd, &ps); return 0; case WM_SIZE: MoveWindow (hwndGroupbox, 10, 10, LOWORD(lParam)-20, HIWORD(lParam)-20, TRUE); return 0; case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam); } Ja resurssitiedosto: 500 ICON MOVEABLE PURE LOADONCALL DISCARDABLE "C:\c_jutut\testiapsi.ico" KUVA ICON "C:\c_jutut\testiapsi.ico" MyMenu MENU { POPUP "&Tiedosto" { MENUITEM "&Sulje apsi", IDM_EXIT } }
Tuolla resurssitiedostossa ja lähdekoodissa ei nyt ole sitä kuvakehömpötystä, mutta jos joku voisi neuvoa miten sen saa toimimaan.
En oikeastikkaan mitään turhia porissut kun sanoin että http://cpp.mureakuha.com/ osoitteesta löydät paljon Win32 ohjelmointiin liittyvää ryönää.
http://cpp.mureakuha.com/win32/win32vaikeat.htm
Jos vaikka vilkaiset tehtävää 3 niin on siinä sinulle valmis esimerkki menujen, ikonien ja kursoreiden käytöstä. Muuttele ja sovella ja opettele.
Ohops! Jäi huomaamatta. Kiitti!
Miten saa ikkuna kokoa muutettua ikkunaa luotaessa??
Omassa koodissasi kohdassa: HWND hwnd = CreateWindow ("OmaLuokka", "ApuOhjelma", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
2 ekaa CW_USEDEFAULT:ia ovat ikkunan aloituspaikka esim: HWND hwnd = CreateWindow ("OmaLuokka", "ApuOhjelma", WS_OVERLAPPEDWINDOW,
50, 100, CW_USEDEFAULT,
CW_USEDEFAULT, NULL, NULL, hInstance, NULL); // Ikkuna on aukeamisessa kohdassa x: 50px y: 100px
Seuraavat 2 CW_USEDEFAULTIA ovat ikkunan koko: HWND hwnd = CreateWindow ("OmaLuokka", "ApuOhjelma", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 500,
500, NULL, NULL, hInstance, NULL); // Avaa ikkunan kooltaan 500x500px
Juu, wörkkii hyvin. Miten saa tiedostosta luettua dataa kun kokeilin eilen jollakin fstreamilla ja kääntäjä oli melkein räjähtää virhe-varoitus-tulvasta. Ja rekisteriavaimista winkkiä gitos. Olisi tarkotuksena tehdä päivän vitsi-ohjelma joka aina sisään koneen käynnistäessä näyttää messageboxissa päivän vitsin joka luettaisiin tiedostosta ja rekisteriin merkittäisiin että se vitsi on jo "luettu" ja sitä ei pidä näyttää uudelleen. Kun kaikki vitsit on "luettu" ohjelma alkaisi lukea niitä alustaalkaen uudelleen. Eli miten saa rekisteriavaimesta luettua tietoa ja sinne laitettua tietoa. Ja miten saa tiedostosta poimittua muuttujaan tietyn rivin. Ja sitten vielä probleema. Kun ohjelma on asennettu koneelle (ajattelin laittaa jakoon samalla asennusohjelmalla kuin oppiaikäkaikessa) niin eihän se mun ohjelma tiedä mihin kansioon on asennettu. Ja eikös sitä tiedostoa avattaessa tarvitse olla koko polku? Niin onkohan sillä asennusohjelmalla laittaa rekisteriin avain josta se mun ohjelma päättelisi minne on asennettu ja hakisi sitä tiedostoa samasta kansiosta? Mutta miten tämä kaikki toteutetaan? ÄÄH OLEN PIHALLA! HELPPIÄ PLIIS
ARGH MITEN PALJON KIRJOTUSVIRHEITÄ...
Sittevielä miten saa trayhin kuvakkeen ja kun sitä klikkaa niin ohjelman ikkuna avautuu
ARGH! En saa ohjelmakuvaketta toimimaan. Se on vaan kokoajan se windows-lippu. Mikähän mättää.
Tässä sorsa:
#include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); HINSTANCE hInstance; char ohjelmanimi[] = "kuva"; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MSG msg; WNDCLASSEX wndclass; wndclass.cbSize = sizeof (wndclass); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon (hInstance, ohjelmanimi); wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) COLOR_WINDOW; wndclass.lpszMenuName = NULL; wndclass.lpszClassName = ohjelmanimi; wndclass.hIconSm = LoadIcon (hInstance, ohjelmanimi); RegisterClassEx (&wndclass); HWND hwnd = CreateWindow (ohjelmanimi, "VitsiKone v.1.0", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 285, 110, NULL, NULL, hInstance, NULL); ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { static HWND hwndVitsi, hwndLopeta, hwndCopy, hwndTietoja; static HFONT hFont; switch (iMsg) { case WM_CREATE : hFont = (HFONT) GetStockObject(DEFAULT_GUI_FONT) ; hwndVitsi = CreateWindow ("button", "Kerro vitsi", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 10, 100, 30, hwnd, (HMENU) 1, hInstance, NULL ) ; hwndLopeta = CreateWindow ("button", "Lopeta", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 120, 10, 150, 30, hwnd, (HMENU) 2, hInstance, NULL ) ; hwndTietoja = CreateWindow ("button", "Tietoja ohjelmasta", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 50, 150, 30, hwnd, (HMENU) 3, hInstance, NULL ) ; SetClassLong (hwnd, GCL_HICON, LoadIcon (hInstance, "kuva")); SetClassLong (hwnd, GCL_HICONSM, LoadIcon (hInstance, "kuva")); return 0; case WM_COMMAND: if (LOWORD(wParam) == 1 && HIWORD(wParam) == BN_CLICKED && (HWND) lParam == hwndVitsi) { MessageBox (hwnd, "Butterfree", "VitsiKone v.1.0", MB_OK); } else if (LOWORD(wParam) == 2 && HIWORD(wParam) == BN_CLICKED && (HWND) lParam == hwndLopeta) { DestroyWindow (hwnd); break ; } else if (LOWORD(wParam) == 3 && HIWORD(wParam) == BN_CLICKED && (HWND) lParam == hwndTietoja) { MessageBox (hwnd, "VitsiKone\nDizzyProductions 2003\nwww.dizzyproductions.cjb.net", "VitsiKone v.1.0", MB_ICONASTERISK | MB_OK); } return 0; case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam); }
ja tässä resurssitiedosto:
500 ICON MOVEABLE PURE LOADONCALL DISCARDABLE "C:\c_jutut\vitsik\vitsikone.ico" kuva ICON MOVEABLE PURE LOADONCALL DISCARDABLE "C:\c_jutut\vitsik\vitsikone.ico"
teen devc++ssalla
Jamuuten en sittenkään aio käyttää tota rekisterisähellystä vaan laitan sen vitsitiedoston suoraan c:n juureen
näin se hoituu. Tota tray kuvaakaan en aio laittaa. Miten vois toteuttaa kun tarkotuksena olis nyt tehdä semmonen että kun se ohjelma latais ekaan muuttujaan tiedoston vitsi.vkcf sisällön (se on numero) ja sitten lukis toiseen muuttujaan vitsit.joke tiedoston rivin, jonka numero juuri haettiin vitsit.vkcf tiedostosta. Lopuksi se lisäis siihen ensimmäiseen muuttujaan numeron yksi ja tallentais sen ekan tiedoston. (ettei ohjelma lue aina vaan samaa riviä) Tokaan tiedostoon ei tehdä mitään muutoksia, sielä vain luetaan.
helppliis
Aihe on jo aika vanha, joten et voi enää vastata siihen.