none
zegar RRS feed

  • Question

  • #include <windows.h>
    #include <cstdio>
    #define STALA_PRZESUNIECIA 10
    struct Rozdzielczosc
    {
    	unsigned int x, y;
    }ekran = {800, 500};
    
    struct Prostokat
    {
    	unsigned int left, top, right, bottom;
    }prostokat, org_prostokat;
    
    struct Myszka
    {
    	unsigned int x, y;
    }mysz;
    
    const COLORREF kolory[] = {RGB(255, 0, 0), RGB(0, 255, 0), RGB(0, 0, 255)};
    const int desen[] = {HS_BDIAGONAL, HS_CROSS, HS_DIAGCROSS, HS_FDIAGONAL, HS_FDIAGONAL, HS_HORIZONTAL, HS_VERTICAL};
    short int index = -1;
    short int index_d = 0;
    unsigned int licznik = 0;
    bool stan_d = false;
    
    TCHAR nazwaKlasy[] = TEXT("Nazwa klasy okna");
    TCHAR nazwaAplikacji[] = TEXT("Aplikacja");
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    	wchar_t buffor[64];
    
    	switch(msg)
    	{ 
    	case WM_CREATE:
    		if(MessageBox(hWnd, L"Ograniczyć obszar działań?", L"Pytanie", MB_YESNO | MB_ICONQUESTION) == IDYES)
    		{
    			RECT okno;
    			GetWindowRect(hWnd, &okno);
    			ClipCursor (&okno);
    		}
    		break;
    	case WM_PAINT:
    		HDC hdc;
    		PAINTSTRUCT info;
    		hdc = BeginPaint(hWnd, &info);
    		// skalowanie
    		RECT r;
    		GetClientRect(hWnd, &r);
    		SetMapMode(hdc, MM_ANISOTROPIC);
    		SetWindowOrgEx(hdc, 0, 0, NULL);
    		SetWindowExtEx(hdc, ekran.x, ekran.y, NULL);
    		SetViewportOrgEx(hdc, 0, 0, NULL);
    		SetViewportExtEx(hdc, r.right, r.bottom, NULL);
    		// koniec skalowania
    		if(index >= 0 && licznik == 2)
    		{
    			SaveDC(hdc);
    
    			HBRUSH pedzel;
    			if(!stan_d)
    				pedzel = CreateSolidBrush(kolory[index]);
    			else
    				pedzel = CreateHatchBrush(index_d, kolory[index]);
    			SelectObject(hdc, pedzel);
    			Rectangle(hdc, prostokat.left, prostokat.top, prostokat.right, prostokat.bottom);
    			RestoreDC(hdc, -1);
    			DeleteObject(pedzel);
    		}
    		else
    			Rectangle(hdc, prostokat.left, prostokat.top, prostokat.right, prostokat.bottom);
    		swprintf(buffor, L"Prostokąt [(%u,%u):(%u,%u)]", prostokat.left, prostokat.top, prostokat.right, prostokat.bottom);
    		SetWindowText(hWnd, buffor);
    		EndPaint(hWnd, &info);
    		break;
    	case WM_LBUTTONDOWN: 
    		mysz.x = (unsigned int)LOWORD(lParam);
    		mysz.y = (unsigned int)HIWORD(lParam);
    		if(licznik == 0)
    		{
    			prostokat.left = mysz.x;
    			prostokat.top = mysz.y;
    			++licznik;
    			break;
    		}
    		else if(licznik == 1)
    		{
    			prostokat.right = mysz.x;
    			prostokat.bottom = mysz.y;
    			++licznik;
    			break;
    		}
    		else
    		{
    			if(wParam & MK_SHIFT)
    			{
    				prostokat.right = (prostokat.right - prostokat.left) + mysz.x;
    				prostokat.bottom = (prostokat.bottom - prostokat.top) + mysz.y;
    				prostokat.left = mysz.x;
    				prostokat.top = mysz.y;
    			}
    			else if(wParam & MK_CONTROL)
    			{
    				if(mysz.x >= prostokat.left && mysz.x <= prostokat.right && mysz.y >= prostokat.top && mysz.y <= prostokat.bottom)
    				{
    					if(index == 2)
    						index = -1;
    					else
    						++index;
    				}
    			}
    		}
    		InvalidateRect(hWnd, NULL, TRUE);
    		break;
    	case WM_RBUTTONDOWN:
    		mysz.x = (unsigned int)LOWORD(lParam);
    		mysz.y = (unsigned int)HIWORD(lParam);
    		if(wParam & MK_CONTROL)
    		{
    			if(mysz.x >= prostokat.left && mysz.x <= prostokat.right && mysz.y >= prostokat.top && mysz.y <= prostokat.bottom)
    			{
    				if(index_d == 5)
    				{
    					index_d = -1;
    					stan_d = false;
    				}
    				else
    				{
    					++index_d;
    					stan_d = true;
    				}
    			}
    		}
    		InvalidateRect(hWnd, NULL, TRUE);
    		break;
    	case WM_MOUSEMOVE:
    		if(licznik == 1)
    		{
    			prostokat.right = (unsigned int)LOWORD(lParam);
    			prostokat.bottom = (unsigned int)HIWORD(lParam);
    			InvalidateRect(hWnd, NULL, TRUE);
    		}
    		break;
    	case WM_KEYDOWN:
    		switch((int)wParam) 
    		{
    		case VK_RIGHT:
    			prostokat.left += STALA_PRZESUNIECIA;
    			prostokat.right += STALA_PRZESUNIECIA;
    			break;
    		case VK_LEFT:
    			prostokat.left -= STALA_PRZESUNIECIA;
    			prostokat.right -= STALA_PRZESUNIECIA;
    			break;
    		case VK_UP:
    			prostokat.top -= STALA_PRZESUNIECIA;
    			prostokat.bottom -= STALA_PRZESUNIECIA;
    			break;
    		case VK_DOWN:
    			prostokat.top += STALA_PRZESUNIECIA;
    			prostokat.bottom += STALA_PRZESUNIECIA;
    			break;
    		case VK_NUMPAD8:
    			prostokat.bottom -= STALA_PRZESUNIECIA;
    			break;
    		case VK_NUMPAD2:
    			prostokat.bottom += STALA_PRZESUNIECIA;
    			break;
    		case VK_NUMPAD4:
    			prostokat.right -= STALA_PRZESUNIECIA;
    			break;
    		case VK_NUMPAD6:
    			prostokat.right += STALA_PRZESUNIECIA;
    			break;
    		case VK_NUMPAD5:
    			prostokat.top -= STALA_PRZESUNIECIA;
    			prostokat.bottom += STALA_PRZESUNIECIA;
    			prostokat.right += STALA_PRZESUNIECIA;
    			prostokat.left -= STALA_PRZESUNIECIA;
    			break;
    		case VK_NUMPAD0:
    			prostokat.top += STALA_PRZESUNIECIA;
    			prostokat.bottom -= STALA_PRZESUNIECIA;
    			prostokat.right -= STALA_PRZESUNIECIA;
    			prostokat.left += STALA_PRZESUNIECIA;
    			break;
    		}
    		InvalidateRect(hWnd, NULL, TRUE);
    		break;
    	case WM_DESTROY:
    		PostQuitMessage(0);
    	default:
    		return DefWindowProc(hWnd, msg, wParam, lParam);
    	}
    	return 0;
    }
    
    bool TworzenieKlasyOkna(WNDCLASSEX &wc, HINSTANCE hInstance)
    {
    	wc.cbClsExtra = 0;
    	wc.cbSize = sizeof(WNDCLASSEX);
    	wc.cbWndExtra = 0;
    	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    	wc.hIconSm = 0;
    	wc.hInstance = hInstance;
    	wc.lpfnWndProc = &WndProc;
    	wc.lpszClassName = nazwaKlasy;
    	wc.lpszMenuName = 0;
    	wc.style = CS_HREDRAW | CS_VREDRAW;
    	if(!RegisterClassEx(&wc))
    	{
    		MessageBox(0, TEXT("Błąd rejestracji"), TEXT("Błąd"), MB_OK | MB_ICONERROR | MB_TASKMODAL);
    		return true;
    	}
    	return false;
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
    {
    	WNDCLASSEX wc;
    	HWND hwnd;
    	MSG msg;
    	if(TworzenieKlasyOkna(wc, hInstance))
    		return 1;
    	hwnd = CreateWindowEx(0, nazwaKlasy, nazwaAplikacji, WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, ekran.x, ekran.y, 0, 0, hInstance, 0);
    	if(!hwnd)
    	{
    		MessageBox(0, TEXT("Błąd okna"), TEXT("Błąd"), MB_OK | MB_ICONERROR | MB_TASKMODAL);
    		UnregisterClass(nazwaKlasy, hInstance);
    		return 1;
    	}
    	ShowWindow(hwnd, nShowCmd);
    	UpdateWindow(hwnd);
    	while(GetMessage(&msg, 0, 0, 0) > 0)
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    	UnregisterClass(nazwaKlasy, hInstance);
    	return static_cast<int>(msg.wParam);
    }
    Wednesday, October 17, 2012 7:39 AM

Answers