#pragma comment(lib, "comctl32.lib") // Otsikkotiedostot #include <windows.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 msg; BOOL bretval; HWND hWnd; // 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 = TEXT("Ohjelma"); // Ikkunan luokan nimi (Tärkeä) // Rekisteröidään ikkunan luokka RegisterClassEx (&wndClass); // Luodaan ikkuna hWnd = CreateWindow(TEXT("Ohjelma"), TEXT("Listat"), 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(); msgloopstart: bretval = GetMessage(&msg, NULL, 0, 0); if (bretval != 0) { TranslateMessage (&msg); DispatchMessage (&msg); goto msgloopstart; } // Käyttöjärjestelmälle palautuva arvo return msg.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(0, TEXT("BUTTON"), TEXT("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(0, STATUSCLASSNAME, TEXT("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, TEXT("EDIT"), TEXT(""), WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL, 15, 25, rSize.right - (ceil(rSize.right / 2.0)) - 50 - 15, 20, hWnd, (HMENU) 2, GetModuleHandle(NULL), NULL); SendMessage (hwndEdit1, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); hwndEdit2 = CreateWindowEx (WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""), WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL, ceil(rSize.right / 2.0) + 50, 25, ceil(rSize.right / 2.0) - 50 - 15, 20, hWnd, (HMENU) 3, GetModuleHandle(NULL), NULL); SendMessage (hwndEdit2, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); hwndButton1 = CreateWindowEx (0, TEXT("BUTTON"), TEXT("->"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, ceil(rSize.right / 2.0) - 15, ceil(rSize.bottom / 2.0) - 110, 30, 30, hWnd, (HMENU) 4, GetModuleHandle(NULL), NULL); SendMessage (hwndButton1, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); hwndButton2 = CreateWindowEx (0, TEXT("BUTTON"), TEXT("<-"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, ceil(rSize.right / 2.0) - 15, ceil(rSize.bottom / 2.0) - 80, 30, 30, hWnd, (HMENU) 5, GetModuleHandle(NULL), NULL); SendMessage (hwndButton2, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); hwndButton3 = CreateWindowEx (0, TEXT("BUTTON"), TEXT("Lisää"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 15, rSize.bottom - 125, rSize.right - (ceil(rSize.right / 2.0)) - 50 - 15, 25, hWnd, (HMENU) 6, GetModuleHandle(NULL), NULL); SendMessage (hwndButton3, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); hwndButton4 = CreateWindowEx (0, TEXT("BUTTON"), TEXT("Poista"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 15, rSize.bottom - 95, rSize.right - (ceil(rSize.right / 2.0)) - 50 - 15, 25, hWnd, (HMENU) 7, GetModuleHandle(NULL), NULL); SendMessage (hwndButton4, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); hwndButton5 = CreateWindowEx (0, TEXT("BUTTON"), TEXT("Tyhjennä"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 15, rSize.bottom - 65, rSize.right - (ceil(rSize.right / 2.0)) - 50 - 15, 25, hWnd, (HMENU) 8, GetModuleHandle(NULL), NULL); SendMessage (hwndButton5, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); hwndButton6 = CreateWindowEx (0, TEXT("BUTTON"), TEXT("Lisää"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, ceil(rSize.right / 2.0) + 50, rSize.bottom - 125, ceil(rSize.right / 2.0) - 50 - 15, 25, hWnd, (HMENU) 9, GetModuleHandle(NULL), NULL); SendMessage (hwndButton6, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); hwndButton7 = CreateWindowEx (0, TEXT("BUTTON"), TEXT("Poista"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, ceil(rSize.right / 2.0) + 50, rSize.bottom - 95, ceil(rSize.right / 2.0) - 50 - 15, 25, hWnd, (HMENU) 10, GetModuleHandle(NULL), NULL); SendMessage (hwndButton7, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); hwndButton8 = CreateWindowEx (0, TEXT("BUTTON"), TEXT("Tyhjennä"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, ceil(rSize.right / 2.0) + 50, rSize.bottom - 65, ceil(rSize.right / 2.0) - 50 - 15, 25, hWnd, (HMENU) 11, GetModuleHandle(NULL), NULL); SendMessage (hwndButton8, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0)); hwndList1 = CreateWindowEx (WS_EX_CLIENTEDGE, TEXT("LISTBOX"), NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD, 15, 50, rSize.right - (ceil(rSize.right / 2.0)) - 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, TEXT("LISTBOX"), NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD, ceil(rSize.right / 2.0) + 50, 50, ceil(rSize.right / 2.0) - 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.0)) - 50 - 15, 20, TRUE); MoveWindow (hwndEdit2, ceil(rSize.right / 2.0) + 50, 25, ceil(rSize.right / 2.0) - 50 - 15, 20, TRUE); MoveWindow (hwndButton1, ceil(rSize.right / 2.0) - 15, ceil(rSize.bottom / 2.0) - 110, 30, 30, TRUE); MoveWindow (hwndButton2, ceil(rSize.right / 2.0) - 15, ceil(rSize.bottom / 2.0) - 80, 30, 30, TRUE); MoveWindow (hwndButton3, 15, rSize.bottom - 125, rSize.right - (ceil(rSize.right / 2.0)) - 50 - 15, 25, TRUE); MoveWindow (hwndButton4, 15, rSize.bottom - 95, rSize.right - (ceil(rSize.right / 2.0)) - 50 - 15, 25, TRUE); MoveWindow (hwndButton5, 15, rSize.bottom - 65, rSize.right - (ceil(rSize.right / 2.0)) - 50 - 15, 25, TRUE); MoveWindow (hwndButton6, ceil(rSize.right / 2.0) + 50, rSize.bottom - 125, ceil(rSize.right / 2.0) - 50 - 15, 25, TRUE); MoveWindow (hwndButton7, ceil(rSize.right / 2.0) + 50, rSize.bottom - 95, ceil(rSize.right / 2.0) - 50 - 15, 25, TRUE); MoveWindow (hwndButton8, ceil(rSize.right / 2.0) + 50, rSize.bottom - 65, ceil(rSize.right / 2.0) - 50 - 15, 25, TRUE); MoveWindow (hwndList1, 15, 50, rSize.right - (ceil(rSize.right / 2.0)) - 50 - 15, rSize.bottom - 190, TRUE); MoveWindow (hwndList2, ceil(rSize.right / 2.0) + 50, 50, ceil(rSize.right / 2.0) - 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) { SendMessage(hwndList1, LB_GETTEXT, iIndex, (LPARAM) chBuffer); SendMessage(hwndList2, LB_ADDSTRING, 0, (LPARAM) chBuffer); SendMessage(hwndList1, LB_DELETESTRING, iIndex, 0); SendMessage(hwndStatus, SB_SETTEXT, 0, (LPARAM) TEXT("Rivi siirrettiin vasemmalta oikealle...")); } else SendMessage(hwndStatus, SB_SETTEXT, 0, (LPARAM) TEXT("Rivin siirrossa tapahtui virhe ja toiminto keskeytettiin!")); } else if (LOWORD(wParam) == 5) { iIndex = SendMessage (hwndList2, LB_GETCURSEL, 0, 0); if (iIndex != LB_ERR) { SendMessage(hwndList2, LB_GETTEXT, iIndex, (LPARAM) chBuffer); SendMessage (hwndList1, LB_ADDSTRING, 0, (LPARAM) chBuffer); SendMessage (hwndList2, LB_DELETESTRING, iIndex, 0); SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) TEXT("Rivi siirrettiin oikealta vasemmalle...")); } else SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) TEXT("Rivin siirrossa tapahtui virhe ja toiminto keskeytettiin!")); } else if (LOWORD(wParam) == 6) { SendMessage(hwndEdit1, WM_GETTEXT, 80, (LPARAM) chBuffer); if (strcmp(chBuffer, "") == TRUE) { SendMessage (hwndList1, LB_ADDSTRING, 0, (LPARAM) chBuffer); SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) TEXT("Rivi lisätty vasempaan listaan...")); } else { SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) TEXT("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) TEXT("Rivi poistettu vasemmasta listasta...")); } else { SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) TEXT("Rivin poistossa tapahtui virhe ja toiminto lopetettiin!")); } } else if (LOWORD(wParam) == 8) { SendMessage (hwndList1, LB_RESETCONTENT, 0, 0); SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) TEXT("Vasemmanpuoleinen lista tyhjennetty...")); } else if (LOWORD(wParam) == 9) { SendMessage(hwndEdit2, WM_GETTEXT, 80, (LPARAM) chBuffer); if (strcmp(chBuffer, "") == TRUE) { SendMessage (hwndList2, LB_ADDSTRING, 0, (LPARAM) chBuffer); SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) TEXT("Rivi lisätty oikeaan listaan...")); } else SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) TEXT("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) TEXT("Rivi poistettu oikeasta listasta...")); } else { SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) TEXT("Rivin poistossa tapahtui virhe ja toiminto lopetettiin!")); } } else if (LOWORD(wParam) == 11) { SendMessage (hwndList2, LB_RESETCONTENT, 0, 0); SendMessage (hwndStatus, SB_SETTEXT, 0, (LPARAM) TEXT("Oikeanpuoleinen lista tyhjennetty...")); } break; } break; case WM_DESTROY: PostQuitMessage (0); return 0; break; default: return DefWindowProc (hWnd, uMsg, wParam, lParam); break; } }
Meinaatko oikeasti, että tällaisesta ”vinkistä” saa jotain hyödyllistä irti? Vaatii paljon lisää selittämistä. (Ylipäänsä WinAPI ilman kirjastoja ei onneksi ole nykyään suosiossa.)
Aihe on jo aika vanha, joten et voi enää vastata siihen.