NB6_Hazards/GDE_3_2008/GDE_3View.cpp
Jonny007-MKD e244248d12 Allow to start our App several times
Brauchen wir, da sich die GDE meistens sträubt, sich richtig zu
zeichnen. Hiermit kann man mehrmals auf "Run" drücken, bis es
funktioniert.
2013-11-29 00:53:56 +01:00

433 lines
11 KiB
C++

// GDE_3View.cpp : Implementierung der Klasse CGDE_3View
//
#include "stdafx.h"
#include "GDE_3.h"
#include "mainfrm.h"
#include "GDE_3Doc.h"
#include "GDE_3View.h"
#include ".\gde_3view.h"
#include "user.h"
#include "Wincon.h"
#include "Windows.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
extern WORD MAX_X;
extern WORD MAX_Y;
// CGDE_3View
IMPLEMENT_DYNCREATE(CGDE_3View, CScrollView)
BEGIN_MESSAGE_MAP(CGDE_3View, CScrollView)
// Standarddruckbefehle
ON_COMMAND(ID_STARTBUTTON, OnStartButton)
ON_COMMAND(ID_STOPBUTTON, OnStopButton)
ON_COMMAND(ID_BUTTONZOOMOUT, OnButtonzoomout)
ON_COMMAND(ID_BUTTONZOOMIN, OnButtonzoomin)
ON_COMMAND(ID_BUTTONZOOMFIT, OnButtonzoomfit)
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
ON_COMMAND(ID_FILE_SAVE, OnFileSave)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_RBUTTONDOWN()
// ON_WM_MOUSEACTIVATE()
ON_WM_MOUSEMOVE()
ON_WM_DESTROY()
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
ON_COMMAND(ID_FILE_NEW, OnFileNew)
END_MESSAGE_MAP()
// CGDE_3View Erstellung/Zerstörung
CGDE_3View::CGDE_3View()
{
// TODO: Hier Code zum Erstellen einfügen
m_fXScale = 1.0f; // zooming scale
m_fYScale = 1.0f;
m_fDelta = 1.2f;
m_nMapMode = MM_TEXT;
uthread = NULL;
}
CGDE_3View::~CGDE_3View()
{
}
BOOL CGDE_3View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Ändern Sie hier die Fensterklasse oder die Darstellung, indem Sie
// CREATESTRUCT cs modifizieren.
return CScrollView::PreCreateWindow(cs);
}
// CGDE_3View-Zeichnung
void CGDE_3View::OnDraw(CDC* pDC)
{
CGDE_3Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// Das Array ab der vorgegebenen Position bis zum Ende durchlaufen...
// TRACE("CGDE_3View::OnDraw %d\n",pDoc->aShape.GetSize());
// pDoc->nShapePos=0;
// for (; pDoc->nShapePos<pDoc->aShape.GetSize(); pDoc->nShapePos++) {
// pDoc->aShape[pDoc->nShapePos]->Draw(&pDoc->buffer); // ...und die Objekte Zeichnen.
// pDoc->aShape[pDoc->nShapePos]->Draw(pDC); // ...und die Objekte Zeichnen.
// }
// TODO: Code zum Zeichnen der systemeigenen Daten hinzufügen
pDC->StretchBlt( 0, 0, (int)(MAX_X*m_fXScale), (int)(MAX_Y*m_fYScale), &pDoc->buffer, 0, 0, MAX_X, MAX_Y, SRCCOPY );
}
void CGDE_3View::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
// TODO: Gesamte Größe dieser Ansicht berechnen
theApp.vw = this; // Pointer auf das aktuelle Window-Fenster speichern.
// TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen
SetScrollSizes(MM_TEXT,CSize(MAX_X, MAX_Y));
CGDE_3Doc *pDoc = GetDocument();
CDC *pdc=GetDC();
pDoc->buffer.DeleteDC();
if(!pDoc->buffer.CreateCompatibleDC(pdc)){
AfxMessageBox("Cannot create buffer DC",MB_OK);
}
if(!(pDoc->memoryBmp.CreateCompatibleBitmap(pdc,MAX_X, MAX_Y))){
AfxMessageBox("Cannot create Bitmap",MB_OK);
}
pDoc->buffer.SelectObject( &pDoc->memoryBmp ); // Das Speicher-Bitmap als Geraetekontext auswaehlen.
pDoc->nShapePos =0;
ReleaseDC(pdc);
}
// CGDE_3View drucken
BOOL CGDE_3View::OnPreparePrinting(CPrintInfo* pInfo)
{
// Standardvorbereitung
return DoPreparePrinting(pInfo);
}
void CGDE_3View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: Zusätzliche Initialisierung vor dem Drucken hier einfügen
}
void CGDE_3View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: Bereinigung nach dem Drucken einfügen
}
// CGDE_3View Diagnose
#ifdef _DEBUG
void CGDE_3View::AssertValid() const
{
CScrollView::AssertValid();
}
void CGDE_3View::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CGDE_3Doc* CGDE_3View::GetDocument() const // Nicht-Debugversion ist inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGDE_3Doc)));
return (CGDE_3Doc*)m_pDocument;
}
#endif //_DEBUG
// CGDE_3View Meldungshandler
void CGDE_3View::OnButtonzoomout()
{
CSize size = GetTotalSize();
CRect rect;
GetClientRect(rect);
int width = rect.Width();
int height = rect.Height();
if (size.cx <= rect.Width() && size.cy <= rect.Height())
return;
if (width < size.cx)
{
size.cx = (int)(size.cx / m_fDelta);
m_fXScale /= m_fDelta;
}
if (height < size.cy)
{
size.cy = (int)(size.cy / m_fDelta);
m_fYScale /= m_fDelta;
}
if (size.cx <= rect.Width())
{
size.cx = rect.Width();
m_fXScale = 1.0f;
}
if (size.cy <= rect.Height())
{
size.cy = rect.Height();
m_fYScale = 1.0f;
}
SetScrollSizes(m_nMapMode, size);
Invalidate();
}
void CGDE_3View::OnButtonzoomin()
{
// if (m_fXScale >= MAX_ZOOM_FACTOR && m_fYScale >= MAX_ZOOM_FACTOR)
// return;
CSize size = GetTotalSize();
size.cx = (int)(size.cx * m_fDelta);
size.cy = (int)(size.cy * m_fDelta);
m_fXScale *= m_fDelta;
m_fYScale *= m_fDelta;
SetScrollSizes(m_nMapMode, size);
Invalidate();
}
void CGDE_3View::OnButtonzoomfit()
{
m_fXScale = 1.0;
m_fYScale = 1.0;
SetScrollSizes(MM_TEXT, CSize(MAX_X,MAX_Y));
Invalidate();
}
void CGDE_3View::OnStartButton()
{
theApp.m_stopflag=FALSE;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////if(theApp.vw->uthread==NULL)
theApp.vw->uthread = AfxBeginThread(StartGDE, &theApp, THREAD_PRIORITY_NORMAL);
//else AfxMessageBox("User_main is already running\n",MB_OK);
}
void CGDE_3View::OnStopButton()
{
theApp.m_stopflag=TRUE;
int cc=0;
while(theApp.vw->uthread!=NULL){
Sleep(100);
HWND hw=::GetConsoleWindow();
::SetForegroundWindow(hw);
//VOID keybd_event( BYTE bVk, BYTE bScan, DWORD dwFlags, DWORD dwExtraInfo );
keybd_event( '0', 0, 0, 0 );
keybd_event( 13, 0, 0, 0 );//CR
cc++;
if(cc==10)break;
}
//TRACE("cc=%d\n",cc);
}
void CGDE_3View::OnFileSave()
{
// TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein.
CWaitCursor wait;
CClientDC scrDC(this);
CDC memDC; // screen DC and memory DC
CBitmap bitmap;
CBitmap* pOldBitmap; // handles to device-dependent bitmaps
CRect rect;
GetClientRect(&rect);
memDC.CreateCompatibleDC(&scrDC);
bitmap.CreateCompatibleBitmap(&scrDC, rect.Width(), rect.Height());
pOldBitmap = memDC.SelectObject(&bitmap);// select new bitmap into memory DC
memDC.BitBlt(0, 0, rect.Width(), rect.Height(), &scrDC, 0, 0, SRCCOPY);
CGDE_3Doc* pDoc = GetDocument();
CString filename = pDoc->GetPathName();
CDib dib;
try {
dib.Create(&bitmap);
dib.Save(filename);
} catch(CImageException& e) {
::AfxMessageBox(e.what());
}
memDC.SelectObject(pOldBitmap);
memDC.DeleteDC();
}
void CGDE_3View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.
MouseClick = nFlags; // Tastenkombination und...
//printf("1.x:%d,y:%d\n",point.x,point.y);
CClientDC dc(this);
OnPrepareDC(&dc);
dc.DPtoLP(&point);
//printf("2.x:%d,y:%d\n",point.x,point.y);
CPoint shpoint=point;
shpoint.x = (int)(point.x/m_fXScale);
shpoint.y = (int)(point.y/m_fYScale);
MousePoint = shpoint; // ...Position speichern.
//printf("3.x:%d,y:%d\n",shpoint.x,shpoint.y);
CScrollView::OnLButtonDown(nFlags, point);
}
void CGDE_3View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.
CScrollView::OnLButtonUp(nFlags, point);
}
void CGDE_3View::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.
CScrollView::OnRButtonDown(nFlags, point);
}
void CGDE_3View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.
CClientDC dc(this);
OnPrepareDC(&dc);
//printf("1.x:%d,y:%d\n",point.x,point.y);
dc.DPtoLP(&point);
//printf("2.x:%d,y:%d\n",point.x,point.y);
CPoint shpoint=point;
shpoint.x = (int)(point.x/m_fXScale);
shpoint.y = (int)(point.y/m_fYScale);
//printf("3.x:%d,y:%d\n",shpoint.x,shpoint.y);
CString strCurPos;
strCurPos.Format("[x,y]=%d,%d ",shpoint.x, shpoint.y);
CStatusBar *sb= &((CMainFrame *)theApp.m_pMainWnd)->m_wndStatusBar;
sb->SetPaneText(sb->CommandToIndex(ID_INDICATOR_CURPOS),strCurPos);
CScrollView::OnMouseMove(nFlags, point);
}
void CGDE_3View::OnDestroy()
{
CScrollView::OnDestroy();
// TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein.
OnStopButton();
}
void CGDE_3View::OnFileOpen()
{
// TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein.
TCHAR szFilters[] = _T ("bmp files (*.bmp)|*.bmp|All files (*.*)|*.*||");
CFileDialog dlg(FALSE, _T ("bmp"), _T ("*.bmp"), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY ,
szFilters);
CString filename;
if(dlg.DoModal() == IDOK)
filename = dlg.GetPathName();
else
return;
CDib dib;
try {
dib.Load(filename);
} catch(CImageException& e) {
::AfxMessageBox(e.what());
}
CGDE_3Doc* pDoc = GetDocument();
pDoc->SetTitle(dlg.GetFileName());
dib.Load(filename);
int ww=dib.GetWidth();
int hh=dib.GetHeight();
dib.Draw(&(pDoc->buffer),0,0,ww,hh,SRCCOPY);
pDoc->SetTitle(filename);
pDoc->SetPathName(filename);
Invalidate();
}
void CGDE_3View::OnFileSaveAs()
{
// TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein.
CWaitCursor wait;
CClientDC scrDC(this);
CDC memDC; // screen DC and memory DC
CBitmap bitmap;
CBitmap* pOldBitmap; // handles to device-dependent bitmaps
CRect rect;
GetClientRect(&rect);
memDC.CreateCompatibleDC(&scrDC);
bitmap.CreateCompatibleBitmap(&scrDC, rect.Width(), rect.Height());
pOldBitmap = memDC.SelectObject(&bitmap);// select new bitmap into memory DC
memDC.BitBlt(0, 0, rect.Width(), rect.Height(), &scrDC, 0, 0, SRCCOPY);
TCHAR szFilters[] = _T ("bmp files (*.bmp)|*.bmp|All files (*.*)|*.*||");
CFileDialog dlg(FALSE, _T ("bmp"), _T ("*.bmp"), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
szFilters);
CString filename;
if(dlg.DoModal() == IDOK)
filename = dlg.GetPathName();
else
return;
CDib dib;
try {
dib.Create(&bitmap);
dib.Save(filename);
} catch(CImageException& e) {
::AfxMessageBox(e.what());
}
memDC.SelectObject(pOldBitmap);
memDC.DeleteDC();
CGDE_3Doc* pDoc = GetDocument();
pDoc->SetTitle(filename);
pDoc->SetPathName(filename);
}
void CGDE_3View::OnFileNew()
{
// TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein.
AfxMessageBox("Not supported",MB_OK);
}