Olen viimmein päättänyt jättää Borland C++ 5.02:n. Kun DEV CPP:ssä valitsee windows vaihtoehdot, se generoi oheisen aloituskoodin.
Kysymyksiä
========
1. Jos painaa esim. hiiren vasenta näppäintä, mihin tämä painallus välittyy.
2. Eli miten windowskontrollin saa itselleen niin, että tekee funktion, joka pollaa tulevia hiiri ja näppäin kontrolleja.
3. Sen myötä voi kirjoittaa koko windows-kuran erilleen omaan yksikköön, ja mainista voi pollata kontrolleja esim. itse tehdyllä funktiolla int ctrl = updateCtrl();
4. Kun kaikki piirtofunktiot on kirjoitettu tähän windows-roska yksikköön, OwnMainista voi käyttää windowssia, kuin se olisi suoraan BC5.02 BGI:n kaltainen.
5. Harrastan grafiikkaa, enkä tarvitse Windowsin muita ns. seko-ominaisuuksia. Miksi Windows on tehty niin sekavasti, että tuolla aloitusfunktioilla ei pääse matkaan.
#include <windows.h> /* This is where all the input to the window goes to */ LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch(Message) { /* Upon destruction, tell the main thread to stop */ case WM_DESTROY: { PostQuitMessage(0); break; } /* All other messages (a lot of them) are processed using default procedures */ default: return DefWindowProc(hwnd, Message, wParam, lParam); } return 0; } /* The 'main' function of Win32 GUI programs: this is where execution starts */ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wc; /* A properties struct of our window */ HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */ MSG msg; /* A temporary location for all messages */ /* zero out the struct and set the stuff we want to modify */ memset(&wc,0,sizeof(wc)); wc.cbSize = sizeof(WNDCLASSEX); wc.lpfnWndProc = WndProc; /* This is where we will send messages to */ wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); /* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */ wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszClassName = "WindowClass"; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */ wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */ if(!RegisterClassEx(&wc)) { MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK); return 0; } hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, /* x */ CW_USEDEFAULT, /* y */ 640, /* width */ 480, /* height */ NULL,NULL,hInstance,NULL); if(hwnd == NULL) { MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK); return 0; } /* This is the heart of our program where all input is processed and sent to WndProc. Note that GetMessage blocks code flow until it receives something, so this loop will not produce unreasonably high CPU usage */ while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */ TranslateMessage(&msg); /* Translate key codes to chars if present */ DispatchMessage(&msg); /* Send it to WndProc */ } return msg.wParam; }
Perinteisesti viestit käsitellään "ikkuna proseduurissa" ja esimerkiksi hiiren vasemman napin osalta voit vaikka halutessasi käsitellä WM_LBUTTONDOWN ja WM_LBUTTONUP viestit.
Minä tarkoitin jotain tällaista funktiota:
#define LeftButtonDown 0x01 #define RightButtonDown 0x02 int updateCtrl(void) { MSG msg = JokuWindowsFunktio, mutta mikä? int ctrl = msg.uuno; koodia... if (ctrl & LeftButtonDown) { tee sitä } else if (ctrl & RightButtonDown) { tee tätä } jne... }
1. Painallus välittyy WndProc-funktiolle tietyillä parametreilla kuten WM_LBUTTONDOWN ja WM_LBUTTONUP.
2. Voit tehdä GetMessage-silmukan tilalle toisenlaisen silmukan PeekMessage-funktiolla kuten Microsoftin ohjeissa, ja voit sitten lukea hiirtä ja näppäimistöä funktioilla GetCursorPos (ja ScreenToClient) ja GetKeyboardState.
3. No niin voi jos haluaa.
4. Tavallaan.
5. Windows toimii näin, koska Windowsia on kehitetty vuodesta 1985 alkaen ja jonkun mielestä (1) tämä on ollut silloin hyvä idea ja (2) myöhemmin on jatkettu samaa kuraa luultavasti jostain yhteensopivuussyistä.
Yleensä jos haluat tehdä Windowsissa jonkin tietyn asian, kannattaa käyttää jotain siihen sopivaa kirjastoa. Esimerkiksi yksi ikkuna, pikselit, näppis ja hiiri ilman Windows-sekoilua onnistuvat SDL-kirjastolla. Asennusohjeet löydät varmaan netistä. Mallikoodia löytyy googlaamalla vaikka "SDL draw pixel example" ja SDL:n tutoriaaleista. Eli ei ole pakko (tai edes järkevää) itse kahlata Windows-suossa, vaan joku muu on jo tehnyt sen. Huomaa erot kirjaston versioiden välillä, tarkista oikea versio ennen kuin yrität copy-pasteta koodeja.
Aihe on jo aika vanha, joten et voi enää vastata siihen.