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