Demonstroi erilaisten kontrollien käyttöä WinAPI:lla.
//========================================================================== // 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", "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 (); // 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; } }
Joo, luulisi riittävän kurssin läpäisemiseksi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.