Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: 'kamillo121'
Inne artykuły

[SDL, C++] Pobieranie uchwytu HWND okna SDL

[artykuł] Artykuł opisuje w jaki sposób można pobrać uchwyt HWND z okna renderującego SDL.
Jako, że wiele osób pytało na forum i poza nim czy można pobrać uchwyt HWND okna utworzonego przez SDL, postanowiłem napisać mały art o tym.
Co nam będzie potrzebne ?
  • Utworzony projekt SDL w ulubionym środowisku
  • Średnia znajomość niektórych struktur z SDL_syswm.h
C/C++
#include "SDL.h"
#include "SDL_syswm.h"



int main( int, char *[] )
{
   
    /*inicjalizujemy okno w SDL*/
   
    SDL_Surface * SCREEN;
   
    if( SDL_Init( SDL_INIT_EVERYTHING ) ==- 1 )
    {
        return false;
    }
   
    SCREEN = SDL_SetVideoMode( 800, 600, 32, SDL_SWSURFACE );
   
    if( SCREEN == NULL )
    {
        return false;
    }
   
   
   
    /*pobieramy dane na temat konta */
    SDL_SysWMinfo WMI;
   
    SDL_VERSION( & WMI.version );
   
    if( SDL_GetWMInfo( & WMI ) )
    { //informacje na temat okna  pobrane
       
        HWND hwnd = WMI.window;
       
        /*działania na uchwycie okna(utworzonego przez SDL) hwnd  */
    }
    SDL_Quit();
    return 0;
}

Teraz wytłumaczę krok po kroku co do czego.

Najpierw musimy dołączyć potrzebne nagłówki SDL.h i SDL_syswm.h.
C/C++
#include "SDL.h"
#include "SDL_syswm.h" //warto zaznajomić się z tym nagłówkiem, zawiera on definicję potrzebnych struktur

int main( int, char *[] )
{

Następnie przystąpimy do stworzenia okna w SDL, by to zrobić najpierw musimy powołać bibliotekę do "życia" funkcją SDL_Init(), po czym ustawić tryb ekranowy dla jednej z powierzchni graficznej funkcją SDL_SetVideoMode().
C/C++
SDL_Surface * SCREEN;

if( SDL_Init( SDL_INIT_EVERYTHING ) ==- 1 )
{
    return false;
}

SCREEN = SDL_SetVideoMode( 800, 600, 32, SDL_SWSURFACE );

if( SCREEN == NULL )
{
    return false;
}


Teraz zajmiemy się pobieraniem uchwytu naszego okna.
C/C++
/*pobieramy dane na temat konta */
SDL_SysWMinfo WMI;

SDL_VERSION( & WMI.version );

if( SDL_GetWMInfo( & WMI ) )
{ //informacje na temat okna  pobrane
   
    HWND hwnd = WMI.window;
   
    /*działania na uchwycie okna(utworzonego przez SDL) hwnd  */
}
Najpierw tworzymy obiekt struktury SDL_SysWMinfo po czym wywołujemy metodę SDL_VERSION, która uzupełni naszą strukturę o potrzebne dane,
następnie sprawdzamy czy funkcja SDL_GetWMInfo() z parametrem WMI(wskaźnik na strukturę SDL_SysWMinfo) pobierze resztę danych o oknie, jeżeli zwróci wartość 1 znaczyć to będzie, że wszystko poszło zgodnie z planem i potrzebne pola WMI są uzupełnione.
Teraz by dostać się do naszego upragnionego uchwytu musimy po prostu pobrać go z pola window obiektu WMI

Na koniec musimy po sobie posprzątać
C/C++
SDL_Quit();
return 0;
}