NB6_Hazards/GDE_3_hazard/GDE_3View.cpp

434 lines
10 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);
}