1 //Prak3 MFC ohne Assistenten
2 //Author: Steve Moser
3 //Email: smoser@anno74.de
4 //Datum: 4.11.2003
5
6 #include <afxwin.h> // Globale Header-Datei
7 #include "MyView.h"
8 #include "kritzel.h"
9 #include "resource.h"
10 #include "MyDoc.h"
11
12
13 #define VHEIGHT 800
14 #define HWIDTH 600
15
16 //CMyView.cpp
17 //*************************************************************************
18 IMPLEMENT_DYNCREATE(CMyView, CScrollView)
19 //CMyView message map und memberfunktionen
20 BEGIN_MESSAGE_MAP (CMyView, CScrollView)
21
22 ON_COMMAND_RANGE (IDM_BREITE_KRASSDUENN, IDM_BREITE_SEHR_DICK, OnMenuUpdate )
23 ON_COMMAND_RANGE (IDM_FIGUR_LINIE, IDM_FIGUR_ELLIPSE, OnMenuUpdate )
24
25
26 ON_WM_SIZE ()
27 ON_WM_LBUTTONDOWN ()
28 ON_WM_LBUTTONUP ()
29 ON_WM_MOUSEMOVE ()
30 ON_WM_CONTEXTMENU ()
31 END_MESSAGE_MAP ()
32
33
34 //*************************************************************************************
35 //Function: Konstruktor
36 //Return value:
37 //description: initialisierung der membervariablen dieser klassen,+aktuellen cursor holen
38 //*************************************************************************************
39 CMyView::CMyView()
40 {
41 m_standard=GetCursor();
42 m_movement = false;
43 m_locked = false;
44
45 }
46 //*************************************************************************************
47 //Function: OnInitialUpdate
48 //Return value: void
49 //description: wird bei erzeugung der view aufgerufen
50 //*************************************************************************************
51
52 void CMyView::OnInitialUpdate()
53 {
54 SetScrollSizes(MM_TEXT,CSize(VHEIGHT,HWIDTH), CSize (0,10), CSize (0,10) );
55 CScrollView::OnInitialUpdate();
56 }
57 //*************************************************************************************
58 //Function: OnSize
59 //Return value: void
60 //description: setzt die scrollmaßen bei erstellung der scrollview, muss vorhanden sein
61 //*************************************************************************************
62 void CMyView::OnSize(UINT nType,int cx, int cy )
63 {
64 SetScrollSizes(MM_TEXT,CSize(VHEIGHT,HWIDTH), CSize (0,10), CSize (0,10) );
65 }
66
67 void CMyView::OnUpdate(CView *pSender,LPARAM lHINT,CObject *pHint)
68 {
69 Invalidate();
70 }
71 //*************************************************************************************
72 //Function: OnDraw
73 //Return value: void
74 //description: view enthält virtuelle funktion OnDraw, zeichnet in verbindung mit der scrollview
75 // die elemente neu, die in einem array vorher gespeichert wurden, an die geg. pos
76 // (wird bei verdecken des fensters, oder popup, etc. aufgerufen)
77 //*************************************************************************************
78 void CMyView::OnDraw(CDC* pDC)
79 {
80 mObject *obj;
81 CMyDoc* pDoc = GetDocument();
82
83 if(!pDoc->pArray.IsEmpty())
84 {
85 POSITION pos = pDoc->pArray.GetTailPosition();
86 while( pos )
87 {
88
89 obj = (mObject*)pDoc->pArray.GetAt(pos);
90 switch ( obj->sType)
91 {
92 case IDM_FIGUR_LINIE:
93 {
94 CPen pen;
95 pen.CreatePen(PS_SOLID,obj->sBreite,obj->sFarbe);
96 CPen * p = pDC->SelectObject(&pen);
97 pDC->MoveTo(obj->sStart);
98 pDC->LineTo(obj->sEnde);
99 pDC->SelectObject(p);
100 break;
101 }
102 case IDM_FIGUR_RECHTECK:
103 {
104 CRect rect(obj->sStart,obj->sEnde);
105 CBrush brush;
106 brush.CreateSolidBrush(obj->sFarbe);
107 pDC->SelectObject( &brush );
108 pDC->Rectangle(&rect);
109 break;
110 }
111 case IDM_FIGUR_ELLIPSE:
112 {
113 CRect rect (obj->sStart,obj->sEnde);
114 CBrush brush;
115 brush.CreateSolidBrush(obj->sFarbe);
116 pDC->SelectObject(&brush);
117 pDC->Ellipse(&rect);
118 break;
119 }
120 case IDM_FIGUR_KREIS:
121 {
122 CRect rect (obj->sStart,obj->sEnde );
123 CBrush brush;
124 brush.CreateSolidBrush(obj->sFarbe);
125 pDC->SelectObject(&brush);
126 pDC->Ellipse(&rect);
127 break;
128 }
129
130 default:
131 break;
132 }
133 pDoc->pArray.GetPrev(pos);
134 }
135 }
136 }
137
138
139 //*************************************************************************************
140 //Function: AddToList
141 //Return value: void
142 //description: fuegt gegebenes objekt zu einem array hinzu, aus LButtonUp aufgerufen
143 //*************************************************************************************
144 void CMyView::AddToList()
145 {
146 CMyDoc* pDoc = GetDocument();
147 CClientDC dc (this);
148 OnPrepareDC(&dc);
149 dc.DPtoLP(&m_start);
150 dc.DPtoLP(&m_ende);
151
152 mObject *obj = new mObject;
153 obj->sStart = m_start;
154 obj->sEnde = m_ende;
155 obj->sType = pDoc->m_akt_figur;
156 obj->sFarbe = pDoc->m_akt_farbe;
157 obj->sBreite = pDoc->m_akt_breite;
158
159 pDoc->pArray.AddHead(obj);
160
161
162 }
163
164 //*************************************************************************************
165 //Function: OnLButtonDown
166 //Return value: void
167 //description: bei druecken der linken maustaste werden cursor und capture enabled
168 //*************************************************************************************
169 void CMyView::OnLButtonDown (UINT nFlags, CPoint point)
170 {
171 HCURSOR neu;
172 neu = LoadCursor(NULL,IDC_CROSS);
173 SetCursor(neu);
174
175 if(!m_locked)
176 {
177 SetCapture();
178 m_locked = true;
179 m_movement = true;
180 }
181 m_start = point;
182 m_ende = point;
183
184 }
185
186 //*************************************************************************************
187 //Function: OnLButtonUp
188 //Return value: void
189 //description: zeichnet das aktuelle objekt an gegebenen stellen
190 //*************************************************************************************
191 void CMyView::OnLButtonUp( UINT nFlags,CPoint point)
192 {
193 CMyDoc* pDoc = GetDocument();
194 if(m_movement)
195 {
196 CClientDC dc(this); //gibst du mir werkzeug zum rumschrauben
197 InvertLine(&dc,m_start,m_ende);
198
199 switch (pDoc->m_akt_figur)
200 {
201 case IDM_FIGUR_LINIE:
202 {
203 CPen pen;
204 pen.CreatePen(PS_SOLID,pDoc->m_akt_breite,pDoc->m_akt_farbe);
205 dc.SelectObject(&pen);
206 dc.MoveTo(m_start);
207 dc.LineTo(point);
208 break;
209 }
210 case IDM_FIGUR_RECHTECK:
211 {
212 CRect rect(m_start,point);
213 CBrush brush;
214 brush.CreateSolidBrush(pDoc->m_akt_farbe);
215 dc.SelectObject( &brush );
216 dc.Rectangle(&rect);
217 break;
218 }
219 case IDM_FIGUR_ELLIPSE:
220 {
221 CRect rect (m_start,point);
222 CBrush brush;
223 brush.CreateSolidBrush(pDoc->m_akt_farbe);
224 dc.SelectObject(&brush);
225 dc.Ellipse(&rect);
226 break;
227 }
228 case IDM_FIGUR_KREIS:
229 {
230 m_ende = MakeQuadrat(point);
231 CRect rect (m_start, m_ende );
232 CBrush brush;
233 brush.CreateSolidBrush(pDoc->m_akt_farbe);
234 dc.SelectObject(&brush);
235 dc.Ellipse(&rect);
236 break;
237 }
238
239 default:
240 break;
241 }
242
243 if(m_locked)
244 {
245 ReleaseCapture();
246 m_locked = false;
247 m_movement = false;
248 }
249
250
251 }
252 AddToList();
253 SetCursor(m_standard);
254 }
255
256 //*************************************************************************************
257 //Function: OnMouseMove
258 //Return value: void
259 //description: solange die Maus bewegt wird, werden alte temporäre linien gelöscht und
260 // neu gezeichnet ueber den aufruf der InvertLine Methode
261 //*************************************************************************************
262 void CMyView::OnMouseMove( UINT nFlags, CPoint point)
263 {
264 if(m_movement)
265 {
266 CClientDC dc (this);
267 InvertLine(&dc, m_start, m_ende);
268 InvertLine(&dc, m_start, point);
269 m_ende = point;
270 }
271 }
272
273 //*************************************************************************************
274 //Function: InvertLine
275 //Return value: void
276 //description: löscht und zeichnet eine temporäre figur ohne füllung an geg. koordinaten
277 //*************************************************************************************
278 void CMyView::InvertLine(CDC* pDC, CPoint start, CPoint ende)
279 {
280 CMyDoc* pDoc = GetDocument();
281 int alterZustand = pDC->SetROP2(R2_NOT);
282 switch (pDoc->m_akt_figur)
283 {
284 case IDM_FIGUR_LINIE:
285 pDC->MoveTo(start);
286 pDC->LineTo(ende);
287 break;
288 case IDM_FIGUR_RECHTECK:
289 {
290 CRect rect (start,ende);
291 pDC->SelectStockObject(NULL_BRUSH);
292 pDC->Rectangle(&rect);
293 break;
294 }
295 case IDM_FIGUR_ELLIPSE:
296 {
297 CRect rect (start,ende);
298 pDC->SelectStockObject(NULL_BRUSH);
299 pDC->Ellipse(&rect);
300 break;
301 }
302 case IDM_FIGUR_KREIS:
303 {
304 CRect rect (m_start,MakeQuadrat(ende) );
305 pDC->SelectStockObject(NULL_BRUSH);
306 pDC->Ellipse(&rect);
307 break;
308 }
309
310 default:
311 break;
312 }
313 pDC->SetROP2(alterZustand);
314 }
315
316 //*************************************************************************************
317 //Function: OnContextMenu
318 //Return value: void
319 //description: bei rechter maustaste wird kontextmenue erstellt + setzen der aktuellen auswahl
320 //*************************************************************************************
321 void CMyView :: OnContextMenu (CWnd *pWnd, CPoint pos)
322 {
323 CRect rect;
324 GetClientRect (&rect);
325 ClientToScreen(&rect);
326 if(rect.PtInRect(pos) )
327 {
328 CMenu menue;
329 CMyDoc* pMyDoc = GetDocument();
330 menue.LoadMenu(IDR_CONTEXTMENU);
331 CMenu* pContextMenue = menue.GetSubMenu(0);
332 for (int i=0;i<8;i++)
333 {
334 pContextMenue->ModifyMenu(IDM_FARBE_SCHWARZ + i, MF_BYCOMMAND | MF_OWNERDRAW, IDM_FARBE_SCHWARZ +i);
335 }
336
337 pContextMenue->CheckMenuItem( pMyDoc->m_breite,MF_BYCOMMAND | MF_CHECKED );
338 pContextMenue->CheckMenuItem( pMyDoc->m_figur,MF_BYCOMMAND | MF_CHECKED );
339
340 pContextMenue->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON |TPM_RIGHTBUTTON, pos.x, pos.y, AfxGetMainWnd());
341
342 return;
343 }
344
345 CWnd::OnContextMenu(pWnd,pos);
346
347 }
348
349 //*************************************************************************************
350 //Function: OnMenuUpdate
351 //Return value: void
352 //description: erfolgt im kontextmenue einen neue auswahl wird diese hier mit dem hauptmenue abgeglichen
353 //*************************************************************************************
354 void CMyView::OnMenuUpdate(UINT ID)
355 {
356 CMyDoc* pMyDoc = GetDocument();
357 if(ID<126)
358 pMyDoc->OnBreite(ID);
359 else
360 pMyDoc->OnFigur(ID);
361 }
362
363 //*************************************************************************************
364 //Function: MakeQuadrat
365 //Return value: CPoint (x,y)
366 //description: gleicht koordinaten ab, um ein quadrat zu erzeugen, das widerrum zur
367 // erzeugung eines kreises notwendig ist
368 //*************************************************************************************
369 CPoint CMyView::MakeQuadrat(CPoint point)
370 {
371 int wert;
372 CPoint tpoint = point;
373 if( (point.x > m_start.x) && (m_start.y < point.y) )
374 {
375 wert = point.x - m_start.x;
376 tpoint.y = m_start.y + wert;
377 }
378 if( (point.x < m_start.x) && (m_start.y < point.y) )
379 {
380 wert = m_start.x - point.x;
381 tpoint.y = m_start.y + wert;
382 }
383 if( (point.x > m_start.x) && (m_start.y > point.y) )
384 {
385 wert = point.x - m_start.x;
386 tpoint.y = m_start.y - wert;
387 }
388 if( (point.x < m_start.x) && (m_start.y > point.y) )
389 {
390 wert = m_start.x - point.x;
391 tpoint.y = m_start.y - wert;
392 }
393 return tpoint;
394 }
syntax highlighted by Code2HTML, v. 0.9.1