Red de conocimiento informático - Problemas con los teléfonos móviles - Imágenes de programación de Py

Imágenes de programación de Py

Jaja, hombre, acabamos de terminar de aprender esto. El siguiente código es para usted y básicamente cumple con los requisitos. Sin embargo, hay que añadir dos recursos (en los recursos insertados), "Mouse (Cursor) y Menu Bar (Menú)". No funcionará sin agregarlo. Si puede comprender los cambios después de la adición, le enviaré el archivo directamente:

# 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

};

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)

{

HDC HDC =::GetDC(hWnd);

pt3 = ptPos

//Usa el color de fondo para dibujar la última posición = = gt clean Go

* 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)

{

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>

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>

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:

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

}

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);

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>

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;

}