//Dichiarazione librerie
#include <windows.h>
#include <Windowsx.h>
#include <commctrl.h>
#include <cmath>
#include <cstring>
//Dichiarazioni per visual style (grafica win 7)
#pragma comment( lib, "comctl32.lib")
#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
//Fine Dichiarazioni...
//Namespace:
using namespace std;
//Dichiarazione variabili globali:
//Class Name
static char g_szClassName[] = "MainWindow",name[]="CurveWindow",name3[]="SettingWindow";
static HINSTANCE g_hInst = NULL;
//Timer
const UINT idTimer1 = 1;
UINT nTimerDelay = 1;
//Bitmap
HBITMAP hbmBall, hbmMask,griglia,maskgri;
BITMAP bm;
//Coordinate Punto funzione
int ballX, ballY;
//Variabile che indica se è stato cliccato il tasto disegna nella finestra delle curve
int agg;
//Font dei Caratteri:
RECT rect;
HFONT hfont;
LOGFONT lf;
//Precisione nel disegno delle funzioni
float prec=100;
float preprec; //Se si clicca annulla nella setting window ripristina il valore precedente di prec.
//Progress Bar in Curve Window
HWND prog;
//Dichiarazione della WndProc Della MainWindow
LRESULT CALLBACK WndProc(HWND hwnd ,UINT Message, WPARAM wParam, LPARAM lParam);
//Disegna il punto utilizzato nelle rappresentazioni di cruve e funzioni.
void DrawBall(HDC hdc)
{
HDC hdcMemory;
hdcMemory = CreateCompatibleDC(hdc);
SelectObject(hdcMemory, hbmMask);
BitBlt(hdc, ballX, ballY, bm.bmWidth, bm.bmHeight, hdcMemory, 0, 0, SRCAND);
SelectObject(hdcMemory, hbmBall);
BitBlt(hdc, ballX, ballY, bm.bmWidth, bm.bmHeight, hdcMemory, 0, 0, SRCPAINT);
DeleteDC(hdcMemory);
}
//Disegna la griglia di sfondo
void DrawGriglia(HDC hdc)
{
HDC hdcMemory;
hdcMemory=CreateCompatibleDC(hdc);
SelectObject(hdcMemory, maskgri);
BitBlt(hdc, 0, 0, 1000, 1000, hdcMemory, 0, 0, SRCAND);
SelectObject(hdcMemory, griglia);
BitBlt(hdc, 0, 0, 1000, 1000, hdcMemory, 0, 0, SRCPAINT);
DeleteDC(hdcMemory);
}
//Dichiarazione variabili in WndProc
//Variabili disegno funzione
float i,x,y;
float inc=0.01;
//Variabili Menu:
HMENU file,hfile,info,hinfo,modifica,hmodifica;
int MENU_FILE_EXIT=0; //Valore ritorno se si clicca su "Esci"
int MENU_FILE_CURV=1; //Valore ritorno se si clicca su "Disegna curve"
int MENU_FILE_FUNZ=2; //Valore ritorno se si clicca su "Disegna funzione"
int MENU_FILE_ABOU=3; //Valore ritorno se si clicca su "Informazioni su "Paint XY"
int MENU_FILE_CLEA=6; //Valore ritorno se si clicca su "Pulisci"
int MENU_FILE_SETT=7; //Valore ritorno se si clicca su "Opzioni"
//Variabile che specificano il tipo di curva scelto.
int curva; //retta=1,parabola=2,ellisse=3,iperbole=4,circonferenza=5,parabola(x)=6
//Variabili di lettura degli edit nella finestra delle curve...
char numa[5],numb[5],numc[5];
//...e di converzione di questi:
float a,b,c;
/*Array necessari per ridisegnare le curve nel caso si riduce a icona la finestra...
Gli array memorizzano i vari coefficienti per ogni curva e vengono letti per ridisegnarle.*/
float ca[20],cb[20],cc[20];
float da[20],db[20],dc[20];
float ea[20],eb[20],ec[20];
float fa[20],fb[20],fc[20];
float ga[20],gb[20],gc[20];
float ha[20],hb[20],hc[20];
//Variabili contatrici
int k,l,l2,l3,l4,l5,l6;
/*Variabile che indica se si è già tentato di disegnare la funzione:
Per non rendere troppo pesante l'avvio del programma, il prog inizierà a
ridisegnare le funzioni (se la finestra viene ridotta e riaperta) solo dopo
aver premuto il tasto "disegna" nella CurveWindow.*/
int bo;
LRESULT CALLBACK WndProc(HWND hwnd ,UINT Message, WPARAM wParam, LPARAM lParam)
{
InitCommonControls (); //Applicazione visual style
switch(Message)
{
case WM_CREATE:
//Nella finestra principale:
//Inizializzazione delle immagini BMP
hbmBall = LoadBitmap(g_hInst, "BALLBMP");
griglia = LoadBitmap(g_hInst, "gri");
hbmMask = LoadBitmap(g_hInst, "MASKBMP");
maskgri = LoadBitmap(g_hInst, "maskgri");
if(!hbmBall || !hbmMask)
{
MessageBox(hwnd, "Load of resources failed.", "Error",MB_OK | MB_ICONEXCLAMATION);
return -1;
}
GetObject(hbmBall, sizeof(bm), &bm);
//Timer:
SetTimer(hwnd, idTimer1, nTimerDelay, NULL);
//Menu:
//Dichiarazione Menu:
file=CreateMenu();
hfile=CreatePopupMenu();
info=CreateMenu();
hinfo=CreatePopupMenu();
modifica=CreateMenu();
hmodifica=CreatePopupMenu();
//Creazione Menu:
/*File*/
AppendMenu(file,MF_STRING|MF_POPUP,(UINT_PTR) hfile,TEXT("File"));
AppendMenu(hfile,MF_STRING,MENU_FILE_SETT,TEXT("Impostazioni"));
AppendMenu(hfile,MF_STRING,MENU_FILE_EXIT,TEXT("Esci"));
/*Modifica*/
AppendMenu(file,MF_STRING|MF_POPUP,(UINT_PTR) hmodifica,TEXT("Grafico"));
AppendMenu(hmodifica,MF_STRING,MENU_FILE_CURV,TEXT("Disegna Curve"));
AppendMenu(hmodifica,MF_STRING,MENU_FILE_CLEA,TEXT("Pulisci"));
/*Info*/
AppendMenu(file,MF_STRING|MF_POPUP,(UINT_PTR) hinfo,TEXT("Info"));
AppendMenu(hinfo,MF_STRING,MENU_FILE_ABOU,TEXT("Informazioni su Paint XY"));
//Rende visibile i menu
SetMenu(hwnd,file);
break;
case WM_TIMER:
if(hbmBall && hbmMask)
{
HDC hdcWindow;
hdcWindow = GetDC(hwnd);
//Disegno Curve***********************************************************************
if (agg>0) //Se è stato cliccato il tasto 'disegna' nella fuinestra delle curve
{
agg=0; //reimposta il tasto
i=-10;
while(i<=10)
{
i=i+inc; //inc è l'incremento, modificabile nella setting window
x=i;
SendMessage(prog, PBM_SETPOS, (i+10)*100/20, 0); //Setto la progressBar
if (curva==1) //(retta)
{
a=atof(numa);
b=atof(numb);
c=atof(numc);
if (b!=0)
y=((-c-(a*x))/b);
else //se la retta è parallela all'asse y
{
x=c/a;
y=i;
}
//Converte i numeri in coordinate in pixel:
ballX=ceil(500+(x*50));
ballY=ceil(500-(y*50));
DrawBall(hdcWindow);
}
if (curva==2) //(parabola con asse parallelo all'asse delle y)
{
a=atof(numa);
b=atof(numb);
c=atof(numc);
y=(a*x*x)+(b*x)+c;
//Converte i numeri in coordinate in pixel:
ballX=ceil(500+(x*50));
ballY=ceil(500-(y*50));
DrawBall(hdcWindow);
}
if (curva==3) //(Ellisse)
{
a=atof(numa);
b=atof(numb);
y=sqrt(b*b*(a*a-x*x)/(a*a));
//Converte i numeri in coordinate in pixel:
ballX=ceil(500+(x*50));
ballY=ceil(500-(y*50));
DrawBall(hdcWindow);
y=-sqrt(b*b*(a*a-x*x)/(a*a));
//Converte i numeri in coordinate in pixel:
ballX=ceil(500+(x*50));
ballY=ceil(500-(y*50));
DrawBall(hdcWindow);
}
if (curva==4) //(Iperbole)
{
a=atof(numa);
b=atof(numb);
y=sqrt(b*b*(x*x-a*a)/(a*a));
//Converte i numeri in coordinate in pixel:
ballX=ceil(500+(x*50));
ballY=ceil(500-(y*50));
DrawBall(hdcWindow);
y=-sqrt(b*b*(x*x-a*a)/(a*a));
//Converte i numeri in coordinate in pixel:
ballX=ceil(500+(x*50));
ballY=ceil(500-(y*50));
DrawBall(hdcWindow);
}
if (curva==5) //(Circonferenza)
{
a=atof(numa);
b=atof(numb);
c=atof(numc);
y=b+sqrt((c*c)-((x-a)*(x-a)));
//Converte i numeri in coordinate in pixel:
ballX=ceil(500+(x*50));
ballY=ceil(500-(y*50));
DrawBall(hdcWindow);
y=-b-sqrt((c*c)-((x-a)*(x-a)))+2*b;
//Converte i numeri in coordinate in pixel:
ballX=ceil(500+(x*50));
ballY=ceil(500-(y*50));
DrawBall(hdcWindow);
}
if (curva==6) //(Parabola con asse parallelo all'asse delle x)
{
a=atof(numa);
b=atof(numb);
c=atof(numc);
y=(-b+sqrt(b*b-4*a*c+4*a*x))/2;
//Converte i numeri in coordinate in pixel:
ballX=ceil(500+(x*50));
ballY=ceil(500-(y*50));
DrawBall(hdcWindow);
y=-(-b+sqrt(b*b-4*a*c+4*a*x)+2*b)/2;
//Converte i numeri in coordinate in pixel:
ballX=ceil(500+(x*50));
ballY=ceil(500-(y*50));
DrawBall(hdcWindow);
}
}
}
//Disegno Funzioni:************************************************************************
///
ReleaseDC(hwnd, hdcWindow);
}
break;
case WM_COMMAND:
if (LOWORD(wParam)==MENU_FILE_EXIT)
{
DestroyWindow(hwnd); //Chiudo la finestra
}
if (LOWORD(wParam)==MENU_FILE_CURV)
{
//Crea e visualizza la finestra
MSG messages2;
HWND hwnd2 = CreateWindowEx (0,name,"Curve:",WS_SYSMENU|WS_MINIMIZEBOX|WS_VISIBLE,400,400,400,300,hwnd, NULL, g_hInst,NULL);
ShowWindow (hwnd2, 1);
while (GetMessage (&messages2, NULL, 0, 0))
{
TranslateMessage(&messages2);
DispatchMessage(&messages2);
}
}
if (LOWORD(wParam)==MENU_FILE_ABOU)
{
MessageBox(hwnd,"Paint XY - Versione 1.1","By Stromberg",MB_OK|MB_ICONINFORMATION);
}
if (LOWORD(wParam)==MENU_FILE_CLEA)
{
curva=0;
bo=0;
ShowWindow(hwnd,0);
ShowWindow(hwnd,1);
l=0;l2=0;l3=0;l4=0;l5=0;l6=0; //Azzero le variabili contatrici degli array
}
if (LOWORD(wParam)==MENU_FILE_SETT)
{
//Crea e visualizza la finestra
MSG messages4;
HWND hwnd4 = CreateWindowEx (0,name3,"Impostazioni:",WS_SYSMENU|WS_MINIMIZEBOX|WS_VISIBLE,400,400,390,200,hwnd, NULL, g_hInst,NULL);
ShowWindow (hwnd4, 1);
while (GetMessage (&messages4, NULL, 0, 0))
{
TranslateMessage(&messages4);
DispatchMessage(&messages4);
}
preprec=prec;
}
break;
case WM_PAINT:
if(hbmBall && hbmMask)
{
PAINTSTRUCT ps;
HDC hdcWindow;
hdcWindow = BeginPaint(hwnd, &ps);
DrawGriglia(hdcWindow);
/*******RIDISEGNA LE FUNZIONI SE LA FINESTRA VIENE RIDOTTA/COPERTA*****/
if (bo>0) //Se il prog è appena stato aperto/pulito
for (curva=1;curva<=6;curva++) //Ciclo con tutti i tipi di curva
for (i=-10;i<=10;i=i+inc)
{
x=i;
if (curva==1) //(retta)
{
if (l>0) //Se la curva non è mai stata disegnata, salta il ciclo
for (k=0;k<=l-1;k++) //Verifica tutte le posizioni dell'array e le usa per ridisegnare la funzione
{
a=ca[k];
b=cb[k];
c=cc[k];
if (b!=0)
y=((-c-(a*x))/b);
else //RETTA PARALLELA ALL'ASSE DELLE X
{
x=c/a;
y=i;
}
//Converte i numeri in coordinate in pixel:
ballX=ceil(500+(x*50));
ballY=ceil(500-(y*50));
DrawBall(hdcWindow);
}
}
if (curva==2) //(parabola con asse parallelo all'asse delle y)
{
if (l2>0) //Se la curva non è mai stata disegnata, salta il ciclo
for(k=0;k<=l2-1;k++) //Verifica tutte le posizioni dell'array e le usa per ridisegnare la funzione
{
a=da[k];
b=db[k];
c=dc[k];
y=(a*x*x)+(b*x)+c;
//Converte i numeri in coordinate in pixel:
ballX=ceil(500+(x*50));
ballY=ceil(500-(y*50));
DrawBall(hdcWindow);
}
}
if (curva==3) //(Ellisse)
{
if (l3>0) //Se la curva non è mai stata disegnata, salta il ciclo
for(k=0;k<=l3-1;k++) //Verifica tutte le posizioni dell'array e le usa per ridisegnare la funzione
{
a=ea[k];
b=eb[k];
y=sqrt(b*b*(a*a-x*x)/(a*a));
//Converte i numeri in coordinate in pixel:
ballX=ceil(500+(x*50));
ballY=ceil(500-(y*50));
DrawBall(hdcWindow);
y=-sqrt(b*b*(a*a-x*x)/(a*a));
//Converte i numeri in coordinate in pixel:
ballX=ceil(500+(x*50));
ballY=ceil(500-(y*50));
DrawBall(hdcWindow);
}
}
if (curva==4) //(Iperbole)
{
if (l4>0) //Se la curva non è mai stata disegnata, salta il ciclo
for(k=0;k<=l4-1;k++) //Verifica tutte le posizioni dell'array e le usa per ridisegnare la funzione
{
a=fa[k];
b=fb[k];
y=sqrt(b*b*(x*x-a*a)/(a*a));
//Converte i numeri in coordinate in pixel:
ballX=ceil(500+(x*50));
ballY=ceil(500-(y*50));
DrawBall(hdcWindow);
y=-sqrt(b*b*(x*x-a*a)/(a*a));
//Converte i numeri in coordinate in pixel:
ballX=ceil(500+(x*50));
ballY=ceil(500-(y*50));
DrawBall(hdcWindow);
}
}
if (curva==5) //(Circonferenza)
{
if (l5>0) //Se la curva non è mai stata disegnata, salta il ciclo
for(k=0;k<=l5-1;k++) //Verifica tutte le posizioni dell'array e le usa per ridisegnare la funzione
{
a=ga[k];
b=gb[k];
c=gc[k];
y=b+sqrt((c*c)-((x-a)*(x-a)));
//Converte i numeri in coordinate in pixel:
ballX=ceil(500+(x*50));
ballY=ceil(500-(y*50));
DrawBall(hdcWindow);
y=-b-sqrt((c*c)-((x-a)*(x-a)))+2*b;
//Converte i numeri in coordinate in pixel:
ballX=ceil(500+(x*50));
ballY=ceil(500-(y*50));
DrawBall(hdcWindow);
}
}
if (curva==6) //(Parabola con asse parallelo all'asse delle x)
{
if (l6>0) //Se la curva non è mai stata disegnata, salta il ciclo
for(k=0;k<=l6-1;k++) //Verifica tutte le posizioni dell'array e le usa per ridisegnare la funzione
{
a=ha[k];
b=hb[k];
c=hc[k];
y=(-b+sqrt(b*b-4*a*c+4*a*x))/2;
//Converte i numeri in coordinate in pixel:
ballX=ceil(500+(x*50));
ballY=ceil(500-(y*50));
DrawBall(hdcWindow);
y=-(-b+sqrt(b*b-4*a*c+4*a*x)+2*b)/2;
//Converte i numeri in coordinate in pixel:
ballX=ceil(500+(x*50));
ballY=ceil(500-(y*50));
DrawBall(hdcWindow);
}
}
}
EndPaint(hwnd, &ps);
}
break;
case WM_CLOSE:
if(MessageBox(hwnd,"Vuoi davvero uscire?","Messaggio",MB_YESNO|MB_ICONQUESTION)==IDYES)
DestroyWindow(hwnd);
break;
case WM_DESTROY:
KillTimer(hwnd, idTimer1);
DeleteObject(hbmBall);
DeleteObject(hbmMask);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, Message, wParam, lParam);
}
return 0;
}
//WndProc della finestra per rappresentare le curve
//HBIMAP del pulsante di disegno
HBITMAP bmp=(HBITMAP)LoadImage(0,"draw.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
//HWND DEL PULSANTE DI DISEGNO
HWND paint;
//Variabili HWND:
HWND radpar,radipe,radell,radret,radcir,radparx;
HWND edita,editb,editc,sintax;
//Variabili controllo radiobutton in finestra di disegno curve
int selret,selpar,selipe,selell,selcir,selparx;
//Tooltipe
TOOLINFO ti;
HWND hwtoll;
LRESULT CALLBACK WindowProcedure2 (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
InitCommonControls (); //Applicazione visual style
switch (message)
{
case WM_PAINT:
PAINTSTRUCT ps;
HDC hdcWindow;
hdcWindow = BeginPaint(hwnd, &ps);
/****SETTO I CARATTERI DA UTILIZZARE: FONT, DIMENSIONI ECC...**/
hfont = CreateFont (20,0,0,0, 500, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS,
CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, VARIABLE_PITCH, TEXT ("Monotype Corsiva"));
SelectObject (hdcWindow, hfont);
SetRect (& rect, 100,100,700,200);
SetTextColor (hdcWindow, RGB (0,0,0));
TextOut(hdcWindow,0,0,"Selezionare il tipo di curva ed inserire i parametri.",55);
TextOut(hdcWindow,5,190,"Coefficiente A:",15);
TextOut(hdcWindow,5,215,"Coefficiente B:",15);
TextOut(hdcWindow,5,240,"Coefficiente C:",15);
TextOut(hdcWindow,5,150,"L'equazione è del tipo:",23);
EndPaint(hwnd,&ps);
break;
case WM_CREATE:
//ProgressBar
prog=CreateWindowEx(NULL, PROGRESS_CLASS, NULL, WS_CHILD|WS_VISIBLE, 215,200, 150, 30, hwnd, NULL, NULL, 0);
//Crea radio-button per decidere il tipo di curva:
radret=CreateWindow("Button","Retta",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,0,20,55,20,hwnd,(HMENU) 1,NULL,NULL);
radpar=CreateWindow("Button","Parabola (y)",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,0,45,110,20,hwnd,(HMENU) 2,NULL,NULL);
radipe=CreateWindow("Button","Iperbole",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,0,70,80,20,hwnd,(HMENU) 3,NULL,NULL);
radell=CreateWindow("Button","Ellisse",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,0,95,70,20,hwnd,(HMENU) 4,NULL,NULL);
radcir=CreateWindow("Button","Circonferenza",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,0,120,135,20,hwnd,(HMENU) 5,NULL,NULL);
radparx=CreateWindow("Button","Parabola (x)",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,120,45,110,20,hwnd,(HMENU) 6,NULL,NULL);
//Crea EditBox per inserire i parametri
edita=CreateWindow("Edit","",WS_CHILD|WS_VISIBLE|WS_BORDER,150,190,50,20,hwnd,NULL,NULL,NULL);
editb=CreateWindow("Edit","",WS_CHILD|WS_VISIBLE|WS_BORDER,150,215,50,20,hwnd,NULL,NULL,NULL);
editc=CreateWindow("Edit","",WS_CHILD|WS_VISIBLE|WS_BORDER,150,240,50,20,hwnd,NULL,NULL,NULL);
//Crea EditBox per mostrare la sintassi di una cura selezionata
sintax=CreateWindow("Edit","",WS_CHILD|WS_VISIBLE|WS_BORDER|ES_READONLY,200,150,190,20,hwnd,NULL,NULL,NULL);
//Crea il pulsante che permette di disegnare la curva selezionata.
paint=CreateWindow("Button","",WS_VISIBLE|WS_CHILD|BS_BITMAP|WS_BORDER,295,35,83,83,hwnd,(HMENU) 7, NULL,NULL);
SendMessage(paint,BM_SETIMAGE,IMAGE_BITMAP,(LPARAM)bmp);
/****SETTO I CARATTERI DA UTILIZZARE: FONT, DIMENSIONI ECC...**/
GetObject (GetStockObject(DEFAULT_GUI_FONT), sizeof(LOGFONT), &lf);
hfont = CreateFont (20,0,0,0, 500, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS,
CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, VARIABLE_PITCH, TEXT ("Monotype Corsiva"));
SendMessage (edita, WM_SETFONT, (WPARAM) hfont, true);
SendMessage (editb, WM_SETFONT, (WPARAM) hfont, true);
SendMessage (editc, WM_SETFONT, (WPARAM) hfont, true);
SendMessage (radret, WM_SETFONT, (WPARAM) hfont, true);
SendMessage (radpar, WM_SETFONT, (WPARAM) hfont, true);
SendMessage (radipe, WM_SETFONT, (WPARAM) hfont, true);
SendMessage (radell, WM_SETFONT, (WPARAM) hfont, true);
SendMessage (radcir, WM_SETFONT, (WPARAM) hfont, true);
SendMessage (radparx, WM_SETFONT, (WPARAM) hfont, true);
SendMessage (sintax, WM_SETFONT, (WPARAM) hfont, true);
/*TOOLTIP*/
hwtoll=CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL,WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,0,0,0,0,paint, NULL, NULL,NULL);
SetWindowPos (hwtoll, HWND_TOPMOST, 0, 0, 0, 0,SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
GetClientRect (paint, &rect);
////////////////////////////////// FORMATTAZIONE TOOLTIP
ti.cbSize = sizeof(TOOLINFO);
ti.uFlags = TTF_SUBCLASS;
ti.hwnd = paint;
ti.hinst = NULL;
ti.uId = 0;
ti.lpszText = "Disegna!";
ti.rect.left = rect.left;
ti.rect.top = rect.top;
ti.rect.right = rect.right;
ti.rect.bottom = rect.bottom;
//////////////////////////////////
SendMessage(hwtoll, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
break;
case WM_COMMAND:
if (LOWORD(wParam)==1)
{
SetWindowText(sintax,"Ax+By+C=0"); //Mostro la sintassi della curva
Edit_Enable(editc,TRUE); //Abilita l'edit relativo al coefficiente C poichè contenuto nella sintassi dell'equazione
}
if (LOWORD(wParam)==2)
{
SetWindowText(sintax,"Ax²+Bx+C=y"); //Mostro la sintassi della curva
Edit_Enable(editc,TRUE);
}
if (LOWORD(wParam)==3)
{
SetWindowText(sintax,"(x²/A²)-(y²/B²)=1"); //Mostro la sintassi della curva
Edit_Enable(editc,FALSE); //DisAbilita l'edit relativo al coefficiente C poichè Non contenuto nella sintassi dell'equazione
}
if (LOWORD(wParam)==4)
{
SetWindowText(sintax,"(x²/A²)+(y²/B²)=1"); //Mostro la sintassi della curva
Edit_Enable(editc,FALSE);
}
if (LOWORD(wParam)==5)
{
SetWindowText(sintax,"(x-A)²+(y-B)²=C²"); //Mostro la sintassi della curva
Edit_Enable(editc,TRUE);
}
if (LOWORD(wParam)==6)
{
SetWindowText(sintax,"Ay²+By+C=x"); //Mostro la sintassi della curva
Edit_Enable(editc,TRUE);
}
if (LOWORD(wParam)==7)
{
bo++;
//Controllo stato radiobutton
selret=SendMessage(radret,BM_GETCHECK,0,0);
selpar=SendMessage(radpar,BM_GETCHECK,0,0);
selell=SendMessage(radell,BM_GETCHECK,0,0);
selipe=SendMessage(radipe,BM_GETCHECK,0,0);
selcir=SendMessage(radcir,BM_GETCHECK,0,0);
selparx=SendMessage(radparx,BM_GETCHECK,0,0);
//Nel caso sia selezionato il radiobutton....
if (selret==BST_CHECKED)
{
agg++; //Incremento la variabile che permette alla WM_TIMER in MainWindow di disegnare la curva
GetWindowText(edita,numa,5); //Leggi il valore del paramtero a
GetWindowText(editb,numb,5); //Leggi il valore del paramtero b
GetWindowText(editc,numc,5); //Leggi il valore del paramtero c
curva=1; //Curva 1 Vuol dire retta
//Memorizza nell'array i vari valori dei coefficianti così da ridisegnarli
ca[l]=atof(numa);
cb[l]=atof(numb);
cc[l]=atof(numc);
l++;
}
if (selpar==BST_CHECKED)
{
agg++; //Incremento la variabile che permette alla WM_TIMER in MainWindow di disegnare la curva
GetWindowText(edita,numa,5); //Leggi il valore del paramtero a
GetWindowText(editb,numb,5); //Leggi il valore del paramtero b
GetWindowText(editc,numc,5); //Leggi il valore del paramtero c
curva=2; //Curva 2 Vuol dire parabola
//Memorizza nell'array i vari valori dei coefficianti così da ridisegnarli
da[l2]=atof(numa);
db[l2]=atof(numb);
dc[l2]=atof(numc);
l2++;
}
if (selell==BST_CHECKED)
{
agg++; //Incremento la variabile che permette alla WM_TIMER in MainWindow di disegnare la curva
GetWindowText(edita,numa,5); //Leggi il valore del paramtero a
GetWindowText(editb,numb,5); //Leggi il valore del paramtero b
curva=3; //Curva 3 Vuol dire ellisse
//Memorizza nell'array i vari valori dei coefficianti così da ridisegnarli
ea[l3]=atof(numa);
eb[l3]=atof(numb);
l3++;
}
if (selipe==BST_CHECKED)
{
agg++; //Incremento la variabile che permette alla WM_TIMER in MainWindow di disegnare la curva
GetWindowText(edita,numa,5); //Leggi il valore del paramtero a
GetWindowText(editb,numb,5); //Leggi il valore del paramtero b
curva=4; //Curva 4 Vuol dire iperbole
//Memorizza nell'array i vari valori dei coefficianti così da ridisegnarli
fa[l4]=atof(numa);
fb[l4]=atof(numb);
l4++;
}
if (selcir==BST_CHECKED)
{
agg++; //Incremento la variabile che permette alla WM_TIMER in MainWindow di disegnare la curva
GetWindowText(edita,numa,5); //Leggi il valore del paramtero a
GetWindowText(editb,numb,5); //Leggi il valore del paramtero b
GetWindowText(editc,numc,5); //Leggi il valore del paramtero c
curva=5; //Curva 5 Vuol dire circonferenza
//Memorizza nell'array i vari valori dei coefficianti così da ridisegnarli
ga[l5]=atof(numa);
gb[l5]=atof(numb);
gc[l5]=atof(numc);
l5++;
}
if (selparx==BST_CHECKED)
{
agg++; //Incremento la variabile che permette alla WM_TIMER in MainWindow di disegnare la curva
GetWindowText(edita,numa,5); //Leggi il valore del paramtero a
GetWindowText(editb,numb,5); //Leggi il valore del paramtero b
GetWindowText(editc,numc,5); //Leggi il valore del paramtero c
curva=6; //Curva 6 Vuol dire parabola con asse parallello all'asse x
//Memorizza nell'array i vari valori dei coefficianti così da ridisegnarli
ha[l6]=atof(numa);
hb[l6]=atof(numb);
hc[l6]=atof(numc);
l6++;
}
if((selret!=BST_CHECKED) && (selpar!=BST_CHECKED) && (selipe!=BST_CHECKED) && (selell!=BST_CHECKED) && (selcir!=BST_CHECKED) && (selparx!=BST_CHECKED)) //Se non è selezionata alcuna curva:
{
MessageBox(hwnd,"Selezionare una curva","Avviso!",MB_OK);
}
}
break;
case WM_DESTROY:
PostQuitMessage (0);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
//VARIABILI:
//HWND della finestra:
HWND hwndTrack,sinistra,destra,save,cancel;
//WndProc della finestra delle Impostazioni.
LRESULT CALLBACK WindowProcedure4 (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
InitCommonControls (); //Applicazione visual style
switch(message)
{
case WM_CREATE:
//Salva-Annulla
save=CreateWindow("Button","Salva",WS_VISIBLE|WS_CHILD,10,140,80,30,hwnd,(HMENU) 5,NULL,NULL);
cancel=CreateWindow("Button","Annulla",WS_VISIBLE|WS_CHILD,300,140,80,30,hwnd,(HMENU) 6,NULL,NULL);
//TrackBar
hwndTrack = CreateWindowEx(0,TRACKBAR_CLASS,"Trackbar Control",WS_CHILD|WS_VISIBLE|TBS_AUTOTICKS|TBS_ENABLESELRANGE,
100,25,120,30,hwnd,(HMENU)3,NULL,NULL);
//Static
sinistra=CreateWindow("STATIC", "Approssimativo", WS_CHILD | WS_VISIBLE,0, 0, 100, 30,hwnd, (HMENU)1, NULL, NULL);
destra=CreateWindow("STATIC", "Preciso", WS_CHILD | WS_VISIBLE,0, 0, 80, 30,hwnd, (HMENU)2, NULL, NULL);
//Configuro la TrackBar
SendMessage(hwndTrack, TBM_SETRANGE, TRUE, MAKELONG(100, 1000)); //Gradazione
SendMessage(hwndTrack, TBM_SETPAGESIZE, 0, 20);
SendMessage(hwndTrack, TBM_SETTICFREQ, 100, 0); //DensitÃ
SendMessage(hwndTrack, TBM_SETPOS, FALSE, prec); //Posizione iniziale
SendMessage(hwndTrack, TBM_SETBUDDY, TRUE, (LPARAM) sinistra); //Static di riferimento sinistro
SendMessage(hwndTrack, TBM_SETBUDDY, FALSE, (LPARAM) destra); //Static di riferimento destro
/****SETTO I CARATTERI DA UTILIZZARE: FONT, DIMENSIONI ECC...**/
GetObject (GetStockObject(DEFAULT_GUI_FONT), sizeof(LOGFONT), &lf);
hfont = CreateFont (20,0,0,0, 500, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS,
CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, VARIABLE_PITCH, TEXT ("Monotype Corsiva"));
SendMessage(save,WM_SETFONT,(WPARAM) hfont,true);
SendMessage(cancel,WM_SETFONT,(WPARAM) hfont,true);
SendMessage(sinistra,WM_SETFONT,(WPARAM) hfont,true);
SendMessage(destra,WM_SETFONT,(WPARAM) hfont,true);
break;
case WM_PAINT:
PAINTSTRUCT ps;
HDC hdcWindow;
hdcWindow = BeginPaint(hwnd, &ps);
/****SETTO I CARATTERI DA UTILIZZARE: FONT, DIMENSIONI ECC...**/
hfont = CreateFont (22,0,0,0, 500, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS,
CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, VARIABLE_PITCH, TEXT ("Monotype Corsiva"));
SelectObject (hdcWindow, hfont);
SetRect (& rect, 100,100,700,200);
SetTextColor (hdcWindow, RGB (0,0,0));
TextOut(hdcWindow,10,70,"Regolare l'accuratezza delle funzioni.",38);
TextOut(hdcWindow,10,100,"Più è accurato, più punti vengono disegnati.",45);
EndPaint(hwnd,&ps);
break;
case WM_COMMAND:
if (LOWORD(wParam)==5)
{
prec=SendMessage(hwndTrack,TBM_GETPOS,NULL,NULL); //Carico l'ultima posizione
inc=1/prec; //calcolo l'incremento
DestroyWindow(hwnd); //Chiudo la finestra
}
if (LOWORD(wParam)==6)
{
prec=preprec; //Annullo una eventuale modifica
DestroyWindow(hwnd); //Chiudo la finestra
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}
//Creazione finestra principale/Dichiarazione di hinstance per le altre finestre.
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
InitCommonControls (); //Applicazione visual style
WNDCLASSEX WndClass,WndClass2,WndClass3,WndClass4,WndClass5;
HWND hwnd;
MSG Msg;
g_hInst = hInstance;
//Main Window
WndClass.cbSize = sizeof(WNDCLASSEX);
WndClass.style = 0;
WndClass.lpfnWndProc = WndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = g_hInst;
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
WndClass.lpszMenuName = NULL;
WndClass.lpszClassName = g_szClassName;
WndClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
//Curve Window
WndClass2.cbSize = sizeof(WNDCLASSEX);
WndClass2.style = 0;
WndClass2.lpfnWndProc = WindowProcedure2;
WndClass2.cbClsExtra = 0;
WndClass2.cbWndExtra = 0;
WndClass2.hInstance = hInstance;
WndClass2.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass2.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass2.hbrBackground = (HBRUSH)(COLOR_BTNFACE+0);
WndClass2.lpszMenuName = NULL;
WndClass2.lpszClassName = name;
WndClass2.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
//Setting Window
WndClass4.cbSize = sizeof(WNDCLASSEX);
WndClass4.style = 0;
WndClass4.lpfnWndProc = WindowProcedure4;
WndClass4.cbClsExtra = 0;
WndClass4.cbWndExtra = 0;
WndClass4.hInstance = hInstance;
WndClass4.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass4.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass4.hbrBackground = (HBRUSH)(16);
WndClass4.lpszMenuName = NULL;
WndClass4.lpszClassName = name3;
WndClass4.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
//Main Window
if(!RegisterClassEx(&WndClass))
{
MessageBox(0, "Window1 Registration Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
return 0;
}
//Second Window
if(!RegisterClassEx(&WndClass2))
{
MessageBox(0, "Window2 Registration Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
return 0;
}
//Fourt Window
if(!RegisterClassEx(&WndClass4))
{
MessageBox(0, "Window4 Registration Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
return 0;
}
//CREAZIONE:
//Main Window
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,g_szClassName,"Paint XY",
WS_SYSMENU|WS_MINIMIZEBOX|WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, 1015, 1100,NULL, NULL, g_hInst, NULL);
if (hwnd == NULL)
{
MessageBox(0, "Window Creation Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
return 0;
}
//Visualizza Main Window
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
//Messaggio da Main Window
while(GetMessage(&Msg, NULL, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}