Ich brauch hilfe bei WIn api



  • Hey ich hab mir in der letzten zeit c++ kenntnisse zugeignet und möchte jetzt win api lernen aber immer wenn ich des anfange blick ich nach kurzer zeit nicht mehr durch .... jetzt wollt ich von euch wissen ab ungefähr welchen kenntnissen man mit win-api anfangen kann vieleicht könnt ihr ja auch schreiben wann ihr ungefair damit angefangen habt^^ Vielen Dank schonmal im voraus

    Und Entschuldigung für meine rechtschreibfehler bin schlecht in Deutsch und grad auch noch müde



  • Wenn man verstanden hat wo man die Doku findet :).



  • Warum willst du überhaupt GUI direkt mittels Win32 API nutzen? Gibt es da einen praktischen Grund?
    Die Win32 GUI API ist nicht sehr schön, man nimmt eher höhere Abstraktionen, wie MFC oder Windows Template Library (WTL).

    Die Dokumentation zur Win32 GUI API findest du natürlich bei MS bzw. in der MSDN.

    Eine gute Anlaufstelle ist auch Codeproject:
    http://www.codeproject.com/Chapters/8/Platforms-Frameworks-Libraries.aspx



  • Ich würde mich da teilweise Artchi anschließen. Es gibt einige C/C++ Frameworks mit denen man ziemlich viel (ich will nicht sagen alles) machen kann und dabei komfortabler zu programmieren sind als mit der Windows API.

    Dazu zählen sicherlich auch die Frameworks um die es hier in diesem Teil des Forums geht (Qt, GTK, wxWidgets ...). Man muss bei einigen Frameworks allerdings dazu sagen, dass sie mitunter nicht selbst die WinAPI benutzen (was meines erachtens aber nicht verkehrt sein muss).

    Ich selbst benutze meistens nur dann die WinAPI wenn mir mein Framework an irgendeiner stelle nicht mehr weiterhelfen kann.



  • Ich will WinApi lernen da ich gelesen hab das man das für Direct X braucht und daruaf will ich dan halt auch hinaus. Sogut ich weis bringen die anderen Methoden wie MFC da nichts und deshalb muss ich dann ja wohl win api lernen 😕



  • Winapinoob schrieb:

    Ich will WinApi lernen da ich gelesen hab das man das für Direct X braucht und daruaf will ich dan halt auch hinaus. Sogut ich weis bringen die anderen Methoden wie MFC da nichts und deshalb muss ich dann ja wohl win api lernen 😕

    Wirklich?

    namespace DayLight{
    
    ControllerDX9::ControllerDX9()
    : m_wasInitialized(false), m_d3d_object(NULL), m_d3d_device(NULL), m_dxSprite(NULL)
    {
    
    }
    
    ControllerDX9::~ControllerDX9()
    {
    	if ( m_dxSprite )   { m_dxSprite->Release();   }
    	if ( m_d3d_device ) { m_d3d_device->Release(); }
    	if ( m_d3d_object ) { m_d3d_object->Release(); }
    }
    
    bool ControllerDX9::init( wxWindow* win )
    {
    	HWND hWindow = (HWND)win->GetHWND();
    	m_size = win->GetSize();
    
    	// Create DX9 Object
    	m_d3d_object = Direct3DCreate9(D3D_SDK_VERSION);
    	if ( m_d3d_object == NULL )
    	{
    		wxMessageBox("Cannot create DX9 Object. Check your Hardware or Drivers.");
    		return false;
    	}
    
    	// Getting Display Format
    	D3DDISPLAYMODE mode;
    	memset(&mode, 0, sizeof(mode));
    	m_d3d_object->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &mode);
    
    	// Create the actual device and set it up
    	{
    		D3DPRESENT_PARAMETERS pp;
    		memset(&pp, 0, sizeof(pp));
    		pp.BackBufferWidth			= m_size.x;
    		pp.BackBufferHeight			= m_size.y;
    		pp.Windowed					= TRUE;
    		pp.BackBufferFormat			= mode.Format;
    		pp.SwapEffect				= D3DSWAPEFFECT_DISCARD;
    		pp.PresentationInterval		= D3DPRESENT_INTERVAL_ONE;
    		pp.hDeviceWindow			= hWindow;
    
    		HRESULT hr = m_d3d_object->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, NULL, D3DCREATE_HARDWARE_VERTEXPROCESSING, &pp, &m_d3d_device);
    		if ( FAILED(hr) )
    		{
    			ControllerDX9::DXErrorMessage(hr, "CreateDevice() failed.");
    			return false;
    		}
    	}
    	// Create Sprite Object
    	{
    		HRESULT hr = D3DXCreateSprite(m_d3d_device, &m_dxSprite);
    		if ( FAILED(hr) )
    		{
    			ControllerDX9::DXErrorMessage(hr, "Cannot create DXSprite Object.");
    			return false;
    		}
    	}
    
    	m_wasInitialized = true;
    	return true;
    }
    
    void ControllerDX9::DXErrorMessage( HRESULT hr, const wxString& message )
    {
    	wxMessageBox(DXGetErrorDescription(hr), message);
    }
    
    void ControllerDX9::injectIdle( wxIdleEvent& e )
    {
    	if ( !m_d3d_device ){
    		return;
    	}
    	if ( this->isInitialized() )
    	{	
    		// Set orthographic projection
    		{
    			D3DXMATRIX ortho;
    			D3DXMATRIX identity;
    
    			D3DXMatrixIdentity(&identity);
    			D3DXMatrixOrthoLH(&ortho, m_size.x, m_size.y, -1.0f, 1.0f );
    
    			m_d3d_device->SetTransform(D3DTS_VIEW, &identity);
    			m_d3d_device->SetTransform(D3DTS_PROJECTION, &ortho);
    			m_d3d_device->SetRenderState( D3DRS_LIGHTING, TRUE );
    		}
    		// Rendering
    		{
    			static float angle = 0.0f;
    			angle += 0.2f;
    			if ( angle >= 360.0f ) angle = 0;
    
    			// Clear Device		
    			m_d3d_device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);
    
    			// Begin Scene
    			m_d3d_device->BeginScene();
    
    			// Begin Sprites
    			m_dxSprite->Begin(D3DXSPRITE_ALPHABLEND|D3DXSPRITE_SORT_TEXTURE);
    
    			// Render sprites
    			for ( size_t i = 0; i < m_spriteList.size(); i++ )
    			{
    				m_spriteList[i].rotate(1,0, angle);
    				m_dxSprite->SetTransform(m_spriteList[i].getTransform());
    				m_dxSprite->Draw(m_spriteList[i].getTexture(), NULL, NULL, NULL, D3DCOLOR_XRGB(255,255,255));	
    			}
    
    			// End Sprites
    			m_dxSprite->End();
    
    			// End Scene
    			m_d3d_device->EndScene();
    
    			// Present the scene
    			m_d3d_device->Present(NULL, NULL, NULL, NULL);
    		}		
    		// Ask for more CPU-cycles
    		e.RequestMore();
    	}
    }
    
    void ControllerDX9::injectSize( wxSizeEvent& e )
    {
    	if ( !m_d3d_device )
    		return;
    
    	m_size = e.GetSize();
    }
    
    TextureDX9* ControllerDX9::loadTexture( const wxString& name )
    {
    	if (!m_d3d_device)
    		return NULL;
    
    	D3DXIMAGE_INFO srcInfo;
    	memset(&srcInfo, 0, sizeof(srcInfo));
    	IDirect3DTexture9* texture = NULL;
    	HRESULT hr = D3DXCreateTextureFromFileEx(	m_d3d_device, 
    												name.c_str(), 
    												0,
    												0,
    												1,
    												D3DPOOL_DEFAULT,
    												D3DFMT_UNKNOWN,
    												D3DPOOL_DEFAULT,
    												D3DX_DEFAULT,
    												D3DX_DEFAULT,
    												0,
    												&srcInfo,
    												NULL,
    												&texture);
    	if ( FAILED(hr) )
    	{
    		ControllerDX9::DXErrorMessage(hr, "Cannot load texture " + name);
    		return NULL;
    	}
    	TextureDX9* r = new TextureDX9(texture, D3DXVECTOR2(srcInfo.Width, srcInfo.Height));
    	return r;
    }
    
    void ControllerDX9::injectMouse( wxMouseEvent& e )
    {
    
    	e.Skip();
    }
    
    void ControllerDX9::injectKey( wxKeyEvent& e )
    {
    	e.Skip();
    }
    
    } // namespace
    
    namespace DayLight{
    
    BEGIN_EVENT_TABLE(D3D9Control, wxControl)
    	EVT_IDLE(D3D9Control::render)
    	EVT_SIZE(D3D9Control::resize)
    END_EVENT_TABLE()
    
    D3D9Control::D3D9Control(wxWindow* parent, int id)
    : wxControl(parent, id), m_d3d_init(false), m_d3d_device(NULL), m_d3d_object(NULL), 
      m_sprite(NULL), m_texture(NULL), m_font(NULL)
    {
    }
    
    D3D9Control::~D3D9Control()
    {
    	if ( m_font )			{ m_font->Release();       }
    	if ( m_texture )		{ m_texture->Release();    }
    	if ( m_sprite )			{ m_sprite->Release();     }
    	if ( m_d3d_device )		{ m_d3d_device->Release(); }
    	if ( m_d3d_object )		{ m_d3d_object->Release(); }
    }
    
    void D3D9Control::render(wxIdleEvent& e)
    {
    	if ( !m_d3d_device ){
    		return;
    	}
    	if ( m_d3d_init )
    	{	
    		// Set orthographic projection
    		{
    			D3DXMATRIX ortho;
    			D3DXMATRIX identity;
    
    			D3DXMatrixIdentity(&identity);
    			D3DXMatrixOrthoLH(&ortho, this->GetSize().x, this->GetSize().y, 0.0f, 1.0f );
    
    			m_d3d_device->SetTransform(D3DTS_VIEW, &identity);
    			m_d3d_device->SetTransform(D3DTS_PROJECTION, &ortho);
    			m_d3d_device->SetRenderState( D3DRS_LIGHTING, TRUE );
    		}
    		// Rendering
    		{
    		// Clear Device		
    			m_d3d_device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);
    
    				// Begin Scene
    				m_d3d_device->BeginScene();
    
    				m_sprite->Begin(D3DXSPRITE_ALPHABLEND|D3DXSPRITE_SORT_TEXTURE);
    
    					D3DXMATRIX scale;					
    					D3DXVECTOR2 hotspot(16,16);
    					D3DXVECTOR2 scale_factor(0.25f, 0.25f);
    					D3DXVECTOR2 position(100,100);
    					D3DXMatrixTransformation2D(&scale,NULL,0.0,&scale_factor,&hotspot,0,&position);
    
    					m_sprite->SetTransform(&scale);
    					m_sprite->Draw(m_texture, NULL, NULL, NULL, D3DCOLOR_XRGB(255,255,255));					
    
    					// txt
    					RECT rct;
    					memset(&rct, 0, sizeof(RECT));
    					D3DXMATRIX identity;
    					D3DXMatrixIdentity(&identity);
    					m_sprite->SetTransform(&identity);
    
    					m_font->DrawText(m_sprite, L"Hello\nWorld", -1, &rct, DT_CALCRECT|DT_WORDBREAK, D3DCOLOR_XRGB(255,0,0) );
    					m_font->DrawText(m_sprite, L"Hello\nWorld", -1, &rct, DT_WORDBREAK, D3DCOLOR_XRGB(255,0,0) );
    
    				m_sprite->End();				
    
    				// End Scene
    				m_d3d_device->EndScene();
    
    			// Present the scene
    			m_d3d_device->Present(NULL, NULL, NULL, NULL);
    	}		
    		// Ask for more CPU-cycles
    		e.RequestMore();
    	}
    }
    
    bool D3D9Control::initD3D10()
    {
    	HWND hWindow = (HWND)this->GetHWND();
    
    	// Create DX9 Object
    	m_d3d_object = Direct3DCreate9(D3D_SDK_VERSION);
    	if ( m_d3d_object == NULL )
    	{
    		wxMessageBox("Cannot create DX9 Object. Check your Hardware or Drivers.");
    		return false;
    	}
    
    	// Getting Display Format
    	D3DDISPLAYMODE mode;
    	memset(&mode, 0, sizeof(mode));
    	m_d3d_object->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &mode);
    
    	// Create the actual device and set it up
    	{
    		D3DPRESENT_PARAMETERS pp;
    		memset(&pp, 0, sizeof(pp));
    		pp.BackBufferWidth			= this->GetSize().x;
    		pp.BackBufferHeight			= this->GetSize().y;
    		pp.Windowed					= TRUE;
    		pp.BackBufferFormat			= mode.Format;
    		pp.SwapEffect				= D3DSWAPEFFECT_DISCARD;
    		pp.PresentationInterval		= D3DPRESENT_INTERVAL_ONE;
    		pp.hDeviceWindow			= hWindow;
    
    		HRESULT hr = m_d3d_object->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, NULL, D3DCREATE_HARDWARE_VERTEXPROCESSING, &pp, &m_d3d_device);
    		if ( FAILED(hr) )
    		{
    			D3D9Control::DXErrorMessage(hr, "CreateDevice() failed.");
    			return false;
    		}
    	}
    	// Texture
    	{
    
    		HRESULT hr = D3DXCreateTextureFromFile(m_d3d_device, L"data/textures/bohne.png", &m_texture);
    		if ( FAILED(hr) )
    		{
    			D3D9Control::DXErrorMessage(hr, "Failed to load Texture.");
    			return false;
    		}
    	}
    	// Sprite
    	{				
    		HRESULT hr = D3DXCreateSprite(m_d3d_device, &m_sprite);
    		if ( FAILED(hr) )
    		{
    			D3D9Control::DXErrorMessage(hr, "Failed to create sprite.");
    			return false;
    		}
    	}
    	// Font
    	{
    		AddFontResource(L"data/fonts/adventure.ttf");
    		HRESULT hr = D3DXCreateFont(m_d3d_device, 32, 0, FW_NORMAL, 0, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Adventure", &m_font);
    		if ( FAILED(hr) )
    		{
    			D3D9Control::DXErrorMessage(hr, "Failed to create font");
    			return false;
    		}
    	}
    
    	m_d3d_init = true;
    	return true;
    }
    
    void D3D9Control::resize( wxSizeEvent& e )
    {
    	if ( !m_d3d_device )
    		return;
    }
    
    void D3D9Control::DXErrorMessage( HRESULT hr, const wxString& message )
    {
    	wxMessageBox(DXGetErrorDescription(hr), message);
    }
    

    DirectX mit wxWidgets. Auszugsweise.
    Der Code ist allerdings nicht fürs Guttenberg Pattern geeignet, da er nur Quick und Dirty gemacht wurde um etwas zu testen.
    🙂



  • Winapinoob schrieb:

    Ich will WinApi lernen da ich gelesen hab das man das für Direct X braucht und daruaf will ich dan halt auch hinaus. Sogut ich weis bringen die anderen Methoden wie MFC da nichts und deshalb muss ich dann ja wohl win api lernen 😕

    Du kannst z.B. die MFC oder WTL nutzen, und ohne Schwierigkeiten dort DirectX einbetten. Denn du brauchst ja nur ein Handle oder Context zu holen und an DirectX übergeben. Und genau das kannst du mit MFC und WTL tun. Diese APIs nutzen ja selber die Win32 API direkt, aber machen es halt komfortabler für den Programmierer.



  • Na das is gut ^^ also problem 1 gelöst .. ich muss kein win api lernen ... problem 2 xD mfc kostet doch was sogut ich weis is des bei wtl auch so ?



  • Winapinoob schrieb:

    Na das is gut ^^ also problem 1 gelöst .. ich muss kein win api lernen ... problem 2 xD mfc kostet doch was sogut ich weis is des bei wtl auch so ?

    MFC ist bei Visual Studio Express afaik nicht dabei. Nimm einfach wxWidgets für DirectX, das kannst dann auch universell einsetzen für GUI-Applikationen.



  • ok danke ^^ jetzt gibts nur noch ein problem ich kapier net wie ich des wxWidgets runterladen/installen soll ich mach da i-was falsch glaub ich



  • Winapinoob schrieb:

    ok danke ^^ jetzt gibts nur noch ein problem ich kapier net wie ich des wxWidgets runterladen/installen soll ich mach da i-was falsch glaub ich

    Man sollte natürlich wissen, wie man Zusatzbibliotheken installiert und verwendet.
    Eventuell hilft das:
    http://wiki.wxwidgets.org/Microsoft_Visual_C%2B%2B_Guide



  • MFC mußt du auch nicht nehmen. Du kannst WTL nehmen. Das ist OpenSource und auch von MS.

    http://wtl.sourceforge.net/

    Auf Codeproject gibt es viele Tutorials zur WTL!
    http://www.codeproject.com/KB/wtl/

    DirectX Game mit WTL:
    http://www.codeproject.com/KB/directx/Quadrino.aspx

    Aber wxWidgets geht natürlich auch...


Log in to reply