SDL 2.0:如何从SDL_SysWMinfo获取HWND

时间:2013-12-23 19:25:34

标签: c winapi sdl c-preprocessor

问题:

我正在尝试使用win32和SDL 2.0创建一个透明窗口,因为它的官方API尚未发布。我一直无法引用窗口字段来访问HWND。它目前给我这个错误

F:\C programs and compiliers\C\SDL_test\main.c||In function 'get_system_data':|
F:\C programs and compiliers\C\SDL_test\main.c|220|error: 'union <anonymous>' has no member named 'window'|
||=== Build finished: 1 errors, 0 warnings (0 minutes, 0 seconds) ===|

据我所知,它声明了一个带有链接器依赖关联的结构,如下所示:

struct SDL_SysWMinfo
{
    SDL_version version;
    SDL_SYSWM_TYPE subsystem;
    union
    {
#if defined(SDL_VIDEO_DRIVER_WINDOWS)
        struct
        {
            HWND window;                /**< The window handle */
        } win;
#endif
#if defined(SDL_VIDEO_DRIVER_X11)
        struct
        {
            Display *display;           /**< The X11 display */
            Window window;              /**< The X11 window */
        } x11;
#endif
#if defined(SDL_VIDEO_DRIVER_DIRECTFB)
        struct
        {
            IDirectFB *dfb;             /**< The directfb main interface */
            IDirectFBWindow *window;    /**< The directfb window handle */
            IDirectFBSurface *surface;  /**< The directfb client surface */
        } dfb;
#endif
#if defined(SDL_VIDEO_DRIVER_COCOA)
        struct
        {
            NSWindow *window;           /* The Cocoa window */
        } cocoa;
#endif
#if defined(SDL_VIDEO_DRIVER_UIKIT)
        struct
        {
            UIWindow *window;           /* The UIKit window */
        } uikit;
#endif
        /* Can't have an empty union */
        int dummy;
    } info;
};

#endif /* SDL_PROTOTYPES_ONLY */

我只是不知道如何在“匿名”联盟中正确访问该字段。

我做过的研究:

wiki:

http://wiki.libsdl.org/SDL_VERSION

http://wiki.libsdl.org/SDL_SysWMinfo

http://wiki.libsdl.org/SDL_GetWindowWMInfo

SO:

How to center a SDL window in Linux?

还有一些其他的stackoverflow代码与它非常相似,它们无关紧要,因为它们也不起作用。

守则:

#include "test.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

#define WIN_32_LEAN_AND_MEAN /* Trims all the fat from windows */
#include <windows.h>

#define SDL_MAIN_HANDLED

#ifndef __WIN32__
#define __WIN32__
#endif // __WIN32__

#include "SDL2/SDL.h"
#include "SDL2/SDL_mixer.h"
#include "SDL2/SDL_syswm.h"

void get_system_data( application_data* application )
{
    SDL_VERSION( &application->system_info.version );

    if ( !SDL_GetWindowWMInfo( application->window, &application->system_info ) )
        SDL_errorexit( "SDL_GetWindowWMInfo", SDL_LOG_CATEGORY_ERROR );

     switch ( application->system_info.subsystem )
     {
         case SDL_SYSWM_WINDOWS : break;
         default :
             printf( "Unhandled OS!\n" );
             free_application_data( application );
             exit( 1 );
         break;
     }

     application->h_window = application->system_info.info.window;

     return;
 }

我只在这里发布相关代码,如果需要我可以发布更多。

1 个答案:

答案 0 :(得分:2)

纯粹基于struct的声明,我想你会像这样引用HWND

application->h_window = application->system_info.info.win.window;