Добавил:
sergey123
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
// tpadDlg.cpp : implementation file
//
#include "stdafx.h"
#include "tpad.h"
#include "tpadDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// Dialog Data
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
// Implementation
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CtpadDlg dialog
CtpadDlg::CtpadDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CtpadDlg::IDD, pParent)
, leftdown(false)
, rightdown(false)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CtpadDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CtpadDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_MOUSEMOVE()
ON_WM_RBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_RBUTTONUP()
ON_WM_NCRBUTTONUP()
END_MESSAGE_MAP()
// CtpadDlg message handlers
BOOL CtpadDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CtpadDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CtpadDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
// The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CtpadDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CTouchpadDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
leftdown=true;
CDialogEx::OnLButtonDown(nFlags, point);
}
void CTouchpadDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
leftdown=false;
if(N<=15){
MessageBox(L"Line is too short",L"Error", MB_ICONERROR);
}
else{
//проверка на прямую горизонтальную линию... - фигня, надо что-то другое
for(i=0;i<N;i++){
if(_y[i]<_y[0]+15 && _y[i]>_y[0]-15){
flag=1;
}
else{
flag=0;
break;
}
}
if(flag==1){
MessageBox(L"Line 0 deg",L"I recognised it!");
}
if(flag==0){//проверка на прямую вертикальную линию... - аналогично...
for(i=0;i<N;i++){
if(_x[i]<_x[0]+15 && _x[i]>_x[0]-15){
flag=2;
}
else{
flag=0;
break;
}
}
}
if(flag==2){
MessageBox(L"Line 90 deg",L"I recognised it!");
}
if(flag==0){//проверка на прямую - 45 градусов
long x_s=_x[0];
long y_s=_y[0];
for(i=1;i<N;i=i+N/3){
long x0=_x[i]-x_s;
long y0=_y[i]-y_s;
if(x0+y0<=15 && x0+y0>=-15) flag=3;
else{
flag=0;
break;
}
}
}
if(flag==3){
MessageBox(L"Line 45 deg",L"I recognised it!");
}
if(flag==0){//проверка на прямую - 135 градусов
long x_s=_x[0];
long y_s=_y[0];
for(i=1;i<N;i=i+N/3){
long x0=_x[i]-x_s;
long y0=_y[i]-y_s;
if(x0-y0<=15 && x0-y0>=-15) flag=4;
else{
flag=0;
break;
}
}
}
if(flag==4){
MessageBox(L"Line 135 deg",L"I recognised it!");
}
if(flag==0){//проверка на галочку...
int M=N/2;
if((abs((_x[N-1]+_x[0])/2-_x[M]))<20 && abs(_y[N-1]-_y[0])<=10 && abs(_y[N-1]-_y[0])>=-10 && abs(_x[N-1]-_x[0])>abs(_x[N-1]-_x[M])){ //подумать над алгоритмом - FUCK YEAH!! ME GUSTA!!!
if(_y[M]>_y[0]) flag=6;
else flag=5;
}
}
if(flag==5){
MessageBox(L"Tick up",L"I recognised it!");
}
else if(flag==6){
MessageBox(L"Tick down",L"I recognised it!");
}
if(flag==0){ //проверка на окружность
//находим крайние точки предполагаемой окружности...
long xl,xr,yu,yd;
xl=xr=_x[0];
yu=yd=_y[0];
for(i=1;i<N;i++){
if(_y[i]<yu) yu=_y[i];
else if (_y[i]>yd) yd=_y[i];
if(_x[i]<xl) xl=_x[i];
else if (_x[i]>xr) xr=_x[i];
}
long xc=(xr+xl)/2;
long yc=(yu+yd)/2;
long r=xc;
for(i=1;i<N;i=i+N/3){
long x0=_x[i]-xc;
long y0=_y[i]-yc;
if((x0*x0+y0*y0<=(r+5)*(r+5))&&(x0*x0+y0*y0<=(r-10)*(r-10))&&(abs(_x[0]-_x[N-1])<=20)&&(abs(_y[0]-_y[N-1])<=20)) flag=7;
else{
flag=0;
break;
}
}
}
if(flag==7){
MessageBox(L"Circle",L"I recognised it!");
}
if(flag==0){
MessageBox(L"I don't understand",L"I don't recognised it");
}
}
flag=0;
i=0;
N=0;
CDialogEx::OnLButtonUp(nFlags, point);
}
void CTouchpadDlg::OnMouseMove(UINT nFlags, CPoint point)
{
CClientDC dc(this);// получаем контекст устройства для рисования
CPen pen; // создаем инструмент для рисования …
pen.CreatePen(PS_SOLID,5,RGB(0,0,0)); // … с заданными свойствами
dc.SelectObject(&pen); // выбираем инструмент для рисования
if(leftdown){
dc.MoveTo(point.x,point.y); //установка графического курсора
dc.LineTo(point.x,point.y); //линия от курсора в заданную точку
_x[i]=point.x;
_y[i]=point.y;
i++;
N++;
}
CDialogEx::OnMouseMove(nFlags, point);
}
void CTouchpadDlg::OnBnClickedButton1()
{
CClientDC dc(this);
CBrush brush;
brush.CreateSolidBrush(RGB(255, 255, 255));
dc.SelectObject(&brush);
RECT crect;
crect.left=0;
crect.right=500;
crect.top=0;
crect.bottom=500;
FillRect(dc,&crect, brush);
}