Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C: Win32 Listat

Lumi-ukkeli [16.05.2015 13:49:38]

#

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

Metabolix [16.05.2015 13:55:31]

#

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.)

Vastaus

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

Tietoa sivustosta