Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 |
while(myapp.isRunning())
|
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
class Window { typedef std::list< Window* > WindowListType; struct WindowCmp : public std::binary_function< Window*, HWND, bool > { bool operator()( Window* ptr, HWND handle ) const { return ( ptr->GetHandle() == handle ); } }; private: HWND hWnd; Window* owner; // Controllist, ... static WindowListType windows; protected: bool CreateWindowEx( DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance ); virtual LRESULT HandleNotifications( UINT uMsg, WPARAM wParam, LPARAM lParam ); virtual void DoDestroy(); static bool RegisterWindow( const char* Name, DWORD Style, HINSTANCE hInstance ); static LRESULT APIENTRY WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); public: Window( Window* owner = NULL ); virtual ~Window() = 0; void Destroy(); void Show( bool show ); void SetFont( HFONT font ); void SetRedraw( bool redraw ); HWND GetHandle() const; HWND GetOwner() const; // ... virtual void SetText( const std::string& text ); virtual std::string GetText() const; virtual int GetTextLength() const; // ... virtual void OnClose(); virtual void OnDestroy(); // Other Notifications ... }; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
class WindowFrame : public Window { private: static unsigned long count; public: WindowFrame( Window* owner = NULL ) : Window( owner ) { // xyz } ~WindowFrame() { // xyu } void Create( const std::string& name, int x, int y, int nWidth, int nHeight ) { HINSTANCE hInst = GetModuleHandle( NULL ); std::string ClassName = boost::str( boost::format( "%1%%2%_%3%" ) % "WindowFrame" % name % count++ ); if ( !RegisterWindow( ClassName.c_str(), CS_OWNDC, hInst ) ) { throw std::logic_error( "Error while registering the window" ); } if ( !CreateWindowEx( 0, ClassName.c_str(), name.c_str(), WS_OVERLAPPEDWINDOW, x, y, nWidth, nHeight, 0, 0, hInst ) ) { throw std::logic_error( "Error while creating the window" ); } Show( true ); } void OnDestroy() { Window::OnDestroy(); PostQuitMessage( 0 ); } }; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 |
class Control : public Window { public: Control( Window* owner ) : Window( owner ) {} virtual ~Control() = 0 {} }; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class Button : public Control { private: // Notification, Events, ... public: Button( Window* owner ) : Control( owner ) {} void Create( int x, int y, int nWidth, int nHeight, const char* text ) { // Code zum erstellen des Buttons } // Notification Handling }; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#include "Window.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) { MSG msg; WindowFrame wnd; Button btn( &wnd ); Checkbox chktest( &wnd ); Label lblText( &wnd ); try { wnd.Create( "Foobar", 0, 0, 800, 600 ); btn.Create( 325, 275, 75, 25, "Button1" ); chktest.Create( 100, 100, 120, 25, "Yeehaw", true ); lblText.Create( true, false ); } catch ( const std::logic_error& e ) { MessageBox( 0, "Cannot create the window", "Error", MB_OK | MB_ICONERROR ); } while ( true ) { if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) { if ( msg.message == WM_QUIT ) { break; } TranslateMessage( &msg ); DispatchMessage( &msg ); } else { POINT p = wnd.GetCursorPos(); std::string str = boost::str( boost::format( "Mousepos: %1%:%2%" ) % p.x % p.y ); lblText.SetText( str ); } } return 0; } |
Zitat von »"koschka"«
Hmmn machen Ansätze sind ganz gut, aber OnClick bzw. OnDestroy würd ich nicht als Template Method benutzen, sondern einen Funktionszeiger übergeben, weche Funktion er ausführen soll. Ausserdem würd ich die while Schleife auf jedenfall kapseln
Zitat von »"koschka"«
Ne, nix mit Templates . Template Method ist ein Entwurfsmuster. (wie singleton) und genau das hast du drin bei OnClick und OnDestroy.
Zitat von »"koschka"«
Wenn du OnClick und OnDestroy mit Zeigern machst, brauchst du die Klasse nicht erben.
Zitat von »"koschka"«
Übrigends sind abstrakte Methoden in C++ pure virtual ( virtual bool bla() = 0; )
Werbeanzeige