visual c++ - mostrar - Dibuja una línea en mfc con la ayuda de la barra de herramientas
como recuperar la barra de comandos en autocad (2)
Eche un vistazo al tutorial de MFC Scribble: http://msdn.microsoft.com/en-us/library/aa716527%28v=vs.60%29.aspx )
Te ayudará a empezar a manejar el mouse y el ratón, mover y dibujar.
METRO.
Estoy tratando de hacer una aplicación de pintura en MFC usando visul basic c ++ 6.0 ya he creado una ventana usando la función Crear y también he creado una barra de herramientas con una línea de herramientas, pero estoy atascado en cómo codificar la línea porque la función que conozco va como d.lineTo (x, y) y d.Moveto (x2, y2) pero viene bajo la función de línea, ¿cómo utilizo OnLButtonDown para atrapar a los coordinadores o hay alguna otra manera en que pueda trazar una línea ... ? cualquier ayuda será útil
Ok, vas a tener que anular varias funciones miembro para hacer esto. He delineado un enfoque a continuación. Mi ejemplo a continuación trata de una sola operación de trazado de líneas (desde el mouse hacia abajo, hacia el mouse hacia arriba). Un ejercicio para ti es hacerlo de modo que una vez que hayas hecho uno, puedas hacer otro en un lugar diferente. ¡Es fácil, por cierto!
CWnd::OnLButtonDown(UINT _flags, CPoint _pt);
CWnd::OnLButtonUp(UINT _flags, CPoint _pt);
CWnd::OnMouseMove(UINT _flags, CPoint _pt);
CWnd::OnPaint()
¡Disculpa si algunas de estas firmas de funciones están equivocadas! Agregue algunos miembros a su clase de ventana:
// at the top of your file
#include <vector>
// in your class
typedef std::vector<POINT> PointVector;
PointVector m_Points;
CYourWnd::OnLButtonDown(UINT _flags, CPoint _pt);
{
// NOTE: For more than one set of drawing, this will be different!
m_Points.clear();
m_Points.push_back(POINT(_pt.x, _pt.y));
}
CYourWnd::OnMouseMove(UINT _flags, CPoint _pt);
{
if(_flags & MK_LBUTTON)
{
const POINT& last(m_Points.back());
if(_pt.x != last.x || _pt.y != last.y)
{
m_Points.push_back(POINT(_pt.x, _pt.y));
Invalidate();
}
}
}
CYourWnd::OnPaint()
{
CPaintDC dc(this);
CRect rcClient; GetClientRect(&rc);
FillSolidRect(&rcClient, RGB(255, 255, 255));
if(m_Points.size())
{
dc.MoveTo(m_Points[0].x, m_Points[0].y);
for(PointsVector::size_type p(1);
p < m_Points.size();
++p)
dc.LineTo(m_Points[p].x, m_Points[p].y);
}
}
Obviamente, esto es crudo y te da una sola operación de dibujo. Una vez que haces clic en el botón izquierdo de nuevo, borra lo que has hecho. Entonces, una vez que tienes esto funcionando:
Hazlo para que puedas dibujar una cantidad ilimitada de líneas. Puede lograr esto de varias maneras, como un contenedor adicional (para almacenar vectores) o incluso clases de operación de dibujo que puede almacenar en un solo vector y luego ejecutar.
Esta solución bien puede parpadear. ¿Cómo puedes detener esto? Quizás
OnEraseBkgnd
tenga la clave ...¿Qué tal más colores?
Todos los signos apuntan hacia la creación de algunas clases de dibujo que encapsulan esto para usted, pero espero que esto lo haya hecho comenzar.