Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C: Listat (WIN32)

odys [14.10.2003 15:27:35]

#

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;
	}
}

Dustbin [14.10.2003 20:39:19]

#

Joo, luulisi riittävän kurssin läpäisemiseksi.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta