Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Alan 01-11-2016 19:38
- #include <Windows.h>
- #define BTN_COL_NO 16 // Ilosc kolorow
- #define BTN_TOL_NO 6 // Ilosc narzedzi
- int WND_WID = 1280; // Szerokosc okna
- int WND_HEI = 720; // Wysokosc okna
- bool Print = false;
- enum MouseButton { LEFT, RIGHT };
- enum figure { SQUARE, ELIPSE, TRIANGLE, LINE, BRUSH }; // Rodzaje figur
- struct color { int Red, Green, Blue; }; // Struktura kolorow
- struct Button { // Struktura przycisku
- figure Figure; // Ksztalt przycisku
- int BorderWidth, PosX, PosY, Width, Height; // Szerokosc krawedzi ,pozycja x i y ,szeroksc i wysokosc
- color BorderColor, FillColor; // Kolory krawedzi i wypelnienie
- };
- struct cursor { // Struktura kursora
- POINT Start, End;
- int Size = 2; // Rozmiar 'pedzla'
- bool LeftPressed = false, RightPressed = false;
- bool Fill = false; // Czy rysowac , czy wypelnic kolorem
- figure Figure = SQUARE; // Ksztalt pedzla
- color BorderColor = { 0,0,0 }, FillColor = { 255, 255, 255 }; // Kolor ramki i wypelnienia
- };
- Button Pallet; // Paleta/przybornik tlo
- Button ColorButtons[BTN_COL_NO]; // Przyciski kolorow
- Button ToolsButtons[BTN_TOL_NO][2]; // Przyciski narzedzi
- cursor Cursor; // Kursor
- void AddButton(HWND &hwnd, Button &btn) { // Dodawanie/rysowanie przycisku
- HDC hdc = GetDC(hwnd);
- HBRUSH Fillament = CreateSolidBrush(RGB(btn.FillColor.Red, btn.FillColor.Green, btn.FillColor.Blue));// Wypelnienie
- HPEN Border = CreatePen(PS_SOLID, btn.BorderWidth, RGB(btn.BorderColor.Red, btn.BorderColor.Green, btn.BorderColor.Blue));// Ramka
- HBRUSH OldFlilament = (HBRUSH)SelectObject(hdc, Fillament); // Pedzel
- HPEN OldBorder = (HPEN)SelectObject(hdc, Border); // Piuro
- if (btn.Figure == SQUARE) // Kwadratowy przycisk
- Rectangle(hdc, btn.PosX, btn.PosY, btn.PosX + btn.Width, btn.PosY + btn.Height);
- else if (btn.Figure == ELIPSE) // Eliptyczny przycisk
- Ellipse(hdc, btn.PosX, btn.PosY, btn.PosX + btn.Width, btn.PosY + btn.Height);
- else if (btn.Figure == LINE) { // Rysowanie lini
- POINT OldPoint;
- MoveToEx(hdc, btn.PosX, btn.PosY, &OldPoint);
- LineTo(hdc, btn.PosX + btn.Width, btn.PosY + btn.Height);
- }
- else if (btn.Figure == BRUSH) { // Rysowanie lini
- Ellipse(hdc, btn.PosX, btn.PosY, btn.PosX + btn.Width, btn.PosY + btn.Height - 5); // Zwykly eliptyczny pedzel
- }
- else if (btn.Figure == TRIANGLE) { // Trojkat (wlasny) (wielkoat)
- POINT Points[3];
- Points[0] = { (btn.PosX + (btn.Width / 2)) ,btn.PosY };
- Points[1] = { btn.PosX + btn.Width ,btn.PosY + btn.Height };
- Points[2] = { btn.PosX , btn.PosY + btn.Height };
- Polygon(hdc, Points, 3);
- }
- SelectObject(hdc, OldFlilament);
- SelectObject(hdc, OldBorder);
- DeleteObject(Border);
- DeleteObject(Fillament);
- ReleaseDC(hwnd, hdc);
- }
- void AddElements(HWND &hwnd) { // Tworzenie przyciskow (ksztalt ,kolor)
- Pallet = { SQUARE,2, WND_WID - 146, 1, 130, WND_HEI - 40,{ 0,0,0 },{ 200,200,200 } };
- int i = 0; // TYPE Bsize X Y W H Ramka Wypelnienie /// Kolory
- ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 10, 50, 50,{ 0,0,0 },{ 0,0,0 } };
- ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 10, 50, 50,{ 0,0,0 },{ 255,0,0 } };
- ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 70, 50, 50,{ 0,0,0 },{ 0,255,0 } };
- ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 70, 50, 50,{ 0,0,0 },{ 0,0,255 } };
- ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 130, 50, 50,{ 0,0,0 },{ 100,100,100 } };
- ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 130, 50, 50,{ 0,0,0 },{ 255,100,100 } };
- ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 190, 50, 50,{ 0,0,0 },{ 100,255,100 } };
- ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 190, 50, 50,{ 0,0,0 },{ 100,100,255 } };
- ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 250, 50, 50,{ 0,0,0 },{ 200,200,200 } };
- ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 250, 50, 50,{ 0,0,0 },{ 200,255,255 } };
- ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 310, 50, 50,{ 0,0,0 },{ 255,200,255 } };
- ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 310, 50, 50,{ 0,0,0 },{ 255,255,200 } };
- ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 370, 50, 50,{ 0,0,0 },{ 100,200,255 } };
- ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 370, 50, 50,{ 0,0,0 },{ 200,255,100 } };
- ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 10, 430, 50, 50,{ 0,0,0 },{ 255,100,200 } };
- ColorButtons[i++] = { SQUARE, 1, Pallet.PosX + 70, 430, 50, 50,{ 0,0,0 },{ 255,255,255 } };
- i = 0; // ToolsButtons[PRZYCISK][ZAWARTOSC] = ... /// Narzedzia
- ToolsButtons[i][0] = { SQUARE, 1, Pallet.PosX + 10, 490, 50, 50,{ 0,0,0 },{ 255,255,255 } }; // CZ KW + BIALE TLO
- /**/ToolsButtons[i++][1] = { SQUARE, 1, ToolsButtons[i][0].PosX + 5, ToolsButtons[i][0].PosY + 5, 40, 40,{ 0,0,0 },{ 0,0,0 } };
- ToolsButtons[i][0] = { SQUARE, 1, Pallet.PosX + 70, 490, 50, 50,{ 0,0,0 },{ 255,255,255 } }; // CZ KW + PELNE TLO
- /**/ToolsButtons[i++][1] = { TRIANGLE, 1, ToolsButtons[i][0].PosX + 5, ToolsButtons[i][0].PosY + 45, 40, -40,{ 0,0,0 },{ 255,255,255 } };
- ToolsButtons[i][0] = { SQUARE, 1, Pallet.PosX + 10, 550, 50, 50,{ 0,0,0 },{ 255,255,255 } }; // CZ TR + BIALE TLO
- /**/ToolsButtons[i++][1] = { ELIPSE, 1, ToolsButtons[i][0].PosX + 5, ToolsButtons[i][0].PosY + 5, 40, 40,{ 0,0,0 },{ 0,0,0 } };
- ToolsButtons[i][0] = { SQUARE, 1, Pallet.PosX + 70, 550, 50, 50,{ 0,0,0 },{ 255,255,255 } }; // CZ TR + PELNE TLO
- /**/ToolsButtons[i++][1] = { TRIANGLE, 1, ToolsButtons[i][0].PosX + 5, ToolsButtons[i][0].PosY + 45, 40, -40,{ 0,0,0 },{ 0,0,0 } };
- ToolsButtons[i][0] = { SQUARE, 1, Pallet.PosX + 10, 610, 50, 50,{ 0,0,0 },{ 255,255,255 } }; // ZWYKLY PEDZEL
- /**/ToolsButtons[i++][1] = { BRUSH, 1, ToolsButtons[i][0].PosX + 5, ToolsButtons[i][0].PosY + 5, 30, 30,{ 0,0,0 },{ 0,0,0 } };
- ToolsButtons[i][0] = { SQUARE, 1, Pallet.PosX + 70, 610, 50, 50,{ 0,0,0 },{ 255,255,255 } }; // LINIA
- /**/ToolsButtons[i++][1] = { LINE, 3, ToolsButtons[i][0].PosX + 5, ToolsButtons[i][0].PosY + 5, 40, 40,{ 0,0,0 },{ 0,0,0 } };
- AddButton(hwnd, Pallet); // Rysowanie palety
- for (int i = 0; i < BTN_COL_NO; i++) // Rysowanie przyciskow kolorow
- AddButton(hwnd, ColorButtons[i]);
- for (int i = 0; i < BTN_TOL_NO; i++) // Rysowanie przyciskow narzedzi
- for (int j = 0; j < 2; j++)
- AddButton(hwnd, ToolsButtons[i][j]);
- }
- void ButtonsClicks(HWND &hwnd, int MouseX, int MouseY, MouseButton MB) { // Wykrywanie klikniec na przyciskach ...
- for (int i = 0; i < BTN_COL_NO; i++) { // ... kolorow
- if (MouseX >= ColorButtons[i].PosX &&
- MouseX <= ColorButtons[i].PosX + ColorButtons[i].Width &&
- MouseY >= ColorButtons[i].PosY &&
- MouseY <= ColorButtons[i].PosY + ColorButtons[i].Height) {// Jesli kliknieto na [i]'ty prycisk
- if (MB == RIGHT)
- Cursor.BorderColor = ColorButtons[i].FillColor; // Zmiana kolorow
- else if (MB == LEFT)
- Cursor.FillColor = ColorButtons[i].FillColor;
- return;
- }
- }
- for (int i = 0; i < BTN_TOL_NO; i++) { // ... narzedzi
- if (MouseX >= ToolsButtons[i][0].PosX &&
- MouseX <= ToolsButtons[i][0].PosX + ColorButtons[i].Width &&
- MouseY >= ToolsButtons[i][0].PosY &&
- MouseY <= ToolsButtons[i][0].PosY + ColorButtons[i].Height) {// Jesli kliknieto na [i]'ty prycisk
- Cursor.Figure = ToolsButtons[i][1].Figure; // Zmiana figury i wypelniania
- if (ToolsButtons[i][1].FillColor.Red == 0 && ToolsButtons[i][1].FillColor.Green == 0 && ToolsButtons[i][1].FillColor.Blue == 0)
- Cursor.Fill = true; // Wypelniaj kolorem (kliknieto na czarno wypelniony przybor)
- else
- Cursor.Fill = false; // Nie wypelniaj kolorem (kliknieto na bialo wypelniony przybor)
- return;
- }
- }
- }
- LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
- int MouseX = LOWORD(lParam); // Pobranie
- int MouseY = HIWORD(lParam); // X i Y myszy
- switch (msg) {
- case WM_RBUTTONDOWN: ButtonsClicks(hwnd, MouseX, MouseY, RIGHT); break; // Prawe klikniecie tylko na przyborniku -> sprawdzenie kolizji
- case WM_MOVE: AddElements(hwnd); break; // Przesowanie okna -> przerysowanie elementow
- case WM_SIZE: { // Zmiana rozmiaru okna -> pobranie nowego rozmiaru
- RECT rect;
- if (GetWindowRect(hwnd, &rect)) {
- WND_WID = rect.right - rect.left;
- WND_HEI = rect.bottom - rect.top;
- }
- AddElements(hwnd); // Przerysowanie elementow
- }break;
- case WM_LBUTTONUP: { // Lewe OD klikniecie (puszczenie)
- if (MouseX < Pallet.PosX) { // Nad obszarem rysowania
- if (Cursor.Figure == BRUSH) { // Zwykle rysowanie
- Print = false; // Koniec rysowania
- SendMessage(hwnd, WM_MOUSEMOVE, wParam, lParam);
- }
- else { // Nad przybornikiem
- Cursor.End = { MouseX ,MouseY }; // Zapisanie pozycji koncowej myszy
- Cursor.LeftPressed = false;
- Print = true; // Zacznij rysowac
- SendMessage(hwnd, WM_MOUSEMOVE, wParam, lParam);
- }
- }
- }break;
- case WM_LBUTTONDOWN: { // Lewy klikniet (w dol)
- if (MouseX > Pallet.PosX) { // Jesli nad przybornikiem
- ButtonsClicks(hwnd, MouseX, MouseY, LEFT);// Sprawdzenie kolizji
- }
- else if (Cursor.Figure == BRUSH) { // Jesli wybrano zwykle malowanie
- Print = true; // Rozpocznij malowanie
- SendMessage(hwnd, WM_MOUSEMOVE, wParam, lParam);
- }
- else { // Inaczej zapisz pozycje startowa i ustaw ze lewy przycisk jest wcisniety
- Cursor.LeftPressed = true;
- Cursor.Start = { MouseX ,MouseY };
- }
- }break;
- case WM_MOUSEMOVE: {
- if (MouseX + 10 < Pallet.PosX && !Cursor.LeftPressed && Print) {
- if (Cursor.Figure != BRUSH) Print = false; // Jesli zwykle malowanie nie przerywaj
- HDC hdc = GetDC(hwnd);
- HBRUSH Fillament; // Wypelnienie
- if (Cursor.Fill) // Jesli wypelniac figure
- Fillament = CreateSolidBrush(RGB(Cursor.FillColor.Red, Cursor.FillColor.Green, Cursor.FillColor.Blue));// Wypelnienie
- else // Nie wypelniac figury
- Fillament = CreateSolidBrush(RGB(255, 255, 255));// Brak Wypelnienia
- HPEN Border = CreatePen(PS_SOLID, 2, RGB(Cursor.BorderColor.Red, Cursor.BorderColor.Green, Cursor.BorderColor.Blue));// Ramka
- HBRUSH OldFlilament = (HBRUSH)SelectObject(hdc, Fillament); // Bufor starego wtpelnienia
- HPEN OldBorder = (HPEN)SelectObject(hdc, Border); // Bufor starej granicy
- if (Cursor.Figure == SQUARE) // Malowanie kwadratu
- Rectangle(hdc, Cursor.Start.x, Cursor.Start.y, Cursor.End.x, Cursor.End.y);
- else if (Cursor.Figure == ELIPSE) // Malowanie elipse
- Ellipse(hdc, Cursor.Start.x, Cursor.Start.y, Cursor.End.x, Cursor.End.y);
- else if (Cursor.Figure == TRIANGLE) { // Malowanie trojkata
- POINT Points[3];
- Points[0] = { (Cursor.Start.x + Cursor.End.x) / 2 ,Cursor.End.y };
- Points[1] = { Cursor.End.x ,Cursor.Start.y };
- Points[2] = { Cursor.Start.x ,Cursor.Start.y };
- Polygon(hdc, Points, 3);
- }
- else if (Cursor.Figure == LINE) { // Malowanie lini
- POINT OldPoint;
- MoveToEx(hdc, Cursor.Start.x, Cursor.Start.y, &OldPoint);
- LineTo(hdc, Cursor.End.x, Cursor.End.y);
- }
- else if (Cursor.Figure == BRUSH) { // Zwykle malowanie
- Ellipse(hdc, MouseX - 10, MouseY - 10, MouseX + 10, MouseY + 10);
- }
- SelectObject(hdc, OldFlilament);
- SelectObject(hdc, OldBorder);
- DeleteObject(Border);
- DeleteObject(Fillament);
- ReleaseDC(hwnd, hdc);
- }
- }break;
- case WM_CLOSE: { // Standard
- DestroyWindow(hwnd);
- }break;
- case WM_DESTROY: {// Standard
- PostQuitMessage(0);
- }break;
- default: {// Standard
- return DefWindowProc(hwnd, msg, wParam, lParam);
- }break;
- }
- return 0;
- }
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR ilCmdLine, int nCmdShow) {
- WNDCLASSEX window;
- MSG msg;
- TCHAR Class_Name[] = TEXT("OKNO_TEST"), Title[] = TEXT("Tytul");
- window.cbClsExtra = NULL;
- window.cbSize = sizeof(WNDCLASSEX);
- window.cbWndExtra = NULL;
- window.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
- window.hCursor = LoadCursor(NULL, IDC_CROSS );//IDC_ARROW
- window.hIcon = LoadIcon(NULL, IDI_APPLICATION);
- window.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
- window.hInstance = hInstance;
- window.lpfnWndProc = WndProc;
- window.lpszClassName = Class_Name;
- window.lpszMenuName = 0;
- window.style = CS_HREDRAW | CS_VREDRAW;
- if (!RegisterClassEx(&window)) {
- MessageBox(NULL, TEXT("Błąd rejestracji okna"), TEXT("Błąd"), MB_ICONEXCLAMATION);
- return 0;
- }
- HWND hwnd = CreateWindowEx(WS_EX_WINDOWEDGE, Class_Name, Title, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, WND_WID, WND_HEI, NULL, NULL, hInstance, NULL);
- if (hwnd == NULL) {
- MessageBox(NULL, TEXT("Błąd tworzenia okna"), TEXT("Błąd"), MB_ICONEXCLAMATION);
- UnregisterClass(Class_Name, hInstance);
- return 0;
- }
- ShowWindow(hwnd, nCmdShow);
- UpdateWindow(hwnd);
- AddElements(hwnd); // To dodac do szablonu MAINA
- while (GetMessage(&msg, NULL, 0, 0)) {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- if (!UnregisterClass(Class_Name, hInstance)) {
- MessageBox(NULL, TEXT("Błąd niszczenia okna"), TEXT("Błąd"), MB_ICONEXCLAMATION);
- return 0;
- }
- return (int)msg.wParam;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement