kwadrat z protokata,koordynacja punktu, MFC

0

Witam.Pisze sobie w vs2010 programik graficzny,rysuje on linie i prostokat,z tym że dzieje sie to podobnie jak w zwykłym paincie,czyli za pomoca ruchu myszą i wcisnietego lewego przycisku,ale działa we wszystkie strony.Potrzebuje zrobic takie cos zeby w wyniku przytrzymania shifta i ruchu mysza+lpm rysowac kwadrat zamiast protokata.Prostokat dziedziczy po linii.Fragment kodu:

 void CMiniPaintView::OnMouseMove(UINT nFlags, CPoint point)
{
	//nflags sluzy do ropoznania jaki przycisk myszy zostal wcisniety
	// TODO: Add your message handler code here and/or call default
	CMiniPaintDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;
	
	if(nFlags &MK_LBUTTON){
		
		CClientDC cDC(this);
		cDC.SetROP2(R2_NOTXORPEN); //ustaw raster operation two, jak tlo czarne to xor :)
		if(temp){
			temp->OnDraw(&cDC); //odrysuje, ale przez xor tak na prawde zmaze
			delete temp;
		}
	
	
	if(nFlags &MK_SHIFT){
		temp = new CProstokat(pPoczatkowy,point,RGB(255,0,0));
	temp->OnDraw(&cDC);
		
		
		//temp = new CProstokat(pPoczatkowy, point, RGB(255,0,0));

		//bezwskaznikowe, tworze lokalnie klase, ktora ma automatycznie dostep do pamieci graficznej
		 //adres zmiennej odczytuje sie poprzez &
		
		}
	else{switch(aktualnaFigura){
		case PROSTOKAT:
			temp = new CProstokat(pPoczatkowy, point, RGB(255,0,0));
			break;
		case LINIA:
			temp = new CLinia(pPoczatkowy, point, RGB(255,0,0));
			break;
		default:
			temp = new CLinia(pPoczatkowy, point, RGB(255,0,0));}
	temp->OnDraw(&cDC);}}
	
	
	CView::OnMouseMove(nFlags, point);
}

Domyślam się że chodzi o to,aby podczas ruchu myszą x,y w point były skoordynowane:

 if(nFlags &MK_SHIFT){
		temp = new CProstokat(pPoczatkowy,point,RGB(255,0,0));

Chodzi o point z powyższego kodu.Trzeba go jakoś zmodyfikować.Póki co nie mam pomysłu jak to zrobić.

Dziekuje

1
int w=pPoczatkowy.x-point.x, aw=abs(w);
int h=pPoczatkowy.y-point.y, ah=abs(h);
if(aw<ah) h=h*aw/ah; else w=w*ah/aw;
point.x=pPoczatkowy.x-w;
point.y=pPoczatkowy.y-h;
                        temp = new CProstokat(pPoczatkowy, point, RGB(255,0,0));
0

User zasadniczo "zakreśla" myszą na ekranie prostokąt...

Musisz w ten prostokąt wrysować strzałkę.

Gdy mysz zmieni pozycję - przerysowywujesz strzałkę do nowego prostokąta.

0

A jak zrobić taką strzałke,która składa się z samych linii cos takiego ->?

1
int w=pPoczatkowy.x-point.x;
int h=pPoczatkowy.y-point.y;
double angle=atan2((double)h,(double)w);
double over=M_PI/6; // M_PI/6 to 30 stopni, odchylenie ramion strzałki
int len=30; // 30 pikseli rozmiar strzałki
// int len=sqrt(w*w+h*h)/5; // inny wariant: długość ramion zmienna i wynosi 1/5 długości trzonu strzałki
CPoint p1(pPoczatkowy.x+len*cos(over+angle),pPoczatkowy.y+len*sin(over+angle));
CPoint p2(pPoczatkowy.x+len*cos(over-angle),pPoczatkowy.y+len*sin(over-angle));
Rysujesz trzy kreski:
pPoczatkowy - point
pPoczatkowy - p1
pPoczatkowy - p2
1

double angle=atan2((double) h,(double) w);

1

Można i tak, grunt aby było 3 osobne kreski.

1 użytkowników online, w tym zalogowanych: 0, gości: 1