#include "stdafx.h"
#include "Win32figurki.h"
#include "Commdlg.h"
#include<Windows.h>
#include <commdlg.h>
#include<stdio.h>
#define MAX_LOADSTRING 100
#define MAX 255
#define MIN 0
// Global Variables:
HINSTANCE hInst; // current instance
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name
// Forward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
void InitOpenfilenameStructure(OPENFILENAME&);
INT_PTR CALLBACK Dialog(HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: Place code here.
MSG msg;
HACCEL hAccelTable;
// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_WIN32FIGURKI, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32FIGURKI));
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
//
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32FIGURKI));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_WIN32FIGURKI);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassEx(&wcex);
}
//
// FUNCTION: InitInstance(HINSTANCE, int)
//
// PURPOSE: Saves instance handle and creates main window
//
// COMMENTS:
//
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_VSCROLL,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//
// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc,hdc1;
static POINT center{ 150, 150 };
static int R = 50;
static POINT lstPoint, curPoint;
static bool isHit = false;
static bool frectangl = false;
static RECT rect;
static int a = 50, b = 100, c = 70, d, l, u, n;
static int pnx = 50, pny = 50, pen = 200;
static HPEN hpen=0, hpen2,hpen3;
//static int q = 20, q1_right = 1000, q2_bottom = 450;
//palitra
static CHOOSECOLOR cc,aa,kk;
static DWORD rgbCurrent;
static HBRUSH hBrush,hBrush1;
static bool gres = FALSE;
static COLORREF color[16], k = RGB(0, 0, 0), s = RGB(255, 255, 255), lk = RGB(0, 0, 0);
HWND hwndDiolog;
static int iHatch =HS_BDIAGONAL;
static int iStyle = 0;
HCURSOR cur=0;
static OPENFILENAME openDlg, saveDlg;
static HANDLE hFile;
static TCHAR buf[BUFSIZ] = { 0 };
static DWORD Out = 0;
static HWND hGreenScroll;
HINSTANCE hInstance = 0;
static int nxPos = 128, xPos;
RECT Rect, Client,rect1;
int num[10];
static int tec;
switch (message)
{
case WM_CREATE:
hGreenScroll = CreateWindow(LPCWSTR("scrollbar"), NULL,
WS_CHILD | WS_VISIBLE | SBS_HORZ, 20, 160, 200, 25,
hWnd, (HMENU)-1, hInstance, NULL);
break;
case WM_SIZE:
GetClientRect(hWnd, &rect);
break;
case WM_LBUTTONDOWN:
curPoint.x = LOWORD(lParam);
curPoint.y = HIWORD(lParam);
d = LOWORD(lParam);
l = HIWORD(lParam);
if (((center.x - curPoint.x)*(center.x - curPoint.x) - (center.y - curPoint.y)*(center.y - curPoint.y) <= R*R) || ((d>a) && (d<a + c) && (l>b) && (l<b + c)) ||((d<=pnx)&&(l<=pny)&&(d>=pnx+pen)&&(l>=pnx+pen)))
{
isHit = true;
SetCursor(cur);
//frectangl = true;
//hBrush = CreateSolidBrush(RGB(g, r, b));
//MessageBox(hWnd, _T("LOVE"), NULL, MB_OK);
}
//MessageBox(hWnd, _T("LOVE"), NULL, MB_OK);
break;
case WM_LBUTTONUP:
if (isHit){
isHit = false;
}
/*if (frectangl)
frectangl = false;*/
break;
/*case WM_RBUTTONDOWN:
curPoint.x = LOWORD(lParam);
curPoint.y = HIWORD(lParam); */
case WM_MOUSEMOVE:
{
curPoint.x = LOWORD(lParam);
curPoint.y = HIWORD(lParam);
d = LOWORD(lParam);
l = HIWORD(lParam);
if (isHit)
{
int dx = curPoint.x - lstPoint.x;
int dy = curPoint.y - lstPoint.y;
if (((center.x - R + dx >= rect.left + 20 && center.x + R + dx <= rect.right - 20) && (center.y - R + dy >= rect.top + 20 && center.y + R + dy <= rect.bottom - 100))
&& ((a + (d - u) > rect.left+20) && (b + (l - n) >rect.top+20) && (a + c + (d - u) <= rect.right-20 && (b + c + (l - n) <= rect.bottom-20))&& ((pnx + (d - u) > rect.left-20) && (pny + (l - n) >rect.top+20) && (pnx+ pen + (d - u) <= rect.right-20) && (pny + pen + (l - n) <= rect.bottom-100))))
{
center.x += dx;
center.y += dy;
a += (d - u);
b += (l - n);
pnx += (d - u);
pny += (l - n);
//InvalidateRect(hWnd, &rect, TRUE);
InvalidateRect(hWnd, NULL, TRUE);
}
lstPoint = curPoint;
//if (frectangl)
//if ((a + (d - u) > rect.left) && (b + (l - n) > rect.top) && (a + c + (d - u) <= rect.right && (b + c + (l - n) <= rect.bottom)))
//{
/*a += (d - u);
b += (l - n);
InvalidateRect(hWnd, NULL, TRUE);
}*/
//}
u = d;
n = l;
}
}
break;
case WM_KEYUP:
switch (wParam)
{
case VK_ADD:
if (((center.x - R - 50 >= rect.left - 20 && center.x + R + 50 <= rect.right + 20) && (center.y - R - 50 >= rect.top + 20 && center.y + R + 50 <= rect.bottom - 100)) && ((a - 50 > rect.left - 20) && (b - 50 > rect.top + 20) && (a + c + 50 <= rect.right + 20 && (b + c + 50 <= rect.bottom - 100))) && ((pnx - 50 > rect.left - 20) && (pny - 50 > rect.top + 20) && (pnx + pen + 50 <= rect.right + 20 && (pny + pen + 50 <= rect.bottom - 100))))
{
R += 50;
c += 50;
pen += 50;
InvalidateRect(hWnd, &rect, TRUE);
}
else{
hGreenScroll = CreateWindow(LPCWSTR("scrollbar"), NULL,
WS_CHILD | WS_VISIBLE | SBS_HORZ, 20, 160, 200, 25,
hWnd, (HMENU)-1, hInstance, NULL);
//SetScrollRange((HWND)lParam, SB_CTL, MIN, MAX, 0);
//SetScrollPos(hGreenScroll, SB_CTL, nxPos, TRUE);
}
//MessageBox(hWnd, _T("Invalid zoom"), _T("Zomm Error"), MB_OK | MB_ICONERROR);
break;
case VK_SUBTRACT:
//if ((R - 50) && (c - 50) && (pen - 50))
//{
R -= 50;
c -= 50;
pen -= 50;
InvalidateRect(hWnd, &rect, TRUE);
//}
//else
//MessageBox(hWnd, _T("Invalid zoom"), _T("Zomm Error"), MB_OK | MB_ICONERROR);
break;
}
break;
case WM_VSCROLL:
{
wmId = LOWORD(wParam);
switch (wmId)
{
case SB_LINEDOWN:
tec = GetScrollPos(hWnd, SB_VERT);
if (tec != 0 && tec != 255){
tec += 10;
SetScrollPos(hWnd, SB_VERT, tec, TRUE);
ScrollWindow(hWnd, 0, 50, &rect, NULL);
}
break;
case SB_LINEUP:
tec = GetScrollPos(hWnd, SB_VERT);
if (tec != 0 && tec != 255){
tec -= 10;
SetScrollPos(hWnd, SB_VERT, tec, TRUE);
ScrollWindow(hWnd, 0, 50, &rect, NULL);
}
break;
}
break;
}
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case ID_COLOR_COLOR:
ZeroMemory(&cc, sizeof(cc));
cc.lStructSize = sizeof(cc);
cc.hwndOwner = hWnd;
cc.lpCustColors = color;
cc.rgbResult = RGB(0, 0, 0);
if (ChooseColor(&cc))
{
//hBrush = CreateSolidBrush(cc.rgbResult);
//hpen = CreateSolidBrush(cc.rgbResult);
rgbCurrent = cc.rgbResult;
k = cc.rgbResult;
gres = true;
InvalidateRect(hWnd, NULL, TRUE);
}
break;
case ID_COLOR_COLOR32777:
ZeroMemory(&aa, sizeof(aa));
aa.lStructSize = sizeof(CHOOSECOLOR);
aa.hwndOwner = NULL;
aa.lpCustColors = color;
aa.rgbResult = RGB(0, 0, 0);
if (ChooseColor(&aa))
{
//hBrush = CreateSolidBrush(aa.rgbResult);
//hpen = CreateSolidBrush(cc.rgbResult);
rgbCurrent = aa.rgbResult;
s = aa.rgbResult;
gres = true;
InvalidateRect(hWnd, NULL, TRUE);
}
break;
case ID_COLOR_COLOR32792:
ZeroMemory(&kk, sizeof(kk));
kk.lStructSize = sizeof(CHOOSECOLOR);
kk.hwndOwner = NULL;
kk.lpCustColors = color;
kk.rgbResult = RGB(0, 0, 0);
if (ChooseColor(&kk))
{
//hBrush = CreateSolidBrush(aa.rgbResult);
//hpen = CreateSolidBrush(cc.rgbResult);
rgbCurrent = kk.rgbResult;
lk = kk.rgbResult;
gres = true;
InvalidateRect(hWnd, NULL, TRUE);
}
break;
case ID_HATCH_1:
iHatch = HS_BDIAGONAL;
//hBrush1 = CreateHatchBrush(PS_DASHDOT, s);
InvalidateRect(hWnd, NULL, TRUE);
break;
case ID_HATCH_2:
iHatch = PS_COSMETIC;
InvalidateRect(hWnd, NULL, TRUE);
break;
case ID_HATCH_3:
iHatch = PS_DASH;
InvalidateRect(hWnd, NULL, TRUE);
break;
case ID_HATCH_4:
iHatch = PS_DASHDOTDOT;
InvalidateRect(hWnd, NULL, TRUE);
break;
case ID_HATCH_5:
iHatch = PS_DOT;
InvalidateRect(hWnd, NULL, TRUE);
break;
case ID_STYLE_1:
iStyle = HS_BDIAGONAL;
InvalidateRect(hWnd, NULL, TRUE);
break;
case ID_STYLE_2:
iStyle = PS_DASHDOTDOT;
InvalidateRect(hWnd, NULL, TRUE);
break;
case ID_STYLE_3:
iStyle = PS_DASH;
InvalidateRect(hWnd, NULL, TRUE);
break;
case ID_STYLE_4:
iStyle = PS_DOT;
InvalidateRect(hWnd, NULL, TRUE);
break;
case ID_CURCOR_ARROW:
SetClassLong(hWnd, GCL_HCURSOR, (LONG)LoadCursor(NULL, IDC_ARROW));
break;
case ID_CURCOR_WAIT:
SetClassLong(hWnd, GCL_HCURSOR, (LONG)LoadCursor(NULL, IDC_WAIT));
break;
case ID_CURCOR_SIZEALL:
SetClassLong(hWnd, GCL_HCURSOR, (LONG)LoadCursor(NULL, IDC_SIZEALL));
break;
case ID_CURCOR_HELP:
SetClassLong(hWnd, GCL_HCURSOR, (LONG)LoadCursor(NULL, IDC_HELP));
break;
case ID_CURCOR_NO:
SetClassLong(hWnd, GCL_HCURSOR, (LONG)LoadCursor(NULL, IDC_NO));
break;
case ID_ZOOM_IN:
if (((center.x - R -50 >= rect.left-20 && center.x + R + 50 <= rect.right+20) && (center.y - R -50 >= rect.top+20 && center.y + R + 50 <= rect.bottom-100)) && ((a -50 > rect.left-20) && (b -50 > rect.top+20) && (a + c + 50 <= rect.right+20 && (b + c + 50 <= rect.bottom-100))) && ((pnx -50 > rect.left-20) && (pny -50 > rect.top+20) && (pnx + pen + 50 <= rect.right+20 && (pny + pen + 50 <= rect.bottom-100))))
{
R += 50;
c += 50;
pen += 50;
InvalidateRect(hWnd, &rect, TRUE);
}
else{
hGreenScroll = CreateWindow(LPCWSTR("scrollbar"), NULL,
WS_CHILD | WS_VISIBLE | SBS_HORZ, 20, 160, 200, 25,
hWnd, (HMENU)-1, hInstance, NULL);
SetScrollRange((HWND)lParam, SB_CTL, MIN, MAX, 0);
SetScrollPos(hGreenScroll, SB_CTL, nxPos, TRUE);
}
//MessageBox(hWnd, _T("Invalid zoom"), _T("Zomm Error"), MB_OK | MB_ICONERROR);
break;
case ID_ZOOM_OUT:
//if ((R - 50) &&(c-50) && (pen-50))
//{
R -= 50;
c -= 50;
pen -= 50;
InvalidateRect(hWnd, &rect, TRUE);
//}
//else
//MessageBox(hWnd, _T("Invalid zoom"), _T("Zomm Error"), MB_OK | MB_ICONERROR);
break;
case ID_DIALOGS_MODAL:
DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, Dialog);
break;
case ID_DIALOGS_NOMODAL:
hwndDiolog = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG2), hWnd, Dialog);
ShowWindow(hwndDiolog, SW_SHOW);
break;
case ID_FILE_OPEN:
InitOpenfilenameStructure(openDlg);
GetOpenFileName(&openDlg);
break;
case ID_FILE_SAVE:
hFile = CreateFile(_T("out.txt"), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
MessageBox(hWnd, _T("Error"), _T("Error"), MB_OK);
break;
}
wsprintf(buf, _T("center:%d r: %d a:%d b:%d c:%d pnx:%d pny:%d pen:%d iHatch:%d iStyle:%d %d"),center,R, a, b, c, pnx, pny, pen, iHatch, iStyle);
WriteFile(hFile, buf, lstrlenW(buf)*2, &Out, NULL);
CloseHandle(hFile);
break;
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
GetClientRect(hWnd, &rect);
hpen2 = CreatePen(0, 1, lk);
SelectObject(hdc, hpen2);
Rectangle(hdc, rect.left + 20, rect.top+20, rect.right - 20, rect.bottom - 20);
Rectangle(hdc, rect.right - 459, rect.bottom - 100, rect.right - 20, rect.bottom - 20);
MoveToEx(hdc, rect.right - 458, rect.bottom - 55, NULL);//установим положение пера начало,куда поставили точку и рисовать будет между точками,а не точки
LineTo(hdc, rect.right - 20, rect.bottom - 55);
TextOut(hdc, rect.right- 300, rect.bottom -80, _T("Hello world ,LOVE,PEACE"), sizeof("Hello world,LOVE,PEACE"));
TextOut(hdc, rect.right - 300, rect.bottom - 40, _T("Романенко Елена,3инт-002"), sizeof("Романенко Елена,3инт-002"));
/*if (gres)//palitra
{
SelectObject(hdc, hBrush);
}
//SelectObject(hdc, hBrush1);
SelectObject(hdc, hpen);*/
hpen = CreatePen(iStyle, 1, k);//1-толщина,PS-сталь
SelectObject(hdc, hpen);
hBrush = CreateHatchBrush(iHatch, s);
SelectObject(hdc, hBrush);
Ellipse(hdc, center.x - R, center.y - R, center.x + R, center.y + R);
//hpen2 = CreatePen(PS_DASH, 1, k);
//SelectObject(hdc, hpen2);
//hBrush1 = CreateHatchBrush(iHatch, s);//shtrixovka
//SelectObject(hdc, hBrush1);
Rectangle(hdc, a, b, a + c, b + c);
//hpen3 = CreatePen(PS_DASHDOT, 1,k);
//SelectObject(hdc, hpen3);
MoveToEx(hdc, pnx, pny, NULL);//установим положение пера начало,куда поставили точку и рисовать будет между точками,а не точки
LineTo(hdc,pnx+ pen, pny+pen);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Message handler for about box.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
INT_PTR CALLBACK Dialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
{
switch (LOWORD(wParam)){
//if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
case IDOK:{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE; }
case IDCANCEL:
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
case IDC_BUTTON1:
MessageBox(hDlg, _T("nazhali knopky"), NULL, MB_OK);
}
break;
}
}
return (INT_PTR)FALSE;
}
void InitOpenfilenameStructure(OPENFILENAME& dialog)
{
dialog.lStructSize = sizeof(OPENFILENAME);
dialog.hwndOwner = NULL;
dialog.hInstance = NULL;
dialog.lpstrFilter = NULL;
dialog.lpstrCustomFilter = NULL;
dialog.nMaxCustFilter = 0;
dialog.nFilterIndex = 1;
dialog.lpstrFile = NULL;
dialog.nMaxFile = _MAX_PATH;
dialog.lpstrFileTitle = NULL;
dialog.nMaxFileTitle = _MAX_FNAME + _MAX_EXT;
dialog.lpstrInitialDir = NULL;
dialog.lpstrTitle = NULL;
dialog.Flags = 0;
dialog.nFileOffset = 0;
dialog.nFileExtension = 0;
dialog.lpstrDefExt = NULL;
dialog.lCustData = 0L;
dialog.lpfnHook = NULL;
dialog.lpTemplateName = NULL;
dialog.lpstrFile = new TCHAR[BUFSIZ];
dialog.lpstrFile[0] = 0;
}