Imágenes de programación de Py
# include ltwindows.h gt
#Include "resource.h"
# incluir ltstring.h gt
# incluir ltstdio.h gt
# incluir ltmath.h gt
HINSTANCE g _ hInstance
int g _ n tolid = 0;
Línea de bandera de estructura
{
Punto ptB
Punto ptE
bool bIsDelete
};
Lema g_alllines[100];//Matriz de líneas
int g_nline número = 0;/ /número real de rectas
estructura marca círculo
{
punto ptCenter
int nRadius
bool bIsDelete p>
};
etiqueta círculo g _ todos los círculos[100]; //Matriz de círculo completo
int g _ nCircleNumber = 0 //Número de ronda realmente guardado<; /p>
Punto pt1 = {200, 200};
Punto pt2 = {200, 200};
Punto pt3 = {0, 0} <; /p>
int g _ nState = 0;
//Función: dibujar un segmento de línea recta.
Línea de dibujo no válida (HDC hDC, punto ptB, punto ptE)
{
* mover aex(hDC, ptB.x, ptB.y, NULL );
* línea a(hDC, ptE.x, pte . y);
}
//Función: Encuentra el valor de dos puntos conocidos distancia.
Distancia interna (punto pt1, punto pt2)
{
int nR = 0;
nR = sqrt((pt 1 x-pt2 . x)*(pt 1 . x-pt2 . x) (pt 1 . y-pt2 . y)*(pt 1 . y-pt2 . y));
Devolver número ;
}
Círculo dibujado vacío (HDC hDC, punto ptC, int nR)
{
* Elipse(hDC, ptC .x - nR, ptC.y - nR, ptC.x nR, PTC y nR);
}
void OnMouseMove(punto ptPos, HWND hWnd)
.{
if(g_n toid = = ID_CIRCLE)
{
if(g_nState == 1)
{
HDC HDC =::GetDC(hWnd);
//Obtiene el "pincel hueco" predefinido del sistema.
HBRUSH HBRUSH =(HBRUSH)::GetStockObject(NULL_BRUSH);
* seleccionar objeto(hDC, HB rush);
* setrop 2( R2- Comisión de Desarrollo Humano de Northopn);
DrawLine(hDC, pt1, pt2);
int nR = Distancia(pt1, pt2);
DrawCircle(hDC, pt1, nR);
pt3 = ptPos
nR = distancia(pt1, pt3);
DrawCircle(hDC, pt1, nR ); >
DrawLine(hDC, pt1, pt3);
pt2 = pt3
* liberar DC(hWnd, hDC); >
} else if(g _ n touid == ID _ LINE)
{
if(g_nState == 1)
{ p>
HDC HDC =::GetDC(hWnd);
pt3 = ptPos
//Usa el color de fondo para dibujar la última posición = = gt clean Go p>
* setrop 2 (R2 - Northopon HDC);
* dibujar líneas (hDC, pt1, pt2);
* dibujar líneas (hDC, pt1, pt3) ;
pt2 = pt3
* liberar DC(hWnd, hDC);
}
}
}
void OnLButtonUp(punto ptPos)
{
if(g _ n toid = = ID _ CIRCLE)
{
if(g_nState == 1)
{
tagCircle aCir
acir pt centro = pt 1;
acir .nradius = Distancia(pt 1, pt pos);
aCir.bIsDelete = false
g _ todos los círculos[g _ ncircle number]= aCir;
g _ nCircleNumber = g _ nCircleNumber 1;
g _ nState = 0;
}
} else if(g_n touid = = ID_LINE )
{
if(g_nState == 1)
{
g_nState = 0;
Lema aLine
aline.PTB = pt 1;
aLine.ptE = pt3
aLine.bIsDelete = false
g _ todas las líneas. [g_nLineNumber] = aLine
g_nline número = g_nline número 1;
}
}
p>}
}
//Función: Determina si el punto está en línea recta.
Booleano PtOnCircle(punto pt, punto ptC, int nR)
{
int nL = distancia (pt, ptC);
if(fabs(nL-nR) lt; 5)
{
devuelve verdadero
}de lo contrario
{
Devuelve falso
}
}
//Función: Determina si el punto está en línea recta.
bool PtOnLine(punto pt, punto ptB, punto ptE)
{
int nL1 = Distancia(pt, ptB);
int nL2 = Distancia(pt, ptE);
int nL3 = Distancia(ptB, ptE);
if(fabs((nl 1 nL2)-nL3) lt; 5 )
{
Devuelve verdadero
} En caso contrario
{
Devuelve falso
}
}
void onbuttondown(HWND HWND, POINT ptPos)
{
if(g_n toid = = ID _ CIRCLE )
{
if(g_nState == 0)
{
g_nState = 1;
pt2 = pt 1 = pt pos;
}
} else if(g_n touid = = ID_LINE)
{ p>
if (g_nState == 0)
{
g_nState = 1;
pt2 = pt 1 = pt pos;
p >
}
} else if(g _ n touid = = ID _ DELETE)
{
//Determine si el punto actual del mouse es en un segmento de recta.
for(int nI = 0; nI ltg _ nLineNumbernI = nI 1)
{
Lema * pLine = ampg _ todas las líneas[nI]; /p>
if(PtOnLine(ptPos, (*pLine). ptB, (*pLine). ptE))
{
char cTxt[100]; p>
p>
sprintf(cTxt, " nI = d\n ", nI
*Cadena de depuración de salida
(*pLine). bIsDelete = true
Break;
}
}
//Determina si el punto actual del mouse está en el círculo.
for(nI = 0; nI ltg _ nCircleNumbernI = nI 1)
{
tagCircle * pCircle = ampg _ todos los círculos[nI]; p>
p>
if(PtOnCircle(ptPos, (*pCircle). ptCenter, (*pCircle). nRadius))
{
(*pCircle) .
bIsDelete = true
Break;
}
}
* invalidador(hWnd, NULL, TRUE);
}
}
Pintura de desecho (HDC hDC)
{
// 1. Vuelve a dibujar el círculo
//Obtiene el "pincel hueco" predefinido del sistema.
HBRUSH HBRUSH =(HBRUSH)::GetStockObject(NULL_BRUSH);
* seleccionar objeto(hDC, HB rush);
for(int nI = 0 ; nI ltg _ nCircleNumbernI )
{
tagCircle aCir
aCir = g _ todos los círculos[nI];
if (aCir .bIsDelete == false)
{
DrawCircle(hDC, aCir.ptCenter, acir. nradius);
}
}
// 2. Vuelve a dibujar el segmento de recta
for(nI = 0; nI ltg _ nLineNumbernI = nI 1)
{
tagLine aLine = g _ todas las líneas[nI];
if(aLine.bIsDelete == false)
{
* DrawLine(hDC, aLine .ptB, aline . pte);
}
}
}
void OnCommand(HWND hWnd, int nCmdID)
{
Cambiar(nCmdID)
{
Case ID_Exit:
* Destruir ventana;
Pausa;
Caso ID_LINE:
g _ nToolID = ID _ LINE
Pausa;
Caso ID_CIRCLE: p>
g_nToolID=ID_CIRCLE
BREAK;
CASO ID_DELETE:
g_nToolID=ID_DELETE
Romper;
}
}
//Función de devolución de llamada de ventana
int WndProc(HWND hWnd,
int mensaje,
int wParam,
int lParam)
{
cambiar(mensaje)
{
Caso WM_SETCURSOR:
{
HCURSOR hcur 1 =::cargar cursor(g_h instancia, "pen_cursor ");
h cursor hcur 2 =:: cargar cursor(g _ h instancia, " mano _ cursor ");
h cursor hcur 3 =:: cargar cursor(g _ h instancia, " punto _ cursor "); >h cursor hcur 4 =:: cargar cursor(g _ h instancia, " flecha _ cursor "
Cambiar (g _ nToolID)
{
Caso ID_LINE:
* establecer cursor(hcur 1);
Interrupción;
Caso ID_CIRCLE:
establecer cursor(hcur 2);
Pausa;
Caso ID_Delete:
establecer cursor(hcur 3);
Pausa;
Valor predeterminado:
* establecer cursor(hcur 1);
}
Pausa ; p>
}
Caso WM_COMMAND:
{
int nID = LOWORD(wParam);
OnCommand( hWnd, nID);
Rotura;
}
Caso WM_LBUTTONDOWN:
{
Punto ptPos
pt pos. x = LOWORD(lParam);
pt pos. y = hola palabra(lParam);
OnLButtonDown(hWnd, pt pos);
}
Rotura;
Caso WM_LBUTTONUP:
{
Punto ptPos
pt pos /p>
Interrupción;
Caso WM_MOUSEMOVE:
{
Punto ptPos
pt pos x = LOWORD(. lParam );
pt pos . y = hola palabra(lParam);
OnMouseMove(ptPos, hWnd);
}
Romper ;
Caso WM_PAINT:
{
PAINTSTRUCT ps
HDC hDC = ::BeginPaint(hWnd, ampPS); p >
OnPaint(hDC);
* TopPaint(hWnd&PS);
Break;
}
Caso WM_DESTROY: //Enviado cuando la ventana está cerrada.
PostQuitMessage(0); //Agrega 0 mensaje al final de la cola de mensajes para indicar el final del programa.
Break;
Predeterminado:
return::DefWindowProc(hWnd, message, wParam, lParam
}
p>
Devuelve 0;
}
int WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
char* lpCmdLine,
int nCmdShow)
{
g _ hInstance = hInstance
WNDCLASSEX wcex
wcex . Tamaño CB = tamaño de(WNDCLASSEX);
wcex estilo = CS_HREDRAW | CS_VREDRAW;
wcex .lpfnwndproc =(WNDPROC)WNDPROC;
wcex. cbclsextra = 0;
wcex . cbwndextra = 0;
wcex h instancia = h instancia;
wcex.hIcon = NULL
wcex .hcursor = cargar cursor(NULL, IDC _ ARROW);
wcex .hbrbackground = (HBRUSH)(COLOR _ WINDOW 1);
wcex . ";
wcex . lpsz class name = " ABCDE ";
wcex . hi consm = NULL;
registrar classex(amp;wcex); p>
p>
HWND hWnd = CreateWindow("ABCDE ",
"万杰",
WS_OVERLAPPEDWINDOW,
50, 50 , //(x , y)
500, 500, //(ancho, alto)
Vacío,
Vacío,
hInstancia,
p>
NULL);
ShowWindow(hWnd, SW _ SHOW);
MSG MSG;
while(GetMessage( amp; msg, NULL , 0, 0))
{
mensaje de envío(amp; MSG);
}
Devolver 1;
}