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.