问题:
我正在尝试使用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;
}
我只在这里发布相关代码,如果需要我可以发布更多。
答案 0 :(得分:2)
纯粹基于struct
的声明,我想你会像这样引用HWND
:
application->h_window = application->system_info.info.win.window;