From a4a464e7195306ee269167a725a4c39b424ef20b Mon Sep 17 00:00:00 2001 From: gaeltp3 Date: Fri, 8 Nov 2013 16:52:17 +0100 Subject: [PATCH] initial commit der GDE_3 --- GDE_3_2008/Console/Console.cpp | 479 +++++++++++++++++++++++ GDE_3_2008/Console/Console.h | 61 +++ GDE_3_2008/Cparser.cpp | 77 ++++ GDE_3_2008/Cparser.h | 49 +++ GDE_3_2008/GDE_3.cpp | 172 ++++++++ GDE_3_2008/GDE_3.h | 39 ++ GDE_3_2008/GDE_3.rc | 396 +++++++++++++++++++ GDE_3_2008/GDE_3.sln | 19 + GDE_3_2008/GDE_3.sln.old | 19 + GDE_3_2008/GDE_3.suo.old | Bin 0 -> 41984 bytes GDE_3_2008/GDE_3.vcproj | 375 ++++++++++++++++++ GDE_3_2008/GDE_3.vcproj.8.00.old | 376 ++++++++++++++++++ GDE_3_2008/GDE_3.vcxproj | 173 ++++++++ GDE_3_2008/GDE_3.vcxproj.filters | 137 +++++++ GDE_3_2008/GDE_3Doc.cpp | 83 ++++ GDE_3_2008/GDE_3Doc.h | 50 +++ GDE_3_2008/GDE_3View.cpp | 433 ++++++++++++++++++++ GDE_3_2008/GDE_3View.h | 83 ++++ GDE_3_2008/Graphics/BaseException.h | 69 ++++ GDE_3_2008/Graphics/Dib.cpp | 331 ++++++++++++++++ GDE_3_2008/Graphics/Dib.h | 76 ++++ GDE_3_2008/Graphics/Graphicfunctions.cpp | 253 ++++++++++++ GDE_3_2008/Graphics/Graphicfunctions.h | 100 +++++ GDE_3_2008/Graphics/Image.h | 150 +++++++ GDE_3_2008/Graphics/PointerArray.h | 35 ++ GDE_3_2008/Graphics/Shape.cpp | 241 ++++++++++++ GDE_3_2008/Graphics/Shape.h | 196 ++++++++++ GDE_3_2008/MainFrm.cpp | 99 +++++ GDE_3_2008/MainFrm.h | 43 ++ GDE_3_2008/PrimImplikant.cpp | 36 ++ GDE_3_2008/PrimImplikantCollection.h | 24 ++ GDE_3_2008/PrimImplikanten.h | 25 ++ GDE_3_2008/ReadMe.txt | 103 +++++ GDE_3_2008/Readme2.txt | 11 + GDE_3_2008/User.h | 7 + GDE_3_2008/res/GDE_3.ico | Bin 0 -> 21630 bytes GDE_3_2008/res/GDE_3.manifest | 22 ++ GDE_3_2008/res/GDE_3.rc2 | 13 + GDE_3_2008/res/GDE_3Doc.ico | Bin 0 -> 1078 bytes GDE_3_2008/res/Toolbar.bmp | Bin 0 -> 1318 bytes GDE_3_2008/res/Toolbar.bmpold | Bin 0 -> 1078 bytes GDE_3_2008/resource.h | 25 ++ GDE_3_2008/stdafx.cpp | 7 + GDE_3_2008/stdafx.h | 47 +++ GDE_3_2008/user.cpp | 153 ++++++++ VSMacros80/Samples/Samples.vsmacros | Bin 0 -> 717312 bytes 46 files changed, 5087 insertions(+) create mode 100644 GDE_3_2008/Console/Console.cpp create mode 100644 GDE_3_2008/Console/Console.h create mode 100644 GDE_3_2008/Cparser.cpp create mode 100644 GDE_3_2008/Cparser.h create mode 100644 GDE_3_2008/GDE_3.cpp create mode 100644 GDE_3_2008/GDE_3.h create mode 100644 GDE_3_2008/GDE_3.rc create mode 100644 GDE_3_2008/GDE_3.sln create mode 100644 GDE_3_2008/GDE_3.sln.old create mode 100644 GDE_3_2008/GDE_3.suo.old create mode 100644 GDE_3_2008/GDE_3.vcproj create mode 100644 GDE_3_2008/GDE_3.vcproj.8.00.old create mode 100644 GDE_3_2008/GDE_3.vcxproj create mode 100644 GDE_3_2008/GDE_3.vcxproj.filters create mode 100644 GDE_3_2008/GDE_3Doc.cpp create mode 100644 GDE_3_2008/GDE_3Doc.h create mode 100644 GDE_3_2008/GDE_3View.cpp create mode 100644 GDE_3_2008/GDE_3View.h create mode 100644 GDE_3_2008/Graphics/BaseException.h create mode 100644 GDE_3_2008/Graphics/Dib.cpp create mode 100644 GDE_3_2008/Graphics/Dib.h create mode 100644 GDE_3_2008/Graphics/Graphicfunctions.cpp create mode 100644 GDE_3_2008/Graphics/Graphicfunctions.h create mode 100644 GDE_3_2008/Graphics/Image.h create mode 100644 GDE_3_2008/Graphics/PointerArray.h create mode 100644 GDE_3_2008/Graphics/Shape.cpp create mode 100644 GDE_3_2008/Graphics/Shape.h create mode 100644 GDE_3_2008/MainFrm.cpp create mode 100644 GDE_3_2008/MainFrm.h create mode 100644 GDE_3_2008/PrimImplikant.cpp create mode 100644 GDE_3_2008/PrimImplikantCollection.h create mode 100644 GDE_3_2008/PrimImplikanten.h create mode 100644 GDE_3_2008/ReadMe.txt create mode 100644 GDE_3_2008/Readme2.txt create mode 100644 GDE_3_2008/User.h create mode 100644 GDE_3_2008/res/GDE_3.ico create mode 100644 GDE_3_2008/res/GDE_3.manifest create mode 100644 GDE_3_2008/res/GDE_3.rc2 create mode 100644 GDE_3_2008/res/GDE_3Doc.ico create mode 100644 GDE_3_2008/res/Toolbar.bmp create mode 100644 GDE_3_2008/res/Toolbar.bmpold create mode 100644 GDE_3_2008/resource.h create mode 100644 GDE_3_2008/stdafx.cpp create mode 100644 GDE_3_2008/stdafx.h create mode 100644 GDE_3_2008/user.cpp create mode 100644 VSMacros80/Samples/Samples.vsmacros diff --git a/GDE_3_2008/Console/Console.cpp b/GDE_3_2008/Console/Console.cpp new file mode 100644 index 0000000..e853960 --- /dev/null +++ b/GDE_3_2008/Console/Console.cpp @@ -0,0 +1,479 @@ +/* file:Console.cpp +Creator : Girish Bharadwaj. +Desc:This class will contain all the stuff we need from the +Console.Following is the list I can think of 1. Create a new console and +use it to Write and read console. This will be using AllocConsole +(),WriteConsole() and ReadConsole (). This will be via the win32 APIs. + +2. Use the scanf ,printf,cout ,cin and cerr ( this will be using the CRT +functionality.) Using the WDJ technique given there by Andrew Tucker & +using the KB "How to Spawn a Console App and Redirect Standard Handles" +Article ID: Q126628. + +3. Redirect the output from a console app to a windows GUI app. ( +"Redirection Issues on Windows 95 MS-DOS Apps and Batch Files" Article +ID: Q150956).This will be the fun part. What I would like to see is to +provide an API which takes the console process name as the argument. +That will redirect the stuff to a CString.. which can be read by the +creator. + +4. I am also planning to do a somesort of poor man's debugger.i.e. You +will have an API similar to scanf which takes the input from the user at +run time with a default value to fall back to after sometime specified +by u. if you want to change a particular variable and see the effect, +You can use this. +*/ + +#include "stdafx.h" +#include +#include +#include +#include +#include +#include "console.h" + +#include +#include + +#include "..\graphics\shape.h" +#include "..\graphics\pointerarray.h" +#include "..\gde_3.h" +#ifndef _USE_OLD_IOSTREAMS +using namespace std; +#endif + + +#pragma warning( disable : 4311 )//Warning handle to long conversion disabled +#pragma warning( disable : 4312 )//Warning handle to long conversion disabled + + +extern CGDE_3App theApp; + +void printwindata(); + +BOOL CConsole::sm_bConsole = FALSE; +////////////////////////////////////////////////////////////////////////////// +CConsole::CConsole() + { + //default constructor. + m_bRedirected = FALSE; // this is the right place to set this before this + m_sNumColumns = 0; + m_sNumLines = 0; + m_sMaxLines = 0; + m_sMaxColumns = 0; + m_wAttrib = 0; + } +////////////////////////////////////////////////////////////////////////////// + +CConsole::CConsole(BOOL bCreateConsole) + { + m_bRedirected = FALSE; // this is the right place to set this before this + m_sNumColumns = 0; + m_sNumLines = 0; + m_sMaxLines = 0; + m_sMaxColumns = 0; + m_wAttrib = 0; + if (bCreateConsole) + CreateConsole (); + //I dont see any reason for not having bCreateConsole false But eh + } + +////////////////////////////////////////////////////////////////////////////// + +CConsole::~CConsole() + { + DestroyConsole (); //We need to remove the Console + } +////////////////////////////////////////////////////////////////////////////// + +BOOL CConsole::CreateConsole () + { + if (sm_bConsole == TRUE) // we have already created a console + { + return FALSE; + } + // I am not allocating the console if there is already one. + + if (!AllocConsole ()) //Just call the Console allocation API + { + sm_bConsole = FALSE; + m_dwError = GetLastError (); //Lets get the error and store it away. + return FALSE; + } + else + { + sm_bConsole = TRUE; //To make sure we wont allocate again + //Lets keep all the stuff around + m_sNumLines = (short)GetSettings (SC_LINES); + m_sNumColumns = (short)GetSettings (SC_COLUMNS); + m_sMaxLines = 70;//(short) GetSettings (SC_MAXLINES); + m_sMaxColumns = (short) GetSettings (SC_MAXCOLUMNS); + m_wAttrib = GetSettings (SC_ATTRIB); + m_dwError = 0; // Lets keep this zero for the time being. + return TRUE; + } + + } +////////////////////////////////////////////////////////////////////////////// + +BOOL CConsole::DestroyConsole () + { + if (sm_bConsole == FALSE) //There is no console to destroy + return TRUE; //as Well return asif we deleted + if (!FreeConsole ()) + { + sm_bConsole = TRUE; + m_dwError = GetLastError ();//Lets keep the error here if someone wants + return FALSE; + } + else + { + sm_bConsole = FALSE; + return TRUE; + } + } +////////////////////////////////////////////////////////////////////////////// +short CConsole::GetNumberOfLines() + { + return (short) GetSettings (SC_LINES); + } +////////////////////////////////////////////////////////////////////////////// + +short CConsole::SetNumberOfLines (short sLines) + { + if(CONSOLE_DEBUG)printf("SetNumberOfLines to %d\n",sLines); + short sRes = m_sNumLines; + m_sNumLines = sLines; + SetupConsole (SC_LINES); + Sleep(100); + return sRes; + } +////////////////////////////////////////////////////////////////////////////// + +short CConsole::SetNumberOfColumns (short sColumns) + { + if(CONSOLE_DEBUG)printf("SetNumberOfColumns to %d\n",sColumns); + short sOld = m_sNumColumns; + m_sNumColumns = sColumns; + SetupConsole (SC_COLUMNS); + return sOld; + } +////////////////////////////////////////////////////////////////////////////// + +short CConsole::GetNumberOfColumns () + { + return (short)GetSettings (SC_COLUMNS); + } +////////////////////////////////////////////////////////////////////////////// + +WORD CConsole::GetAttributes () + { + return (short) GetSettings (SC_ATTRIB); + } +////////////////////////////////////////////////////////////////////////////// +WORD CConsole::SetAttributes (WORD wAttrib, short NumChars) + { + WORD wOld = m_wAttrib; + m_wAttrib = wAttrib; + SetupConsole (SC_ATTRIB); + ApplyAttrib(NumChars); + return wOld; + } +////////////////////////////////////////////////////////////////////////////// +short CConsole::SetMaxLinesInWindow (short maxLines) + { + if(CONSOLE_DEBUG)printf("SetMaxLinesInWindow to %d\n",maxLines); + + short sOld = m_sMaxLines; + m_sMaxLines = maxLines; + SetupConsole (SC_MAXLINES); + return sOld; + } +////////////////////////////////////////////////////////////////////////////// +short CConsole::GetMaxLinesInWindow () + { + return (short) GetSettings (SC_MAXLINES); + } +////////////////////////////////////////////////////////////////////////////// +short CConsole::SetMaxColumnsInWindow (short maxColumns) + { + if(CONSOLE_DEBUG)printf("SetMaxColumnsInWindow to %d\n",maxColumns); + + short sOld = m_sMaxColumns; + m_sMaxColumns = maxColumns; + SetupConsole (SC_MAXCOLUMNS); + return sOld; + } +////////////////////////////////////////////////////////////////////////////// +short CConsole::GetMaxColumnsInWindow () + { + return (short) GetSettings (SC_MAXCOLUMNS); + } +////////////////////////////////////////////////////////////////////////////// + +//Now here we have the basic beginning traits of a CConsole. +//But it has to do more than Allocing and Freeing consoles. +//So here it is.. + + +void CConsole::RedirectToConsole (WORD wFlags) + { + int hConHandle; + long lStdHandle; + HANDLE nStdHandle; + CONSOLE_SCREEN_BUFFER_INFO coninfo; + FILE *fp; + + // Create the Console + CreateConsole(); + nStdHandle = GetStdHandle(STD_OUTPUT_HANDLE); + lStdHandle = (long)nStdHandle; + + // set the screen buffer to be big enough to let us scroll text + GetConsoleScreenBufferInfo(nStdHandle,&coninfo); + SetupConsole (SC_COLUMNS|SC_LINES|SC_ATTRIB|SC_MAXLINES|SC_MAXCOLUMNS); + + // redirect unbuffered STDOUT to the console + hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); + fp = _fdopen( hConHandle, "w" ); + *stdout = *fp; + setvbuf( stdout, NULL, _IONBF, 0 ); + + // redirect unbuffered STDIN to the console + nStdHandle = GetStdHandle(STD_INPUT_HANDLE); + lStdHandle = (long)nStdHandle; + hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); + fp = _fdopen( hConHandle, "r" ); + *stdin = *fp; + setvbuf( stdin, NULL, _IONBF, 0 ); + + // redirect unbuffered STDERR to the console + lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE); + hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); + fp = _fdopen( hConHandle, "w" ); + *stderr = *fp; + setvbuf( stderr, NULL, _IONBF, 0 ); + // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog + // point to console as well + ios::sync_with_stdio(); + m_bRedirected = TRUE; //Whether the Console is redirected +} + +////////////////////////////////////////////////////////////////////////////// +/* +This will be function which will actually set up the console to the user +settings. +*/ +BOOL CConsole::SetupConsole(WORD wFlags) + { + HANDLE nStdHandle; + long lStdHandle; + CONSOLE_SCREEN_BUFFER_INFO coninfo; + + if (!sm_bConsole) + return FALSE; // There aint no console to set up, Duh + nStdHandle = GetStdHandle(STD_OUTPUT_HANDLE); + lStdHandle = (long)nStdHandle; + // set the screen buffer to be big enough to let us scroll text + if(!GetConsoleScreenBufferInfo(nStdHandle,&coninfo)){ + if(CONSOLE_DEBUG)printf("***Error*** GetConsoleScreenBufferInfo failed\n"); + if(CONSOLE_DEBUG)printwindata(); + } + if(CONSOLE_DEBUG) printf("BBB: \n"); + if(CONSOLE_DEBUG) printwindata(); + if (wFlags & SC_COLUMNS || wFlags & SC_LINES) //Set up only the columns + { + if(CONSOLE_DEBUG)printf("Either SC_COLUMNS or SC_LINES set m_sNumColumns to %d and m_sNumLines to %d\n", + m_sNumColumns,m_sNumLines); + //Number of Columns to be set + if (m_sNumColumns) + coninfo.dwSize.X = m_sNumColumns; + // number of lines to be set + if (m_sNumLines){ + coninfo.dwSize.Y = m_sNumLines; + } + + //Set the screen buffer size + if(!SetConsoleScreenBufferSize(nStdHandle,coninfo.dwSize)){ + + printf("***Error*** SetConsoleScreenBufferSize failed\n"); + printwindata(); + }; + + } + if (wFlags & SC_ATTRIB) + { + //Attributes as specified + if(CONSOLE_DEBUG)printf("SC_ATTRIB\n"); + if (m_wAttrib) + coninfo.wAttributes = m_wAttrib; + //Set the Text attributes + if(!SetConsoleTextAttribute (nStdHandle,coninfo.wAttributes)){ + printf("***Error*** SetConsoleTextAttribute failed\n"); + printwindata(); + } + } + + if (wFlags & SC_MAXLINES || wFlags & SC_MAXCOLUMNS) + { + if(CONSOLE_DEBUG) printf("SC_MAXLINES: %d;SC_MAXCOLUMNS: %d\n",m_sMaxLines,m_sMaxColumns); + SMALL_RECT rect; + + //Maximum Size of the window + if (m_sMaxLines) + rect.Bottom= m_sMaxLines; + else + rect.Bottom = coninfo.dwMaximumWindowSize.Y; + + if (m_sMaxColumns) + rect.Right = m_sMaxColumns; + else + rect.Right = coninfo.dwMaximumWindowSize.X; + // if (m_sNumColumns) + // rect.Right = m_sNumColumns; + // else + // rect.Right = coninfo.dwMaximumWindowSize.X; + rect.Top = rect.Left = 0; + + //Set the console window maximum size + if(!SetConsoleWindowInfo (nStdHandle,TRUE,&rect)){ + DWORD lasterr = GetLastError(); + printf("lasterr: %d\n",lasterr); + + printf("***Error*** SetConsoleWindowInfo failed\n"); + printwindata(); + } + } + if(CONSOLE_DEBUG) printf("AAA: \n"); + if(CONSOLE_DEBUG) printwindata(); + return TRUE; + + } +////////////////////////////////////////////////////////////////////////////// + +HANDLE CConsole::GetHandle (DWORD dwFlag) + { + if (!sm_bConsole) + return (HANDLE) NULL; + return GetStdHandle (dwFlag); + } +////////////////////////////////////////////////////////////////////////////// + +BOOL CConsole::Clear () + { + COORD coordScreen = { 0, 0 }; /* here's where we'll home the + cursor */ + BOOL bSuccess; + DWORD cCharsWritten; + CONSOLE_SCREEN_BUFFER_INFO csbi; /* to get buffer info */ + DWORD dwConSize; /* number of character cells in + the current buffer */ + + if (!sm_bConsole) + return FALSE; + HANDLE hConsole = GetHandle (STD_OUTPUT_HANDLE); + + /* get the number of character cells in the current buffer */ + + + bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi ); + dwConSize = csbi.dwSize.X * csbi.dwSize.Y; + if (!bSuccess) return bSuccess; + + /* fill the entire screen with blanks */ + + bSuccess = FillConsoleOutputCharacter( hConsole, (TCHAR) ' ', + dwConSize, coordScreen, &cCharsWritten ); + if (!bSuccess) return bSuccess; + + /* get the current text attribute */ + + bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi ); + if (!bSuccess) return bSuccess; + + /* now set the buffer's attributes accordingly */ + + bSuccess = FillConsoleOutputAttribute( hConsole, csbi.wAttributes, + dwConSize, coordScreen, &cCharsWritten ); + if (!bSuccess) return bSuccess; + + /* put the cursor at (0, 0) */ + + bSuccess = SetConsoleCursorPosition( hConsole, coordScreen ); + if (!bSuccess) return bSuccess; + return TRUE; + } +////////////////////////////////////////////////////////////////////////////// + +BOOL CConsole::ApplyAttrib (short NumChars) + { + COORD coordScreen = { 0, 0 }; /* here's where we'll home the + cursor */ + BOOL bSuccess; + DWORD cCharsWritten; + CONSOLE_SCREEN_BUFFER_INFO csbi; /* to get buffer info */ + DWORD dwConSize; /* number of character cells in + the current buffer */ + if (!sm_bConsole) + return FALSE; + HANDLE hConsole = GetHandle (STD_OUTPUT_HANDLE); + bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi ); + if(!bSuccess) + printf("***Error*** GetConsoleScreenBufferInfo failed\n"); + if (!bSuccess) return bSuccess; + + dwConSize = csbi.dwSize.X * csbi.dwSize.Y; + bSuccess = FillConsoleOutputAttribute( hConsole, csbi.wAttributes, + NumChars?NumChars:dwConSize, csbi.dwCursorPosition, &cCharsWritten ); + + return bSuccess; + } +////////////////////////////////////////////////////////////////////////////// + +WORD CConsole::GetSettings (WORD wFlags) + { + long lStdHandle; + HANDLE nStdHandle; + CONSOLE_SCREEN_BUFFER_INFO coninfo; + + if (!sm_bConsole) + return FALSE; // There aint no console to set up, Duh + nStdHandle = GetStdHandle(STD_OUTPUT_HANDLE); + lStdHandle = (long)nStdHandle; + // set the screen buffer to be big enough to let us scroll text + GetConsoleScreenBufferInfo(nStdHandle,&coninfo); + if(!GetConsoleScreenBufferInfo(nStdHandle,&coninfo)) + printf("***Error*** GetConsoleScreenBufferInfo failed\n"); + + switch (wFlags) + { + case SC_ATTRIB: + return coninfo.wAttributes; + break; + case SC_LINES: + return coninfo.dwSize.Y; + break; + case SC_COLUMNS: + return coninfo.dwSize.X; + break; + case SC_MAXLINES: + return coninfo.dwMaximumWindowSize.Y; + break; + case SC_MAXCOLUMNS: + return coninfo.dwMaximumWindowSize.X; + break; + default: + printf("***Error*** Wrong case label in GetSettings\n"); + printwindata(); + } + return 0; + } +////////////////////////////////////////////////////////////////////////////// + +void CConsole::printwindata() +{ + printf ("NumLines:%d,Columns:%d,Attributes:%d,MaxLines:%d,MaxColumns:%d\n", + GetNumberOfLines(),GetNumberOfColumns (), GetAttributes(), + GetMaxLinesInWindow(),GetMaxColumnsInWindow()); + +} diff --git a/GDE_3_2008/Console/Console.h b/GDE_3_2008/Console/Console.h new file mode 100644 index 0000000..6fd3635 --- /dev/null +++ b/GDE_3_2008/Console/Console.h @@ -0,0 +1,61 @@ +#ifndef __CONSOLE_H__ +#define __CONSOLE_H__ + + + +//Some defines we will be requiring +#define SC_LINES 0x0001 +#define SC_COLUMNS 0x0002 +#define SC_ATTRIB 0x0004 +#define SC_MAXLINES 0x0008 +#define SC_MAXCOLUMNS 0x0010 + + +#define CONSOLE_DEBUG 0 + +class CConsole +{ + public: + //Constructor & Destructor + CConsole (); + CConsole (BOOL); + ~CConsole (); + + //Properties + short GetNumberOfLines(); + short SetNumberOfLines (short sLines); + short SetNumberOfColumns (short sColumns); + short GetNumberOfColumns (); + WORD GetAttributes (); + WORD SetAttributes (WORD wAttrib,short NumChars = 0); + short SetMaxLinesInWindow (short maxLines); + short GetMaxLinesInWindow (); + short SetMaxColumnsInWindow (short maxLines); + short GetMaxColumnsInWindow (); + + //Methods + void RedirectToConsole (WORD wFlags); + BOOL SetupConsole(WORD wFlags); + HANDLE GetHandle (DWORD dwFlag); + BOOL Clear (); + BOOL ApplyAttrib (short NumChars); + WORD GetSettings (WORD wFlags); + void printwindata(); + + protected: + + //Helpers + BOOL CreateConsole (); + BOOL DestroyConsole (); + + BOOL m_bRedirected; + short m_sNumColumns; + short m_sNumLines; + WORD m_wAttrib; + short m_sMaxLines; + short m_sMaxColumns; + DWORD m_dwError; + static BOOL sm_bConsole; + +}; +#endif //__CONSOLE_H__ diff --git a/GDE_3_2008/Cparser.cpp b/GDE_3_2008/Cparser.cpp new file mode 100644 index 0000000..9e4d6a6 --- /dev/null +++ b/GDE_3_2008/Cparser.cpp @@ -0,0 +1,77 @@ +#include +#include +#include +#include "stdafx.h" + +#include "Cparser.h" + +using namespace std; + +#define Getc(s) getc(s) +#define Ungetc(c) ungetc(c,IP_Input) + +/* Lexical analyser states. */ + +enum lexstate{L_START,L_INT,L_IDENT}; + + +int Cparser::yylex(){ + int c; + lexstate s; + + for(s=L_START, yytext="";1;){ + c= Getc(IP_Input); + yytext=yytext+(char)c; + switch (s){ + + case L_START: + if(isdigit(c)){ + if((char)c!='x'){ + s=L_INT; + }else{ + Ungetc(c); + yytext=yytext.substr(0,yytext.size()-1); + yytext1+='1'; + yytext+='0';// ab hier gut überlegen falls x auftritte + + + break; + } + }else if (isspace(c)||isalpha(c)){ + s=L_IDENT; + }else if(c==EOF){ + return 0; + }else if (c=='\n'){ LineNumber+=1; + }else { return 0; + } + break; + + case L_INT: + if(isdigit(c)){ break; + }else { + Ungetc(c); + yylval.s=yytext.substr(0,yytext.size()-1); + } + + break; + case L_IDENT: + if(isalpha(c)){ + yylval.s=yytext.substr(0,yytext.size()-1); + yylval.i=atoi(yylval.s.c_str()); + yytext=""; + } + break; + + default: + printf("*** Fatal Error!!!!!*** Wrong case label in yylex\n"); + + + + } + + } +} + + + + diff --git a/GDE_3_2008/Cparser.h b/GDE_3_2008/Cparser.h new file mode 100644 index 0000000..fbefa86 --- /dev/null +++ b/GDE_3_2008/Cparser.h @@ -0,0 +1,49 @@ +#ifndef CPARSER +#define CPARSER + +#include +#include "PrimImplikanten.h" + +using namespace std; + + +class Cparser{ +private: + + PrimImplikant implikant; + +public: + string yytext; + string yytext1; + int LineNumber; + + struct tyylval{ + string s; + int i; + }yylval; + + FILE* IP_Input; + void pr_tokentable(); + void load_tokenentry(string s ,int x); + int yylex(); + + +}; + + + + + + + + + + + + + + + + + +#endif diff --git a/GDE_3_2008/GDE_3.cpp b/GDE_3_2008/GDE_3.cpp new file mode 100644 index 0000000..fd08009 --- /dev/null +++ b/GDE_3_2008/GDE_3.cpp @@ -0,0 +1,172 @@ +// GDE_3.cpp : Definiert das Klassenverhalten für die Anwendung. +// + +#include "stdafx.h" +#include "console\console.h" +#include "GDE_3.h" +#include "MainFrm.h" + +#include "GDE_3Doc.h" +#include "GDE_3View.h" +#include ".\gde_3.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + + +// CGDE_3App + +BEGIN_MESSAGE_MAP(CGDE_3App, CWinApp) + ON_COMMAND(ID_APP_ABOUT, OnAppAbout) + // Dateibasierte Standarddokumentbefehle + ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) + ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) + // Standarddruckbefehl "Seite einrichten" + ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup) + ON_COMMAND(ID_APP_EXIT, OnAppExit) + ON_COMMAND(ID_FILE_OPEN, OnFileOpen) +END_MESSAGE_MAP() + + +// CGDE_3App-Erstellung + +CGDE_3App::CGDE_3App() +{ + // TODO: Hier Code zur Konstruktion einfügen + // Alle wichtigen Initialisierungen in InitInstance positionieren + m_stopflag=FALSE; +} + + +// Das einzige CGDE_3App-Objekt + +CGDE_3App theApp; +///////////////////////////////////////////////////////////////////////////// +/*Console object*/ +CConsole con(TRUE); +// Dieser thread startet die Funktion main(), in der Benutzer seinen Code hat. +UINT StartGDE(LPVOID lpv) +{ + extern void user_main(); + user_main(); + theApp.vw->uthread=NULL; + return TRUE; +} + +// CGDE_3App Initialisierung + +BOOL CGDE_3App::InitInstance() +{ + // InitCommonControls() ist für Windows XP erforderlich, wenn ein Anwendungsmanifest + // die Verwendung von ComCtl32.dll Version 6 oder höher zum Aktivieren + // von visuellen Stilen angibt. Ansonsten treten beim Erstellen von Fenstern Fehler auf. + InitCommonControls(); + + CWinApp::InitInstance(); + + // OLE-Bibliotheken initialisieren + if (!AfxOleInit()) + { + AfxMessageBox(IDP_OLE_INIT_FAILED); + return FALSE; + } + AfxEnableControlContainer(); + // Standardinitialisierung + // Wenn Sie diese Features nicht verwenden und die Größe + // der ausführbaren Datei verringern möchten, entfernen Sie + // die nicht erforderlichen Initialisierungsroutinen. + // Ändern Sie den Registrierungsschlüssel unter dem Ihre Einstellungen gespeichert sind. + // TODO: Ändern Sie diese Zeichenfolge entsprechend, + // z.B. zum Namen Ihrer Firma oder Organisation. + SetRegistryKey(_T("GDE3")); + LoadStdProfileSettings(16); // Standard INI-Dateioptionen laden (einschließlich MRU) + // Dokumentvorlagen der Anwendung registrieren. Dokumentvorlagen + // dienen als Verbindung zwischen Dokumenten, Rahmenfenstern und Ansichten. + CSingleDocTemplate* pDocTemplate; + pDocTemplate = new CSingleDocTemplate( + IDR_MAINFRAME, + RUNTIME_CLASS(CGDE_3Doc), + RUNTIME_CLASS(CMainFrame), // Haupt-SDI-Rahmenfenster + RUNTIME_CLASS(CGDE_3View)); + if (!pDocTemplate) + return FALSE; + AddDocTemplate(pDocTemplate); + // Befehlszeile parsen, um zu prüfen auf Standardumgebungsbefehle DDE, Datei offen + CCommandLineInfo cmdInfo; + ParseCommandLine(cmdInfo); + // Verteilung der in der Befehlszeile angegebenen Befehle. Es wird FALSE zurückgegeben, wenn + // die Anwendung mit /RegServer, /Register, /Unregserver oder /Unregister gestartet wurde. + if (!ProcessShellCommand(cmdInfo)) + return FALSE; + // Das einzige Fenster ist initialisiert und kann jetzt angezeigt und aktualisiert werden. + m_pMainWnd->ShowWindow(SW_SHOW); + m_pMainWnd->UpdateWindow(); + // Rufen Sie DragAcceptFiles nur auf, wenn eine Suffix vorhanden ist. + // In einer SDI-Anwendung ist dies nach ProcessShellCommand erforderlich + + /*Console start*/ + con.RedirectToConsole(0); + con.SetNumberOfColumns (120); + Sleep(10); + con.SetNumberOfLines (2500); + Sleep(10); + /*Console end*/ + + return TRUE; +} + + + +// CAboutDlg-Dialogfeld für Anwendungsbefehl 'Info' + +class CAboutDlg : public CDialog +{ +public: + CAboutDlg(); + +// Dialogfelddaten + enum { IDD = IDD_ABOUTBOX }; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung + +// Implementierung +protected: + DECLARE_MESSAGE_MAP() +}; + +CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) +{ +} + +void CAboutDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); +} + +BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) +END_MESSAGE_MAP() + +// Anwendungsbefehl zum Ausführen des Dialogfelds +void CGDE_3App::OnAppAbout() +{ + CAboutDlg aboutDlg; + aboutDlg.DoModal(); +} + + +// CGDE_3App Meldungshandler + + +void CGDE_3App::OnAppExit() +{ + // TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein. + + +} + +void CGDE_3App::OnFileOpen() +{ + // TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein. +} diff --git a/GDE_3_2008/GDE_3.h b/GDE_3_2008/GDE_3.h new file mode 100644 index 0000000..822ac76 --- /dev/null +++ b/GDE_3_2008/GDE_3.h @@ -0,0 +1,39 @@ +// GDE_3.h : Hauptheaderdatei für die GDE_3-Anwendung +// +#ifndef _GDE_3_H +#define _GDE_3_H +#pragma once + +#ifndef __AFXWIN_H__ + #error 'stdafx.h' muss vor dieser Datei in PCH eingeschlossen werden. +#endif + +#include "resource.h" // Hauptsymbole + + +// CGDE_3App: +// Siehe GDE_3.cpp für die Implementierung dieser Klasse +// +class CGDE_3View; + +class CGDE_3App : public CWinApp +{ +public: + CGDE_3App(); + CGDE_3View *vw; //actual view + BOOL m_stopflag; + + +// Überschreibungen +public: + virtual BOOL InitInstance(); + +// Implementierung + afx_msg void OnAppAbout(); + DECLARE_MESSAGE_MAP() + afx_msg void OnAppExit(); + afx_msg void OnFileOpen(); +}; + +extern CGDE_3App theApp; +#endif \ No newline at end of file diff --git a/GDE_3_2008/GDE_3.rc b/GDE_3_2008/GDE_3.rc new file mode 100644 index 0000000..6cf8630 --- /dev/null +++ b/GDE_3_2008/GDE_3.rc @@ -0,0 +1,396 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Deutsch (Deutschland) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +#ifdef _WIN32 +LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "#define _AFX_NO_SPLITTER_RESOURCES\r\n" + "#define _AFX_NO_OLE_RESOURCES\r\n" + "#define _AFX_NO_TRACKER_RESOURCES\r\n" + "#define _AFX_NO_PROPERTY_RESOURCES\r\n" + "\r\n" + "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)\r\n" + "LANGUAGE 7, 1\r\n" + "#pragma code_page(1252)\r\n" + "#include ""res\\GDE_3.rc2"" // Nicht mit Microsoft Visual C++ bearbeitete Ressourcen\r\n" + "#include ""afxres.rc"" // Standardkomponenten\r\n" + "#include ""afxprint.rc"" // Ressourcen für Drucken/Seitenansicht\r\n" + "#endif\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDR_MAINFRAME ICON "res\\GDE_3.ico" +IDR_GDE_3TYPE ICON "res\\GDE_3Doc.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +IDR_MAINFRAME BITMAP "res\\Toolbar.bmp" + +///////////////////////////////////////////////////////////////////////////// +// +// Toolbar +// + +IDR_MAINFRAME TOOLBAR 16, 15 +BEGIN + BUTTON ID_FILE_NEW + BUTTON ID_FILE_OPEN + BUTTON ID_FILE_SAVE + SEPARATOR + BUTTON ID_FILE_PRINT + BUTTON ID_APP_ABOUT + SEPARATOR + BUTTON ID_BUTTONZOOMOUT + BUTTON ID_BUTTONZOOMIN + BUTTON ID_BUTTONZOOMFIT + BUTTON ID_STARTBUTTON + BUTTON ID_STOPBUTTON +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDR_MAINFRAME MENU +BEGIN + POPUP "&Datei" + BEGIN + MENUITEM "&Neu\tStrg+N", ID_FILE_NEW + MENUITEM "Ö&ffnen...\tStrg+O", ID_FILE_OPEN + MENUITEM "&Speichern\tStrg+S", ID_FILE_SAVE + MENUITEM "Speichern &unter...", ID_FILE_SAVE_AS + MENUITEM SEPARATOR + MENUITEM "&Drucken...\tStrg+P", ID_FILE_PRINT + MENUITEM "&Seitenansicht", ID_FILE_PRINT_PREVIEW + MENUITEM "Dru&ckeinrichtung...", ID_FILE_PRINT_SETUP + MENUITEM SEPARATOR + MENUITEM "Letzte Datei", ID_FILE_MRU_FILE1, GRAYED + MENUITEM SEPARATOR + MENUITEM "&Beenden", ID_APP_EXIT + END + POPUP "&Bearbeiten" + BEGIN + MENUITEM "&Rückgängig\tStrg+Z", ID_EDIT_UNDO + MENUITEM SEPARATOR + MENUITEM "&Ausschneiden\tStrg+X", ID_EDIT_CUT + MENUITEM "&Kopieren\tStrg+C", ID_EDIT_COPY + MENUITEM "&Einfügen\tStrg+V", ID_EDIT_PASTE + END + POPUP "&Ansicht" + BEGIN + MENUITEM "&Symbolleiste", ID_VIEW_TOOLBAR + MENUITEM "Status&leiste", ID_VIEW_STATUS_BAR + END + POPUP "&Hilfe" + BEGIN + MENUITEM "&Info über GDE_3...", ID_APP_ABOUT + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Accelerator +// + +IDR_MAINFRAME ACCELERATORS +BEGIN + "N", ID_FILE_NEW, VIRTKEY, CONTROL + "O", ID_FILE_OPEN, VIRTKEY, CONTROL + "S", ID_FILE_SAVE, VIRTKEY, CONTROL + "P", ID_FILE_PRINT, VIRTKEY, CONTROL + "Z", ID_EDIT_UNDO, VIRTKEY, CONTROL + "X", ID_EDIT_CUT, VIRTKEY, CONTROL + "C", ID_EDIT_COPY, VIRTKEY, CONTROL + "V", ID_EDIT_PASTE, VIRTKEY, CONTROL + VK_BACK, ID_EDIT_UNDO, VIRTKEY, ALT + VK_DELETE, ID_EDIT_CUT, VIRTKEY, SHIFT + VK_INSERT, ID_EDIT_COPY, VIRTKEY, CONTROL + VK_INSERT, ID_EDIT_PASTE, VIRTKEY, SHIFT + VK_F6, ID_NEXT_PANE, VIRTKEY + VK_F6, ID_PREV_PANE, VIRTKEY, SHIFT +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_ABOUTBOX DIALOGEX 0, 0, 235, 55 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | + WS_SYSMENU +CAPTION "Info über GDE_3" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20 + LTEXT "GDE_3 Version 1.0",IDC_STATIC,40,10,119,8,SS_NOPREFIX + LTEXT "Copyright (C) 2007",IDC_STATIC,40,25,119,8 + DEFPUSHBUTTON "OK",IDOK,178,7,50,16,WS_GROUP +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040704e4" + BEGIN + VALUE "CompanyName", "TODO: " + VALUE "FileDescription", "TODO: " + VALUE "FileVersion", "1.0.0.1" + VALUE "InternalName", "GDE_3.exe" + VALUE "Copyright (C) 2007", "TODO: (c) . Alle Rechte vorbehalten." + VALUE "OriginalFilename", "GDE_3.exe" + VALUE "ProductName", "TODO: " + VALUE "ProductVersion", "1.0.0.1" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x407, 1252 + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_ABOUTBOX, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 228 + TOPMARGIN, 7 + BOTTOMMARGIN, 48 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDR_MAINFRAME "GDE_3\n\nGDE_3\n\n\nGDE3.Document\nGDE_3.Document" +END + +STRINGTABLE +BEGIN + AFX_IDS_APP_TITLE "GDE_3" + AFX_IDS_IDLEMESSAGE "Bereit" +END + +STRINGTABLE +BEGIN + ID_INDICATOR_EXT "ER" + ID_INDICATOR_CURPOS "x,y " + ID_INDICATOR_CAPS "UF" + ID_INDICATOR_NUM "NUM" + ID_INDICATOR_SCRL "RF" + ID_INDICATOR_OVR "ÜB" + ID_INDICATOR_REC "MA" +END + +STRINGTABLE +BEGIN + ID_FILE_NEW "Erstellt ein neues Dokument.\nNeu" + ID_FILE_OPEN "Öffnet ein vorhandenes Dokument.\nÖffnen" + ID_FILE_CLOSE "Schließt das aktive Dokument.\nSchließen" + ID_FILE_SAVE "Speichert das aktive Dokument.\nSpeichern" + ID_FILE_SAVE_AS "Speichert das aktive Dokument unter einem neuem Namen.\nSpeichern unter" + ID_FILE_PAGE_SETUP "Ändert die Druckoptionen.\nSeite einrichten" + ID_FILE_PRINT_SETUP "Ändert den Drucker und die Druckoptionen.\nDruckereinrichtung" + ID_FILE_PRINT "Druckt das aktive Dokument.\nDrucken" + ID_FILE_PRINT_PREVIEW "Zeigt ganze Seiten an.\nSeitenansicht" +END + +STRINGTABLE +BEGIN + ID_APP_ABOUT "Zeigt Programm-, Versions- und Copyrightinformationen an.\nInfo" + ID_APP_EXIT "Beendet die Anwendung und fordert zum Speichern der Dokumente auf.\nBeenden" +END + +STRINGTABLE +BEGIN + ID_FILE_MRU_FILE1 "Öffnet das Dokument." + ID_FILE_MRU_FILE2 "Öffnet das Dokument." + ID_FILE_MRU_FILE3 "Öffnet das Dokument." + ID_FILE_MRU_FILE4 "Öffnet das Dokument." + ID_FILE_MRU_FILE5 "Öffnet das Dokument." + ID_FILE_MRU_FILE6 "Öffnet das Dokument." + ID_FILE_MRU_FILE7 "Öffnet das Dokument." + ID_FILE_MRU_FILE8 "Öffnet das Dokument." + ID_FILE_MRU_FILE9 "Öffnet das Dokument." + ID_FILE_MRU_FILE10 "Öffnet das Dokument." + ID_FILE_MRU_FILE11 "Öffnet das Dokument." + ID_FILE_MRU_FILE12 "Öffnet das Dokument." + ID_FILE_MRU_FILE13 "Öffnet das Dokument." + ID_FILE_MRU_FILE14 "Öffnet das Dokument." + ID_FILE_MRU_FILE15 "Öffnet das Dokument." + ID_FILE_MRU_FILE16 "Öffnet das Dokument." +END + +STRINGTABLE +BEGIN + ID_NEXT_PANE "Wechselt zum nächsten Fensterbereich.\nNächster Bereich" + ID_PREV_PANE "Wechselt zum vorherigen Fensterbereich.\nVorheriger Bereich" +END + +STRINGTABLE +BEGIN + ID_WINDOW_SPLIT "Teilt das aktive Fenster in Bereiche.\nTeilen" +END + +STRINGTABLE +BEGIN + ID_EDIT_CLEAR "Löscht die Auswahl.\nLöschen" + ID_EDIT_CLEAR_ALL "Löscht alles.\nAlles löschen" + ID_EDIT_COPY "Kopiert die Auswahl in die Zwischenablage.\nKopieren" + ID_EDIT_CUT "Überträgt die Auswahl in die Zwischenablage.\nAusschneiden" + ID_EDIT_FIND "Sucht den angegebenen Text.\nSuchen" + ID_EDIT_PASTE "Fügt den Inhalt der Zwischenablage ein.\nEinfügen" + ID_EDIT_REPEAT "Wiederholt den letzten Vorgang.\nWiederholen" + ID_EDIT_REPLACE "Ersetzt den angegebenen Text.\nErsetzen" + ID_EDIT_SELECT_ALL "Markiert das gesamte Dokument.\nAlles auswählen" + ID_EDIT_UNDO "Macht den letzten Vorgang rückgängig.\nRückgängig" + ID_EDIT_REDO "Wiederholt den zuletzt rückgängig gemachten Vorgang.\nWiederherstellen" +END + +STRINGTABLE +BEGIN + ID_VIEW_TOOLBAR "Blendet die Symbolleiste ein oder aus.\nSymbolleiste" + ID_VIEW_STATUS_BAR "Blendet die Statusleiste ein oder aus.\nStatusleiste" +END + +STRINGTABLE +BEGIN + AFX_IDS_SCSIZE "Ändert die Fenstergröße." + AFX_IDS_SCMOVE "Ändert die Position des Fensters." + AFX_IDS_SCMINIMIZE "Minimiert das Fenster." + AFX_IDS_SCMAXIMIZE "Maximiert das Fenster." + AFX_IDS_SCNEXTWINDOW "Wechselt zum nächsten Dokumentfenster." + AFX_IDS_SCPREVWINDOW "Wechselt zum vorherigen Dokumentfenster." + AFX_IDS_SCCLOSE "Schließt das aktive Fenster und fordert zum Speichern des Dokuments auf." +END + +STRINGTABLE +BEGIN + AFX_IDS_SCRESTORE "Stellt die ursprüngliche Fenstergröße wieder her." + AFX_IDS_SCTASKLIST "Aktiviert die Taskliste." +END + +STRINGTABLE +BEGIN + AFX_IDS_PREVIEW_CLOSE "Beendet die Seitenansicht.\nSeitenansicht beenden" +END + +STRINGTABLE +BEGIN + ID_BUTTONZOOMOUT "Zoom Out" + ID_BUTTONZOOMIN "Zoom In" + ID_BUTTONZOOMFIT "Originale Size" + ID_STARTBUTTON "Start the Application" + ID_STOPBUTTON "Stop the Application" +END + +#endif // Deutsch (Deutschland) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +#define _AFX_NO_SPLITTER_RESOURCES +#define _AFX_NO_OLE_RESOURCES +#define _AFX_NO_TRACKER_RESOURCES +#define _AFX_NO_PROPERTY_RESOURCES + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +LANGUAGE 7, 1 +#pragma code_page(1252) +#include "res\GDE_3.rc2" // Nicht mit Microsoft Visual C++ bearbeitete Ressourcen +#include "afxres.rc" // Standardkomponenten +#include "afxprint.rc" // Ressourcen für Drucken/Seitenansicht +#endif + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/GDE_3_2008/GDE_3.sln b/GDE_3_2008/GDE_3.sln new file mode 100644 index 0000000..16c53eb --- /dev/null +++ b/GDE_3_2008/GDE_3.sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GDE_3", "GDE_3.vcxproj", "{B0DC7B0A-75D1-4BF6-9861-3C4056C4AA6B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B0DC7B0A-75D1-4BF6-9861-3C4056C4AA6B}.Debug|Win32.ActiveCfg = Debug|Win32 + {B0DC7B0A-75D1-4BF6-9861-3C4056C4AA6B}.Debug|Win32.Build.0 = Debug|Win32 + {B0DC7B0A-75D1-4BF6-9861-3C4056C4AA6B}.Release|Win32.ActiveCfg = Release|Win32 + {B0DC7B0A-75D1-4BF6-9861-3C4056C4AA6B}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/GDE_3_2008/GDE_3.sln.old b/GDE_3_2008/GDE_3.sln.old new file mode 100644 index 0000000..b4747e7 --- /dev/null +++ b/GDE_3_2008/GDE_3.sln.old @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GDE_3", "GDE_3.vcproj", "{B0DC7B0A-75D1-4BF6-9861-3C4056C4AA6B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B0DC7B0A-75D1-4BF6-9861-3C4056C4AA6B}.Debug|Win32.ActiveCfg = Debug|Win32 + {B0DC7B0A-75D1-4BF6-9861-3C4056C4AA6B}.Debug|Win32.Build.0 = Debug|Win32 + {B0DC7B0A-75D1-4BF6-9861-3C4056C4AA6B}.Release|Win32.ActiveCfg = Release|Win32 + {B0DC7B0A-75D1-4BF6-9861-3C4056C4AA6B}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/GDE_3_2008/GDE_3.suo.old b/GDE_3_2008/GDE_3.suo.old new file mode 100644 index 0000000000000000000000000000000000000000..f98116af377f1f4f6617199c504246645b9e9922 GIT binary patch literal 41984 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GDE_3_2008/GDE_3.vcproj.8.00.old b/GDE_3_2008/GDE_3.vcproj.8.00.old new file mode 100644 index 0000000..16941a3 --- /dev/null +++ b/GDE_3_2008/GDE_3.vcproj.8.00.old @@ -0,0 +1,376 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GDE_3_2008/GDE_3.vcxproj b/GDE_3_2008/GDE_3.vcxproj new file mode 100644 index 0000000..2d36a10 --- /dev/null +++ b/GDE_3_2008/GDE_3.vcxproj @@ -0,0 +1,173 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Template + Win32 + + + + {B0DC7B0A-75D1-4BF6-9861-3C4056C4AA6B} + MFCProj + + + + Application + Static + MultiByte + + + Application + Static + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + Debug\ + Debug\ + true + Release\ + Release\ + false + + + + _DEBUG;%(PreprocessorDefinitions) + false + + + Disabled + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + true + Use + Level3 + EditAndContinue + + + _DEBUG;%(PreprocessorDefinitions) + 0x0407 + $(IntDir);%(AdditionalIncludeDirectories) + + + true + Windows + false + + + MachineX86 + + + + + NDEBUG;%(PreprocessorDefinitions) + false + + + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + false + MultiThreaded + true + Use + Level3 + ProgramDatabase + + + NDEBUG;%(PreprocessorDefinitions) + 0x0407 + $(IntDir);%(AdditionalIncludeDirectories) + + + true + Windows + true + true + false + + + MachineX86 + + + + + + + + + + + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + + + + + + + + + + + \ No newline at end of file diff --git a/GDE_3_2008/GDE_3.vcxproj.filters b/GDE_3_2008/GDE_3.vcxproj.filters new file mode 100644 index 0000000..608a703 --- /dev/null +++ b/GDE_3_2008/GDE_3.vcxproj.filters @@ -0,0 +1,137 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx + + + {1fd09ea8-21ab-4cb5-9115-9b0c2d0ff524} + + + {9be85dd5-64a4-4050-89fa-728d697c9169} + + + + + Quelldateien + + + Quelldateien + + + Quelldateien + + + Quelldateien + + + Quelldateien + + + Quelldateien + + + Graphics + + + Graphics + + + Graphics + + + Console + + + Quelldateien + + + Quelldateien + + + + + Headerdateien + + + Headerdateien + + + Headerdateien + + + Headerdateien + + + Headerdateien + + + Headerdateien + + + Headerdateien + + + Graphics + + + Graphics + + + Graphics + + + Graphics + + + Graphics + + + Graphics + + + Console + + + Headerdateien + + + Headerdateien + + + Headerdateien + + + + + Ressourcendateien + + + Ressourcendateien + + + Ressourcendateien + + + Ressourcendateien + + + + + + Ressourcendateien + + + + + + \ No newline at end of file diff --git a/GDE_3_2008/GDE_3Doc.cpp b/GDE_3_2008/GDE_3Doc.cpp new file mode 100644 index 0000000..1962acc --- /dev/null +++ b/GDE_3_2008/GDE_3Doc.cpp @@ -0,0 +1,83 @@ +// GDE_3Doc.cpp : Implementierung der Klasse CGDE_3Doc +// + +#include "stdafx.h" +#include "GDE_3.h" + +#include "GDE_3Doc.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + +extern WORD MAX_X; +extern WORD MAX_Y; + + +// CGDE_3Doc + +IMPLEMENT_DYNCREATE(CGDE_3Doc, CDocument) + +BEGIN_MESSAGE_MAP(CGDE_3Doc, CDocument) +END_MESSAGE_MAP() + + +// CGDE_3Doc Erstellung/Zerstörung + +CGDE_3Doc::CGDE_3Doc() +{ + // TODO: Hier Code für One-Time-Konstruktion einfügen + +} + +CGDE_3Doc::~CGDE_3Doc() +{ + aShape.RemoveAll(); // Das Array vollstaendig leeren. + +} + +BOOL CGDE_3Doc::OnNewDocument() +{ + if (!CDocument::OnNewDocument()) + return FALSE; + + // TODO: Hier Code zur Reinitialisierung einfügen + // (SDI-Dokumente verwenden dieses Dokument) + + return TRUE; +} + + + + +// CGDE_3Doc Serialisierung + +void CGDE_3Doc::Serialize(CArchive& ar) +{ + if (ar.IsStoring()) + { + // TODO: Hier Code zum Speichern einfügen + } + else + { + // TODO: Hier Code zum Laden einfügen + } +} + + +// CGDE_3Doc Diagnose + +#ifdef _DEBUG +void CGDE_3Doc::AssertValid() const +{ + CDocument::AssertValid(); +} + +void CGDE_3Doc::Dump(CDumpContext& dc) const +{ + CDocument::Dump(dc); +} +#endif //_DEBUG + + +// CGDE_3Doc-Befehle diff --git a/GDE_3_2008/GDE_3Doc.h b/GDE_3_2008/GDE_3Doc.h new file mode 100644 index 0000000..44e027f --- /dev/null +++ b/GDE_3_2008/GDE_3Doc.h @@ -0,0 +1,50 @@ +// GDE_3Doc.h : Schnittstelle der Klasse CGDE_3Doc +// +#ifndef _GDE_3DOC_H +#define _GDE_3DOC_H + +#include "graphics\shape.h" +#include "graphics\pointerarray.h" +#include "graphics\dib.h" + +#pragma once + +class CGDE_3Doc : public CDocument +{ +protected: // Nur aus Serialisierung erstellen + CGDE_3Doc(); + DECLARE_DYNCREATE(CGDE_3Doc) + +// Attribute +public: + //gg CDib m_dib; + // Double buffering + CBitmap memoryBmp; // Bitmap im Speicher. + CDC buffer; // Geraetekontext-Objekt + int nShapePos; // Position des Grafikobjekts ab dem neu gezeichnet wird. + CPointerArray aShape; + +// Operationen +public: + +// Überschreibungen + public: + virtual BOOL OnNewDocument(); + virtual void Serialize(CArchive& ar); + +// Implementierung +public: + virtual ~CGDE_3Doc(); +#ifdef _DEBUG + virtual void AssertValid() const; + virtual void Dump(CDumpContext& dc) const; +#endif + +protected: + +// Generierte Funktionen für die Meldungstabellen +protected: + DECLARE_MESSAGE_MAP() +}; +#endif + diff --git a/GDE_3_2008/GDE_3View.cpp b/GDE_3_2008/GDE_3View.cpp new file mode 100644 index 0000000..f1e6ff2 --- /dev/null +++ b/GDE_3_2008/GDE_3View.cpp @@ -0,0 +1,433 @@ +// 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->nShapePosaShape.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); +} diff --git a/GDE_3_2008/GDE_3View.h b/GDE_3_2008/GDE_3View.h new file mode 100644 index 0000000..f2e7484 --- /dev/null +++ b/GDE_3_2008/GDE_3View.h @@ -0,0 +1,83 @@ +// GDE_3View.h : Schnittstelle der Klasse CGDE_3View +// +#ifndef _GDE_3VIEW_H +#define _GDE_3VIEW_H + +#pragma once + +extern UINT StartGDE(LPVOID lpv); + +class CGDE_3View : public CScrollView +{ +protected: // Nur aus Serialisierung erstellen + CGDE_3View(); + DECLARE_DYNCREATE(CGDE_3View) + +// Attribute +public: + CGDE_3Doc* GetDocument() const; + BYTE MouseClick; // Speichert Tastendruecke mit der Maus. + POINT MousePoint; // Position des Mauszeigers waehrend dem Klicken. + + // zooming + float m_fXScale; + float m_fYScale; + float m_fDelta; + int m_nMapMode; + + CWinThread* uthread; + +// Operationen +public: +void WRSetScrollSizes (int mode, CSize si) +{ + ((CGDE_3View *)FromHandle((theApp.vw->m_hWnd)))->SetScrollSizes(mode, si); + ((CGDE_3View *)FromHandle((theApp.vw->m_hWnd)))->Invalidate(); +} +// Überschreibungen + public: + virtual void OnDraw(CDC* pDC); // Überladen, um diese Ansicht darzustellen +virtual BOOL PreCreateWindow(CREATESTRUCT& cs); +protected: + virtual void OnInitialUpdate(); // Erster Aufruf nach Erstellung + virtual BOOL OnPreparePrinting(CPrintInfo* pInfo); + virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo); + virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo); + +// Implementierung +public: + virtual ~CGDE_3View(); +#ifdef _DEBUG + virtual void AssertValid() const; + virtual void Dump(CDumpContext& dc) const; +#endif + +protected: + +// Generierte Funktionen für die Meldungstabellen +protected: + afx_msg void OnStopButton(); + afx_msg void OnStartButton(); + afx_msg void OnButtonzoomout(); + afx_msg void OnButtonzoomin(); + afx_msg void OnButtonzoomfit(); + DECLARE_MESSAGE_MAP() +public: + afx_msg void OnFileSave(); + afx_msg void OnLButtonDown(UINT nFlags, CPoint point); + afx_msg void OnLButtonUp(UINT nFlags, CPoint point); + afx_msg void OnRButtonDown(UINT nFlags, CPoint point); +// afx_msg int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message); + afx_msg void OnMouseMove(UINT nFlags, CPoint point); + afx_msg void OnDestroy(); + afx_msg void OnFileOpen(); + afx_msg void OnFileSaveAs(); + afx_msg void OnFileNew(); +}; + +#ifndef _DEBUG // Debugversion in GDE_3View.cpp +inline CGDE_3Doc* CGDE_3View::GetDocument() const + { return reinterpret_cast(m_pDocument); } +#endif + +#endif diff --git a/GDE_3_2008/Graphics/BaseException.h b/GDE_3_2008/Graphics/BaseException.h new file mode 100644 index 0000000..238931f --- /dev/null +++ b/GDE_3_2008/Graphics/BaseException.h @@ -0,0 +1,69 @@ +// BaseException.h: interface for the CBaseException class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_BASEEXCEPTION_H__0902F453_576E_48BB_90ED_7FC4CA666A82__INCLUDED_) +#define AFX_BASEEXCEPTION_H__0902F453_576E_48BB_90ED_7FC4CA666A82__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include +#include +#include +using namespace std; + +#pragma warning( disable : 4290 ) // disable Exception Specification warning +#pragma warning( disable : 4996 ) // disable sprintf warning + +#define LOCATION Location(__FILE__, __LINE__) + +/** This function returns string object of Error filename and line number */ +inline string Location(string file, int lineNo) { + char buf[64]; + sprintf(buf, " line no. %d", lineNo); + + return file + buf; +} + +/** Base class of All Exception Classes. +* +* BaseException and all derivative classes have 3 Constructs. +* +* ex) You can throw BaseException object like this. +* +* 1. throw BaseException(); -> message would be "Exception" +* +* 2. throw BaseException(_T("Disaster")); -> message would be "Disaster" +* +* 3. throw BaseException(_T("Disaster"), LOCATION); ->message would be "Disaster SomeFile line no 11" +*/ +class BaseException : public runtime_error +{ +public: + /** Default Constructor + * @param None + * @exceptions None + */ + BaseException() throw() : runtime_error("error") {} + /** Constructor with string description + * @param message - This should be a useful message for error tracking. + * @exceptions None + */ + BaseException(string message) throw() : runtime_error(message) {} + /** Constructor with string description and error location + * @param message - This should be a useful message for error tracking. + * @param location - Location where Exception has occrurred. You can use LOCATION macro here. + * @exceptions None + */ + BaseException(string message, string location) throw() : runtime_error(message+location) {} + /** This function outputs the error message in some output stream + * @param os - some output stream + * @return None + * @exceptions None + */ + void Log(ostream& os) throw() { os << what() << endl; } +}; + +#endif // !defined(AFX_BASEEXCEPTION_H__0902F453_576E_48BB_90ED_7FC4CA666A82__INCLUDED_) diff --git a/GDE_3_2008/Graphics/Dib.cpp b/GDE_3_2008/Graphics/Dib.cpp new file mode 100644 index 0000000..28b9688 --- /dev/null +++ b/GDE_3_2008/Graphics/Dib.cpp @@ -0,0 +1,331 @@ +// Dib.cpp: implementation of the CDib class. +// +////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "Dib.h" + +#ifdef _DEBUG +#undef THIS_FILE +static char THIS_FILE[]=__FILE__; +#define new DEBUG_NEW +#endif + +CDib::CDib() throw() +{ + m_pBmpFileHeader = NULL; + m_pBmpInfo = NULL; + m_pBmpInfoHeader = NULL; + m_pRGBTable = NULL; + m_pDibBits = NULL; + m_uiNumColors = 0; +} + +CDib::~CDib() +{ + Clear(); +} +BOOL CDib::DibLoaded() const throw() +{ + return (m_pBmpInfoHeader!=NULL); +} +CSize CDib::GetDimensions() const throw() +{ + if (!DibLoaded()) return CSize(0,0); + return CSize((int)m_pBmpInfoHeader->biWidth,(int)m_pBmpInfoHeader->biHeight); +} + +void CDib::Clear() throw() +{ + if(m_pBmpFileHeader != NULL) { + delete[] m_pBmpFileHeader; + m_pBmpFileHeader = NULL; + } + if(m_pBmpInfo != NULL) { + delete[] m_pBmpInfo; + m_pBmpInfo = NULL; + } + if(m_pDibBits != NULL) { + delete[] m_pDibBits; + m_pDibBits = NULL; + } +} + +void CDib::Load(CString fileName) throw(CImageException) +{ + CFile file(fileName, CFile::modeRead | CFile::shareDenyNone); + Load(&file); +} + +void CDib::Load(CFile* pFile) throw(CImageException) +{ + Clear(); + + m_pBmpFileHeader = new BITMAPFILEHEADER; + pFile->Read(static_cast(m_pBmpFileHeader), sizeof(BITMAPFILEHEADER)); + + if(m_pBmpFileHeader->bfType != 0x4d42) { + Clear(); + pFile->Close(); + throw CImageException(_T("Failed to load document")); + } else { + DWORD dwLength; + dwLength = m_pBmpFileHeader->bfOffBits - sizeof(BITMAPFILEHEADER); + + m_pBmpInfo = reinterpret_cast(new BYTE[dwLength]); + pFile->Read(static_cast(m_pBmpInfo), dwLength); + m_pBmpInfoHeader = reinterpret_cast(m_pBmpInfo); + + if((m_pBmpInfoHeader->biClrUsed == 0)) + m_uiNumColors = 1 << m_pBmpInfoHeader->biBitCount; + else + m_uiNumColors = m_pBmpInfoHeader->biClrUsed; + + if(m_pBmpInfoHeader->biClrUsed == 0) + m_pBmpInfoHeader->biClrUsed = m_uiNumColors; + + if(m_uiNumColors <= 256) + m_pRGBTable = reinterpret_cast(reinterpret_cast(m_pBmpInfo) + m_pBmpInfoHeader->biSize); + + unsigned int dwDibLength = (unsigned int)pFile->GetLength() - m_pBmpFileHeader->bfOffBits / 4; + m_pDibBits = new BYTE[dwDibLength]; + pFile->Read(static_cast(m_pDibBits), dwDibLength); + } +} + +void CDib::Create(CBitmap* pBitmap) throw(CImageException) +{ + BITMAP Bitmap; + int rc = pBitmap->GetBitmap(&Bitmap); + if(rc == 0) + throw CImageException(_T("Can't get BITMAP from CBitmap*")); + + int iWidthBytes = ((Bitmap.bmWidth * Bitmap.bmBitsPixel + 15) & ~15) >> 3 ; + DWORD dwImgSize = iWidthBytes * Bitmap.bmHeight; + + // File header + m_pBmpFileHeader = new BITMAPFILEHEADER; + m_pBmpFileHeader->bfType = 0x4d42; + m_pBmpFileHeader->bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) + dwImgSize; + m_pBmpFileHeader->bfReserved1 = 0; + m_pBmpFileHeader->bfReserved2 = 0; + m_pBmpFileHeader->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) + sizeof(RGBQUAD); + + // Bitmap Info header - no support for palette mode + m_pBmpInfo = new BITMAPINFO; + m_pBmpInfoHeader = reinterpret_cast(m_pBmpInfo); + ::ZeroMemory(m_pBmpInfoHeader, sizeof(BITMAPINFOHEADER)); + m_pBmpInfoHeader->biSize = sizeof(BITMAPINFOHEADER); + m_pBmpInfoHeader->biWidth = Bitmap.bmWidth; + m_pBmpInfoHeader->biHeight = Bitmap.bmHeight; + m_pBmpInfoHeader->biPlanes = 1; + m_pBmpInfoHeader->biBitCount = Bitmap.bmPlanes * Bitmap.bmBitsPixel; + m_pBmpInfoHeader->biSizeImage = dwImgSize; + + // Color Table + if((m_pBmpInfoHeader->biClrUsed == 0)) + m_uiNumColors = 1 << (m_pBmpInfoHeader->biBitCount-1); + else + m_uiNumColors = m_pBmpInfoHeader->biClrUsed; + if(m_pBmpInfoHeader->biClrUsed == 0) + m_pBmpInfoHeader->biClrUsed = m_uiNumColors; + if(m_uiNumColors <= 256) { + Clear(); + throw CImageException("Palette mode is not supported"); + } + // Data bits + m_pDibBits = new BYTE[dwImgSize]; + pBitmap->GetBitmapBits(dwImgSize, m_pDibBits); + LPBYTE pTemp = new BYTE[iWidthBytes]; + for(int i=0; i 8); + + Clear(); + + int iWidthBytes = ((width * bitCount + 15) & ~15) >> 3 ; + DWORD dwImgSize = iWidthBytes * height; + + // File header + m_pBmpFileHeader = new BITMAPFILEHEADER; + m_pBmpFileHeader->bfType = 0x4d42; + m_pBmpFileHeader->bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) + dwImgSize; + m_pBmpFileHeader->bfReserved1 = 0; + m_pBmpFileHeader->bfReserved2 = 0; + m_pBmpFileHeader->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) + sizeof(RGBQUAD); + + // Bitmap Info header - no support for palette mode + m_pBmpInfo = new BITMAPINFO; + m_pBmpInfoHeader = reinterpret_cast(m_pBmpInfo); + ::ZeroMemory(m_pBmpInfoHeader, sizeof(BITMAPINFOHEADER)); + m_pBmpInfoHeader->biSize = sizeof(BITMAPINFOHEADER); + m_pBmpInfoHeader->biWidth = width; + m_pBmpInfoHeader->biHeight = height; + m_pBmpInfoHeader->biPlanes = 1; + m_pBmpInfoHeader->biBitCount = bitCount; + m_pBmpInfoHeader->biSizeImage = dwImgSize; + + // Color Table + if((m_pBmpInfoHeader->biClrUsed == 0)) + m_uiNumColors = 1 << m_pBmpInfoHeader->biBitCount; + else + m_uiNumColors = m_pBmpInfoHeader->biClrUsed; + if(m_pBmpInfoHeader->biClrUsed == 0) + m_pBmpInfoHeader->biClrUsed = m_uiNumColors; + + if(m_uiNumColors <= 256) { + Clear(); + throw CImageException("Palette mode is not supported"); + } + // data bits + m_pDibBits = pData; +} + +void CDib::Save(CString fileName) throw(CImageException) +{ + CFile file; + if(file.Open(fileName, CFile::modeWrite | CFile::modeCreate) == 0) + throw CImageException(_T("Cannot open a file")); + Save(&file); +} + +void CDib::Save(CFile* pFile) throw(CImageException) +{ + pFile->Write(static_cast(m_pBmpFileHeader), sizeof(BITMAPFILEHEADER)); + DWORD dwLength; + if(m_uiNumColors <= 256) + dwLength = sizeof(BITMAPINFOHEADER) + m_uiNumColors*sizeof(RGBQUAD); + else + dwLength = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD); + pFile->Write(static_cast(m_pBmpInfo), dwLength); + + DWORD dwImgSize = (((GetWidth() * m_pBmpInfoHeader->biBitCount + 15) & ~15) >> 3) * GetHeight() ; + pFile->Write(static_cast(m_pDibBits), dwImgSize); +} + +void CDib::Draw(CDC* pdc, int x, int y, double scale, DWORD dwROPCode) const throw(CImageException) { + if (!this->DibLoaded() ) return; + if(!m_pBmpInfo) + throw CImageException(); + int nScanLines = ::StretchDIBits(pdc->GetSafeHdc(), x, y, (int)(GetWidth()*scale) , (int)(GetHeight()*scale), 0, 0, GetWidth(), GetHeight(), + m_pDibBits, m_pBmpInfo, DIB_RGB_COLORS, dwROPCode); + if(nScanLines == GDI_ERROR) + throw CImageException(_T("CDib::Draw exception")); +} + +void CDib::Draw(CDC* pdc, int x, int y, int width, int height, DWORD dwROPCode) const throw(CImageException) { + if(!m_pBmpInfo) + throw CImageException(); + int nScanLines = ::StretchDIBits(pdc->GetSafeHdc(), x, y, width , height, 0, 0, GetWidth(), GetHeight(), + m_pDibBits, m_pBmpInfo, DIB_RGB_COLORS, dwROPCode); + if(nScanLines == GDI_ERROR) + throw CImageException(_T("CDib::Draw exception")); +} + +COLORREF CDib::GetPixel(int x, int y) const throw() { + int width = GetWidth(); + int height = GetHeight(); + + BYTE* pDibBits = m_pDibBits; + BYTE Red; + BYTE Green; + BYTE Blue; + int offset; + + SHORT* psDibBits; // for 16 bit + BYTE Index; + RGBQUAD* prgb; + + int bpp = GetBPP(); + switch(bpp) { + case 1: + case 2: + case 4: + case 8: + offset = width * (height - 1 - y) + x + 1; + pDibBits += offset; + Index = *pDibBits; + prgb = m_pRGBTable + Index; + Red = prgb->rgbRed; + Green = prgb->rgbGreen; + Blue = prgb->rgbBlue; + break; + case 16: // assuming 565 + offset = width * 2 * (height - 1 - y) + (x + 1) * 2; + pDibBits += offset; + psDibBits = (SHORT*)pDibBits; + Blue = *psDibBits >> 11; + Green = (*psDibBits >> 5) & 63; + Red = *psDibBits & 127; + break; + case 24: + offset = width * 3 * (height -1 - y) + (x + 1) * 3; + pDibBits += offset; + Blue = *pDibBits; + ++pDibBits; + Green = *pDibBits; + ++pDibBits; + Red = *pDibBits; + break; + case 32: + offset = width * 4 * (height -1 - y) + (x + 1) * 4; + pDibBits += offset; + Blue = *pDibBits; + ++pDibBits; + Green = *pDibBits; + ++pDibBits; + Red = *pDibBits; + break; + default: + break; + } + + return RGB(Red, Green, Blue); +} + +void CDib::SetPixel(int x, int y, COLORREF col) throw() { + int width = GetWidth(); + int height = GetHeight(); + + BYTE* pDibBits = m_pDibBits; + int offset; + + int bpp = GetBPP(); + switch(bpp) { + case 1: + case 2: + case 4: + case 8: + case 16: + break; // no support for these modes... yet. + case 24: + offset = width * 3 * (height -1 - y) + (x + 1) * 3; + pDibBits += offset; + *pDibBits = GetBValue(col); + ++pDibBits; + *pDibBits = GetGValue(col); + ++pDibBits; + *pDibBits = GetRValue(col); + break; + case 32: + offset = width * 4 * (height -1 - y) + (x + 1) * 4; + pDibBits += offset; + *pDibBits = GetBValue(col); + ++pDibBits; + *pDibBits = GetGValue(col); + ++pDibBits; + *pDibBits = GetRValue(col); + break; + default: + break; + } +} \ No newline at end of file diff --git a/GDE_3_2008/Graphics/Dib.h b/GDE_3_2008/Graphics/Dib.h new file mode 100644 index 0000000..ec13b21 --- /dev/null +++ b/GDE_3_2008/Graphics/Dib.h @@ -0,0 +1,76 @@ +// Dib.h: interface for the CDib class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_DIB_H__3C441908_83F8_4989_BEB1_7F05D9BD732E__INCLUDED_) +#define AFX_DIB_H__3C441908_83F8_4989_BEB1_7F05D9BD732E__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "Image.h" + +/** Bitmap handling Class. +* +* This class handles bmp objects. Normally you make CImage object for this. +* +* ex) CImage* pImage = new CDib; +* +* pImage->Draw(pDC); +*/ +class CDib : public CImage +{ +public: + /** Constructor. Uses 2 part initialization + * @exceptions None + */ + CDib() throw(); + + /** Destructor. + * Clean all the resources here + */ + virtual ~CDib(); + + virtual void Create(int width, int height, LPBYTE pData, int bitCount=24) throw(CImageException); + virtual void Load(CString fileName) throw(CImageException); + virtual void Load(CFile* pFile) throw(CImageException); + virtual void Save(CString fileName) throw(CImageException); + virtual void Save(CFile* pFile) throw(CImageException); + virtual void Draw(CDC* pdc, int x = 0, int y = 0, double scale = 1.0, DWORD dwROPCode = SRCCOPY) const throw(CImageException); + virtual void Draw(CDC* pdc, int x, int y, int width, int height, DWORD dwROPCode = SRCCOPY) const throw(CImageException); + virtual UINT GetWidth() const throw() { return m_pBmpInfoHeader->biWidth; } + virtual UINT GetHeight() const throw() { return m_pBmpInfoHeader->biHeight; } + virtual UINT GetBPP() const throw() { return m_pBmpInfoHeader->biBitCount; } + virtual COLORREF GetPixel(int x, int y) const throw(); + virtual LPBYTE GetDibBits() const throw() { return m_pDibBits; } + virtual BOOL DibLoaded() const throw(); + virtual CSize GetDimensions() const throw(); + + /** Create image from CBitmap pointer + * @param pBitmap - CBitmap pointer(DDB) + * @return None + * @exceptions CImageException + */ + void Create(CBitmap* pBitmap) throw(CImageException); + + /** Set COLORREF value of specified location + * @param x - x location + * @param y - y location + * @param col - COLORREF value to set + * @return None + * @exceptions None + */ + void SetPixel(int x, int y, COLORREF col) throw(); +protected: +private: + void Clear() throw(); + LPBITMAPFILEHEADER m_pBmpFileHeader; + LPBITMAPINFO m_pBmpInfo; + LPBITMAPINFOHEADER m_pBmpInfoHeader; + LPRGBQUAD m_pRGBTable; + LPBYTE m_pDibBits; + UINT m_uiNumColors; +}; + +#endif // !defined(AFX_DIB_H__3C441908_83F8_4989_BEB1_7F05D9BD732E__INCLUDED_) diff --git a/GDE_3_2008/Graphics/Graphicfunctions.cpp b/GDE_3_2008/Graphics/Graphicfunctions.cpp new file mode 100644 index 0000000..bcd52d6 --- /dev/null +++ b/GDE_3_2008/Graphics/Graphicfunctions.cpp @@ -0,0 +1,253 @@ +// Graphicfunctions.cpp : implementation of the GDE functions +// +///////////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "shape.h" +#include "pointerarray.h" +#include "dib.h" +#include "..\mainfrm.h" +#include "..\GDE_3.h" +#include "..\GDE_3Doc.h" +#include "..\GDE_3View.h" + +#include "Graphicfunctions.h" + +#pragma once + + +extern CGDE_3App theApp; +void DoEvents() +{ + MSG oMSG; + while(::PeekMessage(&oMSG, NULL,0,0,PM_NOREMOVE)) + if(::GetMessage(&oMSG,NULL,0,0)) + { + ::TranslateMessage(&oMSG); + ::DispatchMessage(&oMSG); + } + else break; +} +// Makro Objekte von CShape abgeleiteten Klassen anzulegen und +// einen Zeiger darauf im Array aShape zu speichern. +#define __add_to_aShape(classname) theApp.vw->GetDocument()->aShape.Add( new classname); +void drawtobuffer() +{ + CGDE_3Doc *pDoc=theApp.vw->GetDocument(); + int siz = (int)(pDoc->aShape.GetSize()); + pDoc->aShape[siz-1]->Draw(&pDoc->buffer); +} + + +// Koordinaten und Fenstergroesse +WORD MAX_X = 600; // maximale x-Koordinate +WORD MAX_Y = 400; // maximale y-Koordinate + +void set_windowpos(int x, int y, int b, int h) +{ + extern CGDE_3App theApp; + + CRect client_rect, window_rect, status_rect, view_rect; + + theApp.m_pMainWnd->GetWindowRect(&window_rect); // Die Windowgroesse ermitteln. + int hhw=window_rect.Height(); + int www=window_rect.Width(); + + theApp.vw->GetWindowRect(&view_rect); //Die Viewgroesse ermitteln. + int hhv=view_rect.Height(); + int wwv=view_rect.Width(); + + + // Zur Breite den Bereich ausserhalb des clients hinzurechnen. + // Zusaetzlich muessen noch 3 addiert werden, da sonst die scrollbars gezeigt werden. + b += www - wwv + 5; + h += hhw - hhv + 5; + + theApp.m_pMainWnd->MoveWindow(x, y, b, h); + theApp.m_pMainWnd->Invalidate(); +} +void get_windowsize(int *b, int *h) +{ + RECT rect; + theApp.vw->GetClientRect(&rect); //Die Clientgroesse ermitteln + *b = rect.right; + *h = rect.bottom; +} +void set_drawarea(int b, int h) +{ + MAX_X = b; + MAX_Y = h; + + while (theApp.vw == NULL) Sleep(100);// Warten bis CGDEView konstruiert ist. + Sleep(100); + theApp.vw->WRSetScrollSizes(MM_TEXT, CSize(MAX_X,MAX_Y)); // Anpassen des Bereiches der scrollbars. + + theApp.vw->GetDocument()->memoryBmp.DeleteObject(); // Das alte Bitmap im Speicher loeschen. + CDC *pdc=theApp.vw->GetDC(); + if(!theApp.vw->GetDocument()->memoryBmp.CreateCompatibleBitmap(pdc,MAX_X, MAX_Y)){ + AfxMessageBox("Cannot create Bitmap",MB_OK); + } + theApp.vw->GetDocument()->buffer.SelectObject( &theApp.vw->GetDocument()->memoryBmp ); // Das Speicher-Bitmap als Geraetekontext auswaehlen. + theApp.vw->GetDocument()->buffer.PatBlt(0, 0, MAX_X, MAX_Y, WHITENESS); // Den ganzen Puffer weiss malen. + theApp.vw->GetDocument()->nShapePos = 0; // Zuruecksetzen der Position auf 0, um ein + // Neuzeichnen aller Objekte zu gewaehrleisten. + theApp.vw->Invalidate(TRUE); // Zeichenbereich aktualisieren. + // Der gesamte Zeichenbereich wird gelosescht. +} +void get_drawarea(int *b, int *h) +{ + *b = MAX_X; + *h = MAX_Y; +} + +// Bildpunkte und Bildschirmbereiche +void pixel(int x, int y, int color) +{ + __add_to_aShape( CPixel(x, y, color) ); + drawtobuffer(); + +} + +void fill (int x, int y, int color1, int color2) +{ + __add_to_aShape( CFill(x, y, color1, color2) ); + drawtobuffer(); + +} + + +// Linien +void moveto(int x, int y) +{ + __add_to_aShape( CMoveTo(x, y) ); + drawtobuffer(); + +} + +void lineto(int x, int y, int color) +{ + __add_to_aShape( CLineTo(x, y, color) ); + drawtobuffer(); + +} + +void line(int x1, int y1, int x2, int y2, int color) +{ + __add_to_aShape( CLine(x1, y1, x2, y2, color) ); + drawtobuffer(); + +} + + +// Rechtecke +void rectangle(int x1, int y1, int x2, int y2, int cframe, int cfill) +{ + __add_to_aShape( CRectangle( CRect(x1, y1, x2, y2), cframe, cfill) ); + drawtobuffer(); + +} + + +// Kreise und Ellipsen +void ellipse(int x1, int y1, int x2, int y2, int cframe, int cfill) +{ + __add_to_aShape( CEllipse( CRect(x1, y1, x2, y2), cframe, cfill) ); + drawtobuffer(); + +} + + +// Text +void text(int x, int y, int size, int color, char *format, ...) +{ + va_list argptr; + va_start(argptr, format); + __add_to_aShape( CText(x, y, size*10, color, format, argptr) ); + drawtobuffer(); + +} +void text(int x, int y, int size, int color, int bkcolor, char *format, ...) +{ + va_list argptr; + va_start(argptr, format); + __add_to_aShape( CText(x, y, size*10, color, bkcolor, format, argptr) ); + drawtobuffer(); + +} +void text(int x, int y, int size, int color, int angle, int align, char *format, ...) +{ + va_list argptr; + va_start(argptr, format); + __add_to_aShape( CText(x, y, size*10, color, angle, align*10, format, argptr) ); + drawtobuffer(); +} +void text(int x, int y, int size, int color, int bkcolor, int angle, int align, char *format, ...) +{ + va_list argptr; + va_start(argptr, format); + __add_to_aShape( CText(x, y, size*10, color, bkcolor, angle*10, align, format, argptr) ); + drawtobuffer(); +} + +void textbox(int x1, int y1, int x2, int y2, int size, int ctext, + int cframe, int cfill, int flags, char *format, ...) +{ + va_list argptr; + va_start(argptr, format); + __add_to_aShape( CTextBox( CRect(x1, y1, x2, y2), size*10, ctext, cframe, cfill, flags, format, argptr) ); + drawtobuffer(); +} + + +// Ablaufsteuerung +int mouseclick(int *x, int *y) // Wartet auf einen Mausklick und gibt dann button & key zurueck. +{ + + theApp.vw->Invalidate(); // Zeichenbereich aktualisieren (GDEView::OnPaint() wird aufgerufen) + theApp.vw->MouseClick = 0; // Ruecksetzen der Maustaste. + while (theApp.vw->MouseClick == 0) // Warten bis eine Maustaste gedrueckt wird. + { + DoEvents(); + if(StopProcess())break; + Sleep(20); // 20ms warten + } + *x = theApp.vw->MousePoint.x; // Zurueckgeben der x-Koordinate des Mauszeigers. + *y = theApp.vw->MousePoint.y; // Zurueckgeben der y-Koordinate des Mauszeigers. + return theApp.vw->MouseClick; // Zurueckgeben der Maustasten- & Tastenkombination. +} + +int checkmouse() // Prueft ob zwischenzeitlich die Maus betaetigt wurde. +{ + DoEvents(); + theApp.vw->Invalidate(); // Zeichenbereich aktualisieren (GDEView::OnPaint() wird aufgerufen) + if (theApp.vw->MouseClick > 0) { // wenn Maustaste gedrueckt ... + theApp.vw->MouseClick = 0; // ... ruecksetzen der Maustaste ... + return theApp.vw->MouseClick; // ... und zurueckgeben der Tastenkombination. + } + else + return 0; // ansonsten 0 zurueckgeben. +} + +void wait(unsigned int msecs) // Wartet die vorgegebende Zeit in Millisekunden +{ + theApp.vw->Invalidate(FALSE); // Update screen ( GDEView::OnPaint() wird aufgerufen) + Sleep(msecs); +} + +void clrscr() // Loeschen des gesamten Zeichenbereiches. +{ + theApp.vw->GetDocument()->aShape.RemoveAll(); // Das Array leeren... + theApp.vw->GetDocument()->nShapePos = 0; // ...und die Position ruecksetzen. + theApp.vw->GetDocument()->buffer.PatBlt(0, 0, MAX_X, MAX_Y, WHITENESS); // Den ganzen Puffer weiss malen. + theApp.vw->Invalidate(FALSE); // Zeichenbereich aktualisieren (GDEView::OnPaint() wird aufgerufen) +// theApp.vw->SendMessage(WM_PAINT);//Zeichenbereich aktualisieren (GDEView::OnPaint() wird aufgerufen) +} + +void updatescr() // Neuzeichnen des gesamten Zeichenbereiches. +{ + theApp.vw->Invalidate(FALSE); // Zeichenbereich aktualisieren (GDEView::OnPaint() wird aufgerufen) +} +BOOL StopProcess() +{ + return theApp.m_stopflag ; +} diff --git a/GDE_3_2008/Graphics/Graphicfunctions.h b/GDE_3_2008/Graphics/Graphicfunctions.h new file mode 100644 index 0000000..701d270 --- /dev/null +++ b/GDE_3_2008/Graphics/Graphicfunctions.h @@ -0,0 +1,100 @@ +// Graphicfunctions.h : interface of the GDE functions +// +// In diesem Header-File sind alle Grafikfunktionen, die der Benutzer +// zur Programmierung verwenden kann deklariert. +// +///////////////////////////////////////////////////////////////////////////// + + +// Koordinaten und Fenstergroesse +void set_windowpos(int x, int y, int b, int h); // Groesse und Position des Grafikfensters setzen. +void get_windowsize(int *b, int *h); // Groesse des Grafikfensters ermitteln. +void set_drawarea(int b, int h); // Setzen der Groesse des Zeichenbereiches. +void get_drawarea(int *b, int *h); // Ermitteln der Groesse des Zeichenbereches. + +// Farben +#define BLACK 0 +#define WHITE RGB(255,255,255) +#define RED RGB(255,0,0) +#define GREEN RGB(0,255,0) +#define BLUE RGB(0,0,255) +#define YELLOW RGB(255,255,0) +#define GREY RGB(192,192,192) +#define BROWN RGB(128,64,0) + + +// Bildpunkte und Bildschirmbereiche +void pixel(int x, int y, int color); // Setzen eines einzenen Pixels. +void fill (int x, int y, int color1, int color2); // Fuellt einen Bereich des Fensters mit einer Farbe. + // color1: Fuellt den durch diese Farbe begrenzten Bereich. + // color2: Fuefarbe + +// Linien +void moveto(int x, int y); // Setzt die Position des virtuellen Grafikcursors. +void lineto(int x, int y, int color); // Zieht eine Linie von den Koordinaten des Grafikcursors aus. +void line(int x1, int y1, int x2, int y2, int color); // Zeichnet eine Linie. + +// Rechtecke +void rectangle(int x1, int y1, int x2, int y2, int cframe, int cfill = -1); + // Zeichnet ein Rechteck (optional deckend). + // x1, y1 : obere linke Ecke + // x2, y2 : untere rechte Ecke + // cframe : Rahmenfarbe + // cfill : Fuellfarbe + +// Kreise und Ellipsen +void ellipse(int x1, int y1, int x2, int y2, int cframe, int cfill = -1); + // Zeichnet eine Ellipse (optional deckend). + // x1, y1 : obere linke Ecke + // x2, y2 : untere rechte Ecke + // cframe : Rahmenfarbe + // cfill : Fuellfarbe + +// Text +#define LEFT_ALIGN DT_LEFT +#define RIGHT_ALIGN DT_RIGHT +#define CENTER_ALIGN DT_CENTER +#define TOP_ALIGN DT_TOP +#define BOTTOM_ALIGN DT_BOTTOM +#define VCENTER_ALIGN DT_VCENTER +#define BREAK_WORDS DT_WORDBREAK +#define NO_CLIPPING DT_NOCLIP +#define SINGLE_LINE DT_SINGLELINE + +void text(int x, int y, int size, int color, char *format, ...); +void text(int x, int y, int size, int color, int bkcolor, char *format, ...); +void text(int x, int y, int size, int color, int angle, int align, char *format, ...); +void text(int x, int y, int size, int color, int bkcolor, int angle, int align, char *format, ...); + // Mehrzeilige (\n) Textausgabe (analog printf); + // size : Textgroesse + // color : Textfarbe + // bkcolor : Hintergrundfarbe wenn deckend, sonst transparent. + // angle : Winkel um dem der Text gedreht wird. + // align : Ausrichtung des Textes. + // der hintere Teil funktioniert analog zu printf +void textbox(int x1, int y1, int x2, int y2, int size, int textcolor, + int framecolor, int fillcolor, int flags, char *format, ...); + // Einzeilige Textausgabe in einer Textbox. + // size : Textgroesse + // textcolor : Textfarbe + // framecolor: Randfarbe + // fillcolor : Fuellfarbe des Rahmens + // flags : Ausrichtung LEFT_ALIGN. RIGHT_ALIGN, CENTER_ALIGN, TOP_ALIGN, ... + // der hintere Teil funktioniert analog zu printf + +// Ablaufsteuerung (all Funktionen beinhalten ein neuzeichnen des Zeichenbereiches) +#define MBTN_LEFT MK_LBUTTON +#define MBTN_MIDDLE MK_MBUTTON +#define MBTN_RIGHT MK_RBUTTON +#define MBTN_SHIFT MK_SHIFT +#define MBTN_CONTROL MK_CONTROL + +int mouseclick(int *x, int *y); // Wartet auf einen Mausklick und gibt dann button & key zurueck. +int checkmouse(); // Prueft ob zwischenzeitlich die Maus betaetigt wurde. + // 0: nicht betaetigt, ... +void wait(unsigned int msecs); // Wartet die vorgegebende Zeit in Millisekunden. + +void clrscr(); // Loescht den gesamten Zeichenbereich. +void updatescr(); // Neuzeichnen des gesamten Zeichenbereiches. + +BOOL StopProcess(); // Gibt an ob ein Stopflagg gesetzt wurde \ No newline at end of file diff --git a/GDE_3_2008/Graphics/Image.h b/GDE_3_2008/Graphics/Image.h new file mode 100644 index 0000000..99cac4a --- /dev/null +++ b/GDE_3_2008/Graphics/Image.h @@ -0,0 +1,150 @@ +// Image.h: interface for the CImage class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_IMAGE_H__D3142778_9555_4128_887F_104A5F9478E1__INCLUDED_) +#define AFX_IMAGE_H__D3142778_9555_4128_887F_104A5F9478E1__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "BaseException.h" + +/** ImageFormat constants */ +enum IMAGE_FORMAT { IF_BMP, IF_JPG }; + + +/** Exception class for CImage and its derivative classes. +* +* ex) You can throw CImageException object like this. +* +* 1. throw CImageException(); -> Reason would be "Exception". +* +* 2. throw CImageException(_T("Disaster")); -> Reason would be "Disaster". +* +* 3. throw CImageException(_T("Disaster"), LOCATION); ->Reason would be "Disaster SomeFile line no 11". +*/ +class CImageException : public BaseException +{ +public: + /** Default Constructor + * @param None + * @exceptions None + */ + CImageException() throw() : BaseException(_T("ImageException")) {} + /** Constructor with string description + * @param message - This should be a useful message for error tracking. + * @exceptions None + */ + CImageException(string message) throw() : BaseException(message) {} + /** Constructor with string description and error location + * @param message - This should be a useful message for error tracking. + * @param location - Location where Exception has occrurred. You can use LOCATION macro here. + * @exceptions None + */ + CImageException(string message, string location) throw() : BaseException(message, location) {} +}; + +/** Base class of all Image Class. +* +* Normally, you use this class for all bmp, jpg objects. +* +* ex) CImage* pImage = new CDib; +* +* pImage->Draw(pDC); +*/ +class CImage +{ +public: + /** Virtual Destructor. + * Does nothing + */ + virtual ~CImage(){} + /** Load image from specified filename. Overriding Function + * @param fileName - Name of the File + * @return None + * @exceptions CImageException + */ + virtual void Load(CString fileName) throw(CImageException) = 0; + /** Load image from CFile pointer. Overriding Function + * @param pFile - CFile pointer + * @return None + * @exceptions CImageException + */ + virtual void Load(CFile* pFile) throw(CImageException) = 0; + /** Save image with a specified filename. Overriding Function + * @param fileName - Name of the File to be saved + * @return None + * @exceptions CImageException + */ + virtual void Save(CString fileName) throw(CImageException) = 0; + /** Save image with a specified CFile pointer. Overriding Function + * @param pFile - CFile pointer + * @return None + * @exceptions CImageException + */ + virtual void Save(CFile* pFile) throw(CImageException) = 0; + /** Draw image to Screen with coordinate and scale ratio. Overriding Function + * @param pdc - Device Context + * @param x - x coordinate of destination image + * @param y - y coordinate of destination image + * @param scale - ratio of dest/source rectangle + * @param dwROPCode - ROP code + * @return None + * @exceptions CImageException + */ + virtual void Draw(CDC* pdc, int x=0, int y=0, double scale = 1.0, DWORD dwROPCode = SRCCOPY) const throw(CImageException) = 0; + /** Draw image to Screen with coordinate and fixed width/height. Overriding Function + * @param pdc - Device Context + * @param x - x coordinate of destination image + * @param y - y coordinate of destination image + * @param width - fixed width of destination image + * @param height - fixed height of destination image + * @param dwROPCode - ROP code + * @return None + * @exceptions CImageException + */ + virtual void Draw(CDC* pdc, int x, int y, int width, int height, DWORD dwROPCode = SRCCOPY) const throw(CImageException) = 0; + /** Create image from data bits. Overriding Function + * @param width - width of original image + * @param height - height of original Image + * @param pData - data bits. Contains rgb data(Pallette mode not supported) + * @return None + * @exceptions CImageException + */ + virtual void Create(int width, int height, LPBYTE pData, int bitCount=24) throw(CImageException) = 0; + /** Returns width of Image. Overriding Function + * @param None + * @return width of Image + * @exceptions None + */ + virtual UINT GetWidth() const throw() = 0; + /** Returns height of Image. Overriding Function + * @param None + * @return height of Image + * @exceptions None + */ + virtual UINT GetHeight() const throw() = 0; + /** Returns BitPerPixel value of current Image + * @param None + * @return BitPerPixel value + * @exceptions None + */ + virtual UINT GetBPP() const throw() = 0; + /** Get COLORREF value of given pixel + * @param x - x coordinate + * @param y - y coordinate + * @return COLORREF value of given pixel + * @exceptions None + */ + virtual COLORREF GetPixel(int x, int y) const throw() = 0; + /** Get DibBits directly + * @param None + * @return LPBYTE BYTE pointer of given Dib + * @exceptions None + */ + virtual LPBYTE GetDibBits() const throw() = 0; +}; + +#endif // !defined(AFX_IMAGE_H__D3142778_9555_4128_887F_104A5F9478E1__INCLUDED_) diff --git a/GDE_3_2008/Graphics/PointerArray.h b/GDE_3_2008/Graphics/PointerArray.h new file mode 100644 index 0000000..8aa9fb6 --- /dev/null +++ b/GDE_3_2008/Graphics/PointerArray.h @@ -0,0 +1,35 @@ +// PointerArray.h: interface for the CPointerArray class. +// +// Die von CArrray abgeleitete Klasse CPointerArray, +// stellt ein eindimensionales Feld dar, indem Zeiger +// beliebigen Types gespeichert werden koennen. +// Die Besonderheit liegt darin, dass, beim Loeschen eines Elementes +// (gespeicherten Zeigers), der Speicherbereich, den das Objekt, +// auf den der Zeiger zeigt, belegt, wieder freigegeben wird. +// Kleines Bsp.: +// Zeiger A zeigt auf das Objekt B, das im Speicher 200 Byte belegt. +// Zeiger A wird in diesem Array gespeichert. +// Beim Loeschen des Zeigers A wird auch das Objekt B geloescht. +// Dieses vorgehen ist eine einfache Form von "garbage collection" +// +////////////////////////////////////////////////////////////////////// + +#pragma once + +#include // includes CArray + +template class CPointerArray : public CArray +{ +public: + void RemoveAll() { // Leeren der gesamten Arrays. + for (int i=0; iGetSize(); i++) // Das Feld ganz durchlaufen... + delete(this->GetAt(i)); // ...und alle Speicherbloecke wieder freigeben. + CArray ::RemoveAll(); // Alle gespeicherten Zeiger aus dem Feld loeschen. + } + + void RemoveAt(int nIndex, int nCount = 1) { // Loeschen von nCount Elementen aus dem Array. + for (int i=nIndex; iGetAt(i)); // ...und die Speicherbloecke wieder freigeben. + CArray ::RemoveAt(nIndex, nCount); // + } +}; \ No newline at end of file diff --git a/GDE_3_2008/Graphics/Shape.cpp b/GDE_3_2008/Graphics/Shape.cpp new file mode 100644 index 0000000..2e089f5 --- /dev/null +++ b/GDE_3_2008/Graphics/Shape.cpp @@ -0,0 +1,241 @@ +// Shape.cpp: implementation of the CShape class and drived classes. +// +////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "Shape.h" +#include + +#pragma warning( disable : 4996 ) // disable sprintf warning + + +// Dieses Makro changeflag holt aus der Variable "var" +// das flag "extract" heraus und fuegt dafuer das flag "insert" ein. +#define __changeflag(var, extract, insert) if (var & extract) { \ + var ^= extract; \ + var |= insert; \ + }; + +////////////////////////////////////////////////////////////////////// +// CShape Class + +CShape::CShape(short x, short y, COLORREF crColor) +{ + // Initialisieren der Member-Variablen + m_x = x; + m_y = y; + m_crColor = crColor; +} + + +////////////////////////////////////////////////////////////////////// +// CFill Class + +CFill::CFill(short x, short y, COLORREF crFillColor, COLORREF crBorderColor) : + CShape(x, y, crBorderColor) +{ + m_crFillColor = crFillColor; +}; + +void CFill::Draw(CDC* pDC) +{ + CBrush brush(m_crFillColor); // Erstellen... + pDC->SelectObject(&brush); // ...und auswaehlen ein GDI brushes + pDC->FloodFill(m_x, m_y, m_crColor);// Fuellen... + brush.DeleteObject(); // und Brush loeschen. +}; + + +////////////////////////////////////////////////////////////////////// +// CLineTo Class + +void CLineTo::Draw(CDC* pDC) +{ + + CPen pen; // Konstruieren, dann Initialisieren + if( pen.CreatePen( PS_SOLID, 1, m_crColor ) ) + { + // Auswahl des Objekts im Gerätekontext + // Gleichzeitiges Speichern des alten Stifts + CPen* pOldPen = pDC->SelectObject( &pen ); + + // Zeichnen mit dem Stift + pDC->LineTo(m_x, m_y); // Ziehen einer Linie... + // Wiederherstellen des alten Stifts im Gerätekontext + pDC->SelectObject( pOldPen ); + } + else + { + // Den Benutzer alarmieren, daß die Ressourcen knapp werden + } + +/* CPen pen(PS_SOLID, 1, m_crColor); // Generieren eines Zeichenstiftes... + pDC->SelectObject(&pen); // ...und auswaehlen dieses Stiftes. + pDC->LineTo(m_x, m_y); // Ziehen einer Linie... +*/ +// pen.DeleteObject(); // ...und anschliessendes Loeschen des ausgewaehlten Siftes. +} + + +////////////////////////////////////////////////////////////////////// +// CLine Class + +CLine::CLine(short x1, short y1, short x2, short y2, UINT crColor) : CLineTo(x1, y1, crColor) +{ + m_point = CPoint(x2, y2); +} + +void CLine::Draw(CDC* pDC) +{ + POINT currentpos; + currentpos = pDC->GetCurrentPosition(); // Ermitteln der aktuellen Cursorposition. + + pDC->MoveTo(m_point); // Bewegen des Cursors zum Zielpunkt, ... + CLineTo::Draw(pDC); // ...zeichnen der Linie und... + pDC->MoveTo(currentpos); // ...rueckkehren zum Ausgangspunkt. +} + + +////////////////////////////////////////////////////////////////////// +// CRectangle Class + +CRectangle::CRectangle(RECT rect, COLORREF crFrame, COLORREF crFill) : CShape(NULL, NULL, crFrame) +{ + m_rect = rect; + m_crFill = crFill; +} + +void CRectangle::Draw(CDC* pDC) +{ + if (m_crFill == -1) { // Ein durchsichtiges Rechteck zeichnen. + CBrush brush(m_crColor); // Erstellen eines graphics device interface (GDI) brushes... + pDC->SelectObject(&brush); // ...und auswaehlen des GDI brushes. + pDC->FrameRect(&m_rect, &brush); // Zeichnen... + brush.DeleteObject(); // ..und brush loeschen. + } + else { // Ein ausgefuelltes Rechteck zeichnen. + CPen pen(PS_SOLID, 1, m_crColor); // Zeichenstift fuer den Rand. + pDC->SelectObject(&pen); + + CBrush brush(m_crFill); // Brush fuer die ausgefuellte Flaeche. + pDC->SelectObject(&brush); + + pDC->Rectangle(&m_rect); + + brush.DeleteObject(); + pen.DeleteObject(); + }; +} + + +////////////////////////////////////////////////////////////////////// +// CEllipse Class + +CEllipse::CEllipse(RECT rect, COLORREF crFrame, COLORREF crFill) : CShape(NULL, NULL, crFrame) +{ + m_rect = rect; + m_zoomrect = rect; + m_crFill = crFill; +} + +void CEllipse::Draw(CDC* pDC) +{ + CBrush brush; + CPen pen(PS_SOLID, 1, m_crColor); + pDC->SelectObject(&pen); + + if (m_crFill == -1) // Eine transparente Ellipse zeichnen. + brush.CreateStockObject(NULL_BRUSH); + else // Eine ausgefuellte Ellipse zeichnen. + brush.CreateSolidBrush(m_crFill); + + pDC->SelectObject(&brush); + pDC->Ellipse(&m_zoomrect); + + pen.DeleteObject(); + brush.DeleteObject(); +} + + +////////////////////////////////////////////////////////////////////// +// CTextA Class + +CTextA::CTextA(short x1, short y1, WORD nSize, COLORREF crTextColor, COLORREF crBkground, short nAngle, + UINT nFlags, char* format, va_list argptr) : CShape(x1, y1, crTextColor) +{ + // Die Member-Variablen der Klasse initialisieren. + m_nSize = nSize; + m_crBkground= crBkground; + m_nBkMode = OPAQUE; + m_nAngle = nAngle; + m_nFlags = nFlags; + + // Da die Befehle TextOut und DrawText (in CTextBox benutzt) + // teilweise verschiedene numerische Konstanten fuer die Ausrichtung benutzen, + // jedoch global die einundselben verwendet werden sollen, muessen die flags, + // die sich unterscheiden veraendert werden. + __changeflag(m_nFlags, DT_VCENTER, TA_BASELINE); + __changeflag(m_nFlags, DT_CENTER, TA_CENTER); + + m_string = (char*) malloc(_MAX_STRING); // Einen ausreichend grossen Speicherblock zuweisen. + m_nCount = vsprintf(m_string, format, argptr); // Aus der Argumentenliste einen string generieren. + m_string = (char*) realloc(m_string, m_nCount+1); // Den Speicherblock auf die benoetigte Groesse verkleinern. +} + +void CTextA::Draw(CDC* pDC) +{ + // Setzen einer Schriftart mit speziellen Eignenschaften. + CFont font; + LOGFONT logfont = {m_nSize, 0, m_nAngle, 0, FW_DONTCARE, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, + CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "Arial"}; + font.CreatePointFontIndirect(&logfont, pDC); + pDC->SelectObject(&font); + + pDC->SetTextColor(m_crColor); // Textfarbe setzen. + if (m_nBkMode == OPAQUE) // Wenn undurchsichtig, ... + pDC->SetBkColor(m_crBkground); // ...dann Hintergrundfarbe setzen. + pDC->SetBkMode(m_nBkMode); // Festlegen ob durchsichtig oder undurchsichtig. + pDC->SetTextAlign(m_nFlags); // Setzen der Textausrichtung. + pDC->TextOut(m_x, m_y, m_string, m_nCount); // Ausgabe des Textes. + font.DeleteObject(); // Loeschen der Ausgewaehlten Schriftcharakteristik +} + + +////////////////////////////////////////////////////////////////////// +// CTextBox Class + +CTextBox::CTextBox(RECT rect, WORD nSize, COLORREF crText, COLORREF crFrame, COLORREF crFill, + UINT nFormat, char* format, va_list argptr) : CShape(NULL, NULL, crText) +{ + m_rect = rect; + m_nSize = nSize; + m_nFormat = nFormat; + m_crFrame = crFrame; + m_crFill = crFill; + + m_string = (char*) malloc(_MAX_STRING); // Einen ausreichend grossen Speicherblock zuweisen. + m_nCount = vsprintf(m_string, format, argptr); // Aus der Argumentenliste einen string generieren. + m_string = (char*) realloc(m_string, m_nCount+1); // Den Speicherblock auf die benoetigte Groesse verkleinern. +} + +void CTextBox::Draw(CDC* pDC) +{ + // Setzen einer Schriftart mit speziellen Eignenschaften. + CFont font; + font.CreatePointFont(m_nSize, "Arial", pDC); + pDC->SelectObject(&font); + + pDC->SetTextColor(m_crColor); // Textfarbe setzen. + pDC->SetBkMode(TRANSPARENT); // Festlegen auf durchsichtig. + + // Zeichnen eines fuellenden Rechteckes. + CRectangle rectangle(m_rect, m_crFrame, m_crFill); + rectangle.Draw(pDC); + + m_rect.DeflateRect(1, 1, 1, 1); // Verkleinern des virtuellen Rechteckes + // um die Linienbreite des Rahmens. + pDC->SetTextAlign(NULL); // Textausrichtung zuruecksetzen. + pDC->DrawText(m_string, m_nCount, &m_rect, m_nFormat); // Text ausgeben. + + font.DeleteObject(); +} \ No newline at end of file diff --git a/GDE_3_2008/Graphics/Shape.h b/GDE_3_2008/Graphics/Shape.h new file mode 100644 index 0000000..c0cb2f2 --- /dev/null +++ b/GDE_3_2008/Graphics/Shape.h @@ -0,0 +1,196 @@ +// Shape.h: interface for the CShape class and derived classes. +// +////////////////////////////////////////////////////////////////////// +#ifndef _SHAPE_H +#define _SHAPE_H +#define _MAX_STRING 255 // Festlegen der maximal moeglichen string-Laenge (CText, CTextBox) + + +///////////////////////////////////////////////////////////////////////////// +// Die Klasse CShape ist die Basisklasse aller Grafikklassen. +// ALLE Grafikklassen haben diese als "Vorfahren". +// +// Allen Klassen ist gemeinsam, dass mit der Funktion +// Draw() gezeichnet und mit der Funktion Zoom() gezoomt werden kann. +// Diese beiden Funktionen sind aus diesem Grunde auch in der Basisklasse +// CShape mit dem Keywort "virtual" versehen. +class CShape +{ +// Member-Variablen +protected: + short m_x, + m_y; + COLORREF m_crColor; + +public: + CShape(short x, short y, COLORREF crColor = 0); + virtual ~CShape() {}; + virtual void Draw(CDC* pDC) = 0; // virtuelle Klasse zum zeichnen des Objektes + +}; + + +///////////////////////////////////////////////////////////////////////////// +// Diese Klasse dient dazu im Zeichenbereich einen einzelnen Bildpunkt +// mit einer gewuenschten Farbe zu setzen. +class CPixel : public CShape +{ +public: + CPixel(short x, short y, COLORREF crColor) : CShape(x, y, crColor) {}; + virtual ~CPixel() {}; + void Draw(CDC* pDC) { pDC->SetPixel(m_x, m_y, m_crColor); }; + +}; + + +///////////////////////////////////////////////////////////////////////////// +// Diese Klasse dient zum Fuellen des Bereiches des Grafikfensters, +// der den Punkt (x, y) enthaelt und durch die Farbe crBorderColor begrenzt ist, +// mit der Fullfarbe crFillClor1 +class CFill : public CShape +{ +protected: + COLORREF m_crFillColor; + +public: + CFill(short x, short y, COLORREF crFillColor, COLORREF crBorderColor); + virtual ~CFill() {}; + void Draw(CDC* pDC); +}; + + +///////////////////////////////////////////////////////////////////////////// +// Klasse zum Positionieren des Cursors auf einem bestimmten Bildschirmpunkt. +// Diese Klasse muss im Zusammenhang mit der Klasse "LineTo" verwendet werden. +class CMoveTo : public CShape +{ +public: + CMoveTo(short x, short y) : CShape(x, y) {}; + virtual ~CMoveTo() {}; + void Draw(CDC* pDC) { pDC->MoveTo(m_x, m_y); }; + +}; + + +///////////////////////////////////////////////////////////////////////////// +// Klasse zum ziehen einer Linie mit bestimmter Farbe zu einem Zielpunkt. +// Als Ausgangskoordinate dient der Cursor, der mit der Klasse "MoveTo" frei +// bewegt werden kann. +class CLineTo : public CShape +{ +public: + CLineTo(short x, short y, COLORREF crColor) : CShape(x, y, crColor) {}; + virtual ~CLineTo() {}; + void Draw(CDC* pDC); + +}; + + +///////////////////////////////////////////////////////////////////////////// +// Dient zum Zeichnen einer Linie vom Startpunkt (m_x, m_y) aus +// zum Zielpunk (m_point) mit der gewuenschten Farbe crColor. +class CLine : public CLineTo +{ +protected: + POINT m_point; + +public: + CLine(short x1, short y1, short x2, short y2, UINT crColor); + virtual ~CLine() {}; + void Draw(CDC* pDC); + +}; + + +///////////////////////////////////////////////////////////////////////////// +// Zeichnen eines Rechteckes oder nur eines Rechteckrahmens (crFill = -1) +// mit einer gewuenschten Rahmenfarbe bzw. Fullfarbe. +class CRectangle : public CShape +{ +protected: + RECT m_rect; + COLORREF m_crFill; + +public: + CRectangle(RECT rect, COLORREF crFrame, COLORREF crFill = -1); + virtual ~CRectangle() {}; + void Draw(CDC* pDC); + +}; + + +///////////////////////////////////////////////////////////////////////////// +// Zeichnen einer durchsichtigen oder undurchsichtigen (crFill = -1) Ellipse +// mit einer gewuenschten Rahmenfarbe bzw. Fullfarbe. +class CEllipse : public CShape +{ +protected: + RECT m_rect; + RECT m_zoomrect; + COLORREF m_crFill; + +public: + CEllipse(RECT rect, COLORREF crFrame, COLORREF crFill = -1); + virtual ~CEllipse() {}; + void Draw(CDC* pDC); + +}; + + +///////////////////////////////////////////////////////////////////////////// +class CTextA : public CShape +{ +protected: + BYTE m_nBkMode; + WORD m_nSize; + short m_nAngle; + UINT m_nCount, + m_nFlags; + char* m_string; + COLORREF m_crBkground; + +public: + CTextA(short x1, short y1, WORD nSize, COLORREF crTextColor, COLORREF crBkground, short nAngle, UINT nFlags, char* format, va_list argptr); + virtual ~CTextA() { free(m_string); }; + void Draw(CDC* pDC); + +}; + + +///////////////////////////////////////////////////////////////////////////// +class CText : public CTextA +{ +public: + CText(short x1, short y1, WORD nSize, COLORREF crTextColor, char* format, va_list argptr) + : CTextA(x1, y1, nSize, crTextColor, NULL, NULL, NULL, format, argptr) {m_nBkMode = TRANSPARENT;}; + CText(short x1, short y1, WORD nSize, COLORREF crTextColor, COLORREF crBkground, char* format, va_list argptr) + : CTextA(x1, y1, nSize, crTextColor, crBkground, NULL, NULL, format, argptr) {}; + CText(short x1, short y1, WORD nSize, COLORREF crTextColor, short nAngle, UINT nFlags, char* format, va_list argptr) + : CTextA(x1, y1, nSize, crTextColor, NULL, nAngle, nFlags, format, argptr) {m_nBkMode = TRANSPARENT;}; + CText(short x1, short y1, WORD nSize, COLORREF crTextColor, COLORREF crBkground, short nAngle, UINT nFlags, char* format, va_list argptr) + : CTextA(x1, y1, nSize, crTextColor, crBkground, nAngle, nFlags, format, argptr) {}; + +}; + + +///////////////////////////////////////////////////////////////////////////// +class CTextBox : public CShape +{ +protected: + CRect m_rect; + WORD m_nSize; + BYTE m_nFormat; + RECT m_nRect; + COLORREF m_crFrame, + m_crFill; + WORD m_nCount; + char* m_string; + +public: + CTextBox(RECT rect, WORD nSize, COLORREF crText, COLORREF crFrame, + COLORREF crFill, UINT nFormat, char* format, va_list argptr); + virtual ~CTextBox() { free(m_string); }; + void Draw(CDC* pDC); + +}; +#endif \ No newline at end of file diff --git a/GDE_3_2008/MainFrm.cpp b/GDE_3_2008/MainFrm.cpp new file mode 100644 index 0000000..84a3d2b --- /dev/null +++ b/GDE_3_2008/MainFrm.cpp @@ -0,0 +1,99 @@ +// MainFrm.cpp : Implementierung der Klasse CMainFrame +// +#include "stdafx.h" +#include "GDE_3.h" + +#include "MainFrm.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + + +// CMainFrame + +IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) + +BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) + ON_WM_CREATE() +END_MESSAGE_MAP() + +static UINT indicators[] = +{ + ID_SEPARATOR, // Statusleistenanzeige + ID_INDICATOR_CURPOS, + ID_INDICATOR_CAPS, + ID_INDICATOR_NUM, + ID_INDICATOR_SCRL, +}; + + +// CMainFrame Erstellung/Zerstörung + +CMainFrame::CMainFrame() +{ + // TODO: Hier Code für die Memberinitialisierung einfügen +} + +CMainFrame::~CMainFrame() +{ +} + + +int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) +{ + if (CFrameWnd::OnCreate(lpCreateStruct) == -1) + return -1; + + if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP + | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || + !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) + { + TRACE0("Symbolleiste konnte nicht erstellt werden\n"); + return -1; // Fehler bei Erstellung + } + + if (!m_wndStatusBar.Create(this) || + !m_wndStatusBar.SetIndicators(indicators, + sizeof(indicators)/sizeof(UINT))) + { + TRACE0("Statusleiste konnte nicht erstellt werden\n"); + return -1; // Fehler bei Erstellung + } + // TODO: Löschen Sie diese drei Zeilen, wenn Sie nicht möchten, dass die Systemleiste andockbar ist + m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); + EnableDocking(CBRS_ALIGN_ANY); + DockControlBar(&m_wndToolBar); + + return 0; +} + +BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) +{ + if( !CFrameWnd::PreCreateWindow(cs) ) + return FALSE; + // TODO: Ändern Sie hier die Fensterklasse oder die Darstellung, indem Sie + // CREATESTRUCT cs modifizieren. + + return TRUE; +} + + +// CMainFrame Diagnose + +#ifdef _DEBUG +void CMainFrame::AssertValid() const +{ + CFrameWnd::AssertValid(); +} + +void CMainFrame::Dump(CDumpContext& dc) const +{ + CFrameWnd::Dump(dc); +} + +#endif //_DEBUG + + +// CMainFrame Meldungshandler + diff --git a/GDE_3_2008/MainFrm.h b/GDE_3_2008/MainFrm.h new file mode 100644 index 0000000..7c4ac98 --- /dev/null +++ b/GDE_3_2008/MainFrm.h @@ -0,0 +1,43 @@ +// MainFrm.h : Schnittstelle der Klasse CMainFrame +// +#ifndef _MAINFRM_H +#define _MAINFRM_H + +#pragma once +class CMainFrame : public CFrameWnd +{ + +protected: // Nur aus Serialisierung erstellen + CMainFrame(); + DECLARE_DYNCREATE(CMainFrame) + +// Attribute +public: + +// Operationen +public: + +// Überschreibungen +public: + virtual BOOL PreCreateWindow(CREATESTRUCT& cs); + +// Implementierung +public: + virtual ~CMainFrame(); +#ifdef _DEBUG + virtual void AssertValid() const; + virtual void Dump(CDumpContext& dc) const; +#endif + +public: + CStatusBar m_wndStatusBar; +protected: // Eingebundene Elemente der Steuerleiste + CToolBar m_wndToolBar; + +// Generierte Funktionen für die Meldungstabellen +protected: + afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); + DECLARE_MESSAGE_MAP() +}; + +#endif diff --git a/GDE_3_2008/PrimImplikant.cpp b/GDE_3_2008/PrimImplikant.cpp new file mode 100644 index 0000000..2087a9d --- /dev/null +++ b/GDE_3_2008/PrimImplikant.cpp @@ -0,0 +1,36 @@ +#include +#include +#include "PrimImplikanten.h" + +using namespace std; + +/* + +PrimImplikant::PrimImplikant(int input) +{ + implikant.push_back(input); +} +*/ +PrimImplikant::PrimImplikant(string input) +{ + vector arr; + + + +} +bool PrimImplikant::valueAt(int x) { +} + +int PrimImplikant::parser(string input){ // Analyser + string text = new char [input.size()]; + //string text2 = new char [input.size()]; + text= input; + char yytext[]= ""; + for( int i=0;i +#include +#include "PrimImplikanten.h" + +using namespace std; + +class PrimImplikantCollection{ +public: + void Add(PrimImplikant &pi); + //void Add(string input); + void Add(int input); + + bool ValueAt(int position); + + PrimImplikant SolveNextHazard(); + +private: + vector PIVector; +} + +#endif \ No newline at end of file diff --git a/GDE_3_2008/PrimImplikanten.h b/GDE_3_2008/PrimImplikanten.h new file mode 100644 index 0000000..34d81d2 --- /dev/null +++ b/GDE_3_2008/PrimImplikanten.h @@ -0,0 +1,25 @@ +#ifndef PRIMIMPLIKANTEN +#define PRIMIMPLIKANTEN + +#include +#include +#include + +using namespace std; + +class PrimImplikant +{ +public: + PrimImplikant(string input); + //PrimImplikant(int input); + + bool valueAt(int position); + + +private: + map implikant; +} + + + +#endif \ No newline at end of file diff --git a/GDE_3_2008/ReadMe.txt b/GDE_3_2008/ReadMe.txt new file mode 100644 index 0000000..2d9097b --- /dev/null +++ b/GDE_3_2008/ReadMe.txt @@ -0,0 +1,103 @@ +================================================================================ + MICROSOFT FOUNDATION CLASS LIBRARY : GDE_3 Projektübersicht +================================================================================ + +Der Anwendungs-Assistent hat diese GDE_3-Anwendung erstellt. +Diese Anwendung zeigt die prinzipielle Anwendung der Microsoft Foundation Classes +und dient als Ausgangspunkt für die Erstellung Ihrer eigenen Anwendungen. + +Diese Datei enthält die Zusammenfassung der Bestandteile aller Dateien, die +Ihre GDE_3-Anwendung bilden. + +GDE_3.vcproj + Dies ist die Hauptprojektdatei für VC++-Projekte, die vom Anwendungs-Assistenten + erstellt wird. Sie enthält Informationen über die Version von Visual C++, mit der + die Datei generiert wurde, über die Plattformen, Konfigurationen und Projektfeatures, + die mit dem Anwendungs-Assistenten ausgewählt wurden. + +GDE_3.h + Hierbei handelt es sich um die Haupt-Headerdatei der Anwendung. Diese enthält + andere projektspezifische Header (einschließlich Resource.h) und deklariert die + CGDE_3App-Anwendungsklasse. + +GDE_3.cpp + Hierbei handelt es sich um die Haupt-Quellcodedatei der Anwendung. Diese enthält die + Anwendungsklasse CGDE_3App. + +GDE_3.rc + Hierbei handelt es sich um eine Auflistung aller Ressourcen von Microsoft Windows, die + vom Programm verwendet werden. Sie enthält die Symbole, Bitmaps und Cursors, die im + Unterverzeichnis RES gespeichert sind. Diese Datei lässt sich direkt in Microsoft + Visual C++ bearbeiten. Ihre Projektressourcen befinden sich in 1031. + +res\GDE_3.ico + Dies ist eine Symboldatei, die als Symbol für die Anwendung verwendet wird. Dieses + Symbol wird durch die Haupt-Ressourcendatei GDE_3.rc eingebunden. + +res\GDE_3.rc2 + Diese Datei enthält Ressourcen, die nicht von Microsoft Visual C++ bearbeitet wurden. + In dieser Datei werden alle Ressourcen gespeichert, die vom Ressourcen-Editor nicht bearbeitet + werden können. +///////////////////////////////////////////////////////////////////////////// + +Für das Hauptfenster: + Das Projekt enthält eine MFC-Standardschnittstelle. +MainFrm.h, MainFrm.cpp + Diese Dateien enthalten die Frame-Klasse CMainFrame, die von + CFrameWnd abgeleitet wird und steuert alle SDI-Framefeatures. +res\Toolbar.bmp + Diese Bitmap-Datei wird zum Erstellen unterteilter Bilder für die Symbolleiste verwendet. + Die erste Symbol- und Statusleiste wird in der Klasse CMainFrame + erstellt. Bearbeiten Sie diese Bitmap der Symbolleiste mit dem Ressourcen-Editor, und + aktualisieren Sie das Array IDR_MAINFRAME TOOLBAR in GDE_3.rc, um + Schaltflächen für die Symbolleiste hinzuzufügen. +///////////////////////////////////////////////////////////////////////////// + +Der Anwendungs-Assistent erstellt einen Dokumenttyp und eine Ansicht: + +GDE_3Doc.h, GDE_3Doc.cpp - das Dokument + Diese Dateien enthalten die Klasse CGDE_3Doc. Bearbeiten Sie diese Dateien, + um Ihre speziellen Dokumentdaten hinzuzufügen und das Speichern und Laden von + Dateien zu implementieren (mit CGDE_3Doc::Serialize). +GDE_3View.h, GDE_3View.cpp - die Ansicht des Dokuments + Diese Dateien enthalten die Klasse CGDE_3View. + CGDE_3View-Objekte werden verwendet, um CGDE_3Doc-Objekte anzuzeigen. +///////////////////////////////////////////////////////////////////////////// + +Weitere Features: + +ActiveX-Steuerelemente + Die Anwendung unterstützt die Verwendung von ActiveX-Steuerelementen. + +Unterstützung für das Drucken und die Seitenansicht + Der Anwendungs-Assistent hat den Code zum Verarbeiten der Befehle "Drucken", "Seite einrichten" und + "Seitenansicht" durch Aufrufen der Memberfuntkionen in der CView-Klasse der MFC-Bibliothek generiert. +///////////////////////////////////////////////////////////////////////////// + +Weitere Standarddateien: + +StdAfx.h, StdAfx.cpp + Mit diesen Dateien werden vorkompilierte Headerdateien (PCH) mit der Bezeichnung + GDE_3.pch und eine vorkompilierte Typdatei mit der Bezeichnung + StdAfx.obj erstellt. + +Resource.h + Dies ist die Standard-Headerdatei, die neue Ressourcen-IDs definiert. + Microsoft Visual C++ liest und aktualisiert diese Datei. + +///////////////////////////////////////////////////////////////////////////// + +Weitere Hinweise: + +Der Anwendungs-Assistent verwendet "TODO:", um die Stellen anzuzeigen, +an denen Sie Erweiterungen oder Anpassungen vornehmen können. + +Wenn Ihre Anwendung die MFC in einer gemeinsam genutzten DLL verwendet und +eine andere als die aktuell auf dem Betriebssystem eingestellte Sprache verwendet, muss +die entsprechend lokalisierte Ressource MFC70XXX.DLL von der Microsoft Visual C++ CD-ROM +in das Verzeichnis system oder system32 kopiert und in MFCLOC.DLL umbenannt werden +("XXX" steht für die Abkürzung der Sprache. So enthält beispielsweise MFC70DEU.DLL die ins Deutsche +übersetzten Ressourcen.) Anderenfalls werden einige Oberflächenelemente Ihrer Anwendung +in der Sprache des Betriebssystems angezeigt. + +///////////////////////////////////////////////////////////////////////////// diff --git a/GDE_3_2008/Readme2.txt b/GDE_3_2008/Readme2.txt new file mode 100644 index 0000000..5cc832f --- /dev/null +++ b/GDE_3_2008/Readme2.txt @@ -0,0 +1,11 @@ +//GDE3_3 +1. Abgebrochene Zeichenaktion behoben (z.B. IBM Notebook) +2. Die Applikation muss jetzt mit dem RUN Button gestartet werden. + Es gibt zusätzlich eine Funktion StopProcess(), die in die Benutzerapplikation eingebaut werden kann. + (z.B. Einleseschleife) + Wird auf den Stop Button gedrückt wird ein Flag gesetzt, das im StopProzess abgefragt wird. + Dann gibt StopProcess() eine 1 zurück sonst 0. An die Abfrage kann dann ein break gehängt werden, + um die laufende Aktion zu beenden. +3. Der Thread, der den Benutzerprozess enthält, wird jetzt in der Regel sauber angehalten. +4. Die Ausgabe kann in eine bmp Datei gespeichert und auch wieder eingelesen werden. + Paint kann die so erzeugte Datei ebenfalls darstellen. diff --git a/GDE_3_2008/User.h b/GDE_3_2008/User.h new file mode 100644 index 0000000..4ec30aa --- /dev/null +++ b/GDE_3_2008/User.h @@ -0,0 +1,7 @@ +// User.h : header file +// +// Das Benutzer interface. +///////////////////////////////////////////////////////////////////////////// + +void user_main(); // Funktion in der der Benutzer seinen eigenen + // Code programmieren kann. \ No newline at end of file diff --git a/GDE_3_2008/res/GDE_3.ico b/GDE_3_2008/res/GDE_3.ico new file mode 100644 index 0000000000000000000000000000000000000000..8a84ca3d34597ada57e4c79ef62b28cf07b5ed9a GIT binary patch literal 21630 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 V7_3;)FxY%t!w{8u!r68W{|isv(C`2N literal 0 HcmV?d00001 diff --git a/GDE_3_2008/res/GDE_3.manifest b/GDE_3_2008/res/GDE_3.manifest new file mode 100644 index 0000000..c125e5e --- /dev/null +++ b/GDE_3_2008/res/GDE_3.manifest @@ -0,0 +1,22 @@ + + + +Fügen Sie hier die Anwendungsbeschreibung ein + + + + + + diff --git a/GDE_3_2008/res/GDE_3.rc2 b/GDE_3_2008/res/GDE_3.rc2 new file mode 100644 index 0000000..9f90d0b --- /dev/null +++ b/GDE_3_2008/res/GDE_3.rc2 @@ -0,0 +1,13 @@ +// +// GDE_3.RC2 - Ressourcen, die Microsoft Visual C++ nicht direkt bearbeitet +// + +#ifdef APSTUDIO_INVOKED +#error Diese Datei kann nicht in Microsoft Visual C++ bearbeitet werden. +#endif //APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// Fügen Sie hier manuell bearbeitete Ressourcen hinzu... + +///////////////////////////////////////////////////////////////////////////// diff --git a/GDE_3_2008/res/GDE_3Doc.ico b/GDE_3_2008/res/GDE_3Doc.ico new file mode 100644 index 0000000000000000000000000000000000000000..2a1f1ae6ef15e51df8c39bc028bbfb2171822ba5 GIT binary patch literal 1078 zcmcJNF;c@Y5JlGsgIpoERJdY%i*S@2!JS&si6f-)RXoFGDAfg5;z_dQBoi_)1DpI^ z{oS?KlD%25H@>BZ{KJV|_dD9_G1MV<{5a&-}7^W%4AM)k- zx&P*V(j}a@*Y~UhksXTAK!NRyiYN-8NMyKz<)2v9@tUao7A!g+SzkAcsHvdq6!0vQ z#-rA6>0BAr)4*u6Y57EdkamnXf Uh-a7VEuQ2KJb_2>o71HC3-%7w@Bjb+ literal 0 HcmV?d00001 diff --git a/GDE_3_2008/res/Toolbar.bmp b/GDE_3_2008/res/Toolbar.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7960b39934cd8ec3779225a257695e5b5941eecb GIT binary patch literal 1318 zcma)+F>d295JhLcb@-yIeG*^QR>S|7J5wv9sE59&^VZEfpJ#ET`Fu>uNvYwc1Fl#`9KhtCV#h$GAQS zTZL771#CJkH1LS}GI(BXX=&nx7fT`)Uijs;+L4z%Wt=DPT2>e;ZxHWp;&Jld(IaVD zPzgM{^cIVfF64MhgpphVJ9_2yMPS5hD+zo2&t3rQF>^Ps&N^_^CxPOjt&zsc zdoKdBWD@uouLM=z*?srIfpgRDUM5}=Pa!m&a1*cZ15xyCLm2f~@{kw2HxAA`tGtMI z=DpJfUhnXs`ih>CLM`?1jDRQU3rlQ^{Du2#eSLqJdA?EErO)y)5_rXHm-P^@>*CJL z`9sixmj|?9I33MlYtc+IksYR@$py(^hSp|)HC?AnPKCF)=f4a%V fZ?zMQ3HL`MJk?Qi8k4ANti+5(Z2caaz8*dR)1nFY literal 0 HcmV?d00001 diff --git a/GDE_3_2008/res/Toolbar.bmpold b/GDE_3_2008/res/Toolbar.bmpold new file mode 100644 index 0000000000000000000000000000000000000000..d501723c1ceb781cccf04bc42408a2bee6b0eab4 GIT binary patch literal 1078 zcmb_byK2Kg5WFD46)N-_DGd%mbvRHJ@+(`2Y#@z5De^h$T}Yp#;yM?~%&rw%!DZII z_s!1Ct^M-)Tn3AG^p9vgT8;J){9rDyxEsA+?t8wt)o$n@0`>@NK8bGHkdKdb4m#tglAgQo-)Js1!#;+~GSl z37z4Z<|(I?jV44Q_xOeQ!(IFmLY86pVjciLPfC9(?0)$t7hw7W^>>N<@a4LVKPMb~ ze5>=j|BL>!3lPen5hUo~ANKN`l7C&3 z%0PPq3XFRT-e1OO0*EKjOA>DIfd!JKE>l7s8ZOWoALnDl7bEaBMvn{Ll0`lMj_p*2 zeyj@cEB=w(f%+@Ig9SfK=ePQ9c)El>T>d0F2ei{lnHqPg}It<8 literal 0 HcmV?d00001 diff --git a/GDE_3_2008/resource.h b/GDE_3_2008/resource.h new file mode 100644 index 0000000..483c94f --- /dev/null +++ b/GDE_3_2008/resource.h @@ -0,0 +1,25 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by GDE_3.rc +// +#define IDD_ABOUTBOX 100 +#define IDP_OLE_INIT_FAILED 100 +#define IDR_MAINFRAME 128 +#define IDR_GDE_3TYPE 129 +#define ID_BUTTONZOOMOUT 32771 +#define ID_BUTTONZOOMIN 32772 +#define ID_BUTTONZOOMFIT 32773 +#define ID_STARTBUTTON 32776 +#define ID_STOPBUTTON 32777 +#define ID_INDICATOR_CURPOS 32778 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 130 +#define _APS_NEXT_COMMAND_VALUE 32779 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/GDE_3_2008/stdafx.cpp b/GDE_3_2008/stdafx.cpp new file mode 100644 index 0000000..1b9befa --- /dev/null +++ b/GDE_3_2008/stdafx.cpp @@ -0,0 +1,7 @@ +// stdafx.cpp : Quelltextdatei, die nur die Standard-Includes einbindet +// GDE_3.pch ist der vorcompilierte Header +// stdafx.obj enthält die vorcompilierte Typinformation + +#include "stdafx.h" + + diff --git a/GDE_3_2008/stdafx.h b/GDE_3_2008/stdafx.h new file mode 100644 index 0000000..ae85a43 --- /dev/null +++ b/GDE_3_2008/stdafx.h @@ -0,0 +1,47 @@ +// stdafx.h : Includedatei für Standardsystem-Includedateien, +// oder häufig verwendete, projektspezifische Includedateien, +// die nur in unregelmäßigen Abständen geändert werden. + +#pragma once + +#ifndef VC_EXTRALEAN +#define VC_EXTRALEAN // Selten verwendete Teile der Windows-Header nicht einbinden +#endif + +// Ändern Sie folgende Definitionen für Plattformen, die älter als die unten angegebenen sind. +// Unter MSDN finden Sie die neuesten Informationen über die entsprechenden Werte für die unterschiedlichen Plattformen. +#ifndef WINVER // Lassen Sie die Verwendung von Features spezifisch für Windows 95 und Windows NT 4 oder später zu. +#define WINVER 0x0400 // Ändern Sie den entsprechenden Wert, um auf Windows 98 und mindestens Windows 2000 abzuzielen. +#endif + +#ifndef _WIN32_WINNT // Lassen Sie die Verwendung von Features spezifisch für Windows NT 4 oder später zu. +//#define _WIN32_WINNT 0x0400 // Ändern Sie den entsprechenden Wert, um auf Windows 98 und mindestens Windows 2000 abzuzielen. +#define _WIN32_WINNT 0x0500 // Ändern Sie den entsprechenden Wert, um auf Windows 98 und mindestens Windows 2000 abzuzielen. +#endif + +#ifndef _WIN32_WINDOWS // Lassen Sie die Verwendung von Features spezifisch für Windows 98 oder später zu. +#define _WIN32_WINDOWS 0x0410 // Ändern Sie den entsprechenden Wert, um auf mindestens Windows Me abzuzielen. +#endif + +#ifndef _WIN32_IE // Lassen Sie die Verwendung von Features spezifisch für IE 4.0 oder später zu. +#define _WIN32_IE 0x0400 // Ändern Sie den entsprechenden Wert, um auf mindestens IE 5.0 abzuzielen. +#endif + +#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // einige CString-Konstruktoren sind explizit + +// Deaktiviert das Ausblenden von einigen häufigen und oft ignorierten Warnungen +#define _AFX_ALL_WARNINGS +#include "memory.h" + +#include // MFC-Kern- und -Standardkomponenten +#include // MFC-Erweiterungen +#include // MFC-Automatisierungsklassen + +#include // MFC-Unterstützung für allgemeine Steuerelemente von Internet Explorer 4 + +#include +#include +#ifndef _AFX_NO_AFXCMN_SUPPORT +#include // MFC-Unterstützung für allgemeine Windows-Steuerelemente +#endif // _AFX_NO_AFXCMN_SUPPORT + diff --git a/GDE_3_2008/user.cpp b/GDE_3_2008/user.cpp new file mode 100644 index 0000000..3bceeee --- /dev/null +++ b/GDE_3_2008/user.cpp @@ -0,0 +1,153 @@ +// User.cpp : header file +// +///////////////////////////////////////////////////////////////////////////// + +#include "stdafx.h" +#include "user.h" +#include "graphics\graphicfunctions.h" + +#include +#include + +#ifndef _USE_OLD_OSTREAMS +using namespace std; +#endif + + + +#include "math.h" + +#define _pi 3.1415926535 // Die Zahl Pi. +#define _180_durch_pi 57.2957795147 // = 180 * pi. Dient zur Laufzeitoptinierung. +#define _sinus(winkel) sin((winkel) / _180_durch_pi) // Funktion im Gradmass. +#define _cosinus(winkel) cos((winkel) / _180_durch_pi) // Funktion im Gradmass. + +COLORREF Colref[]={BLACK,RED,GREEN,BLUE,YELLOW,BROWN}; +int Colind=0; + +struct _BAUM { // Die fuenf Eingangsparameter des Baumes. + int Tiefe; + int Neigung_links; + float Wachstum_links; + int Neigung_rechts; + float Wachstum_rechts; + void WerteKorrigieren() + { + if (Wachstum_links > 1) Wachstum_links = 1 / Wachstum_links; + if (Wachstum_rechts > 1) Wachstum_rechts = 1 / Wachstum_rechts; + Neigung_rechts = -Neigung_rechts; + }; +} baum; + + +void Zeichne_Ast(int x, int y, float n, float Tiefe, float Laenge) +{ + int x_rel; + int y_rel; + if(StopProcess())return; + if (Tiefe > 1) { // Stopbedingung fuer die Rekursion. + // Zeichnen des linken Astes. + x_rel = (int)(Laenge * _sinus(n + baum.Neigung_links)); // Berechnen der x-Koordinate. + y_rel = (int)(Laenge * _cosinus(n + baum.Neigung_links)); // Berechnen der y-Koordinate. + COLORREF cref=Colref[Colind++]; if(Colind>5)Colind=0; + lineto(x-x_rel, y-y_rel, cref); // Zeichnen + // Rekursion!! Zeichnen des nachfolgenden Astes. + //Sleep(5);updatescr(); + Zeichne_Ast(x-x_rel, y-y_rel, n+baum.Neigung_links, Tiefe-1, Laenge*baum.Wachstum_links); + moveto(x,y); // Cursor zur Anfangsposition zuruecksetzen. + + // Zeichnen des rechten Astes. + x_rel = (int)(Laenge * _sinus(n + baum.Neigung_rechts)); + y_rel = (int)(Laenge * _cosinus(n + baum.Neigung_rechts)); + cref=Colref[Colind++];if(Colind>5)Colind=0; + lineto(x-x_rel, y-y_rel, cref); + //Sleep(5);updatescr(); + Zeichne_Ast(x-x_rel, y-y_rel, n+baum.Neigung_rechts, Tiefe-1, Laenge*baum.Wachstum_rechts); + } + +} + +void Zeichne_Baum() +{ + int Weite, Hoehe, x, y, StammLaenge; + + // Berechnen des Gesamtwachstums. + float GesamtWachstum = 1; + float Wachstum = (baum.Wachstum_links > baum.Wachstum_rechts) ? baum.Wachstum_links : baum.Wachstum_rechts; + float WT = 1; + for (int i=1; i b-120) && (x < b-5)) && + ((y > h-40) && (y < h-5)) + )) { + printf("."); + if(StopProcess())break; + }; + + printf("######################################\n\n"); + clrscr(); + printf("######################################\n\n"); +} + + +void user_main() +{ + int ww,hh; + set_windowpos(0,0,600,400); + while(1){ // Endlosschleife + get_windowsize(&ww,&hh); + set_drawarea(ww,hh); // Setzen des Zeichenbereiches + clrscr(); + cout <<"Startvorschlag Tiefe:10\nNeigung links:15,Wachstum links:0.7\nNeigung rechts: 18,Wachstum rechts:0.8\n"; + cout <<"Tiefe ( >1 ): "; + cin >> baum.Tiefe; // Die Tiefe einlesen. + + cout<<"Neigung nach links in Grad: "; // Die Neigung links einlesen. + cin >> baum.Neigung_links; + + cout<<"Wachstum nach links ( <1 ): ";// Das Wachstum links einlesen... + cin >>baum.Wachstum_links; + + cout<<"Neigung nach rechts in Grad: "; + cin>>baum.Neigung_rechts; + + cout<<"Wachstum nach rechts ( <1 ): "; + cin>>baum.Wachstum_rechts; + + baum.WerteKorrigieren(); // Die Werte fuer das Wachstum ueberpruefen + // und wennn notwendig korrigieren. + Zeichne_Baum(); // Den Baum zeichnen. + cout << "Baum gezeichnet\n"; + Restart(); // Den "Restart"-Button malen und auf eine Aktivierung warten. + if(StopProcess())break; + + } +} \ No newline at end of file diff --git a/VSMacros80/Samples/Samples.vsmacros b/VSMacros80/Samples/Samples.vsmacros new file mode 100644 index 0000000000000000000000000000000000000000..f0d90f1a33d3ab889274edac5a7a206c44c15825 GIT binary patch literal 717312 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 rm^kpZNPum-FK|u*&!G;Ck?h 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�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 literal 0 HcmV?d00001