1. 程式人生 > >在MFC中使用SDL2.0(SDL視窗嵌入到MFC中)

在MFC中使用SDL2.0(SDL視窗嵌入到MFC中)

    本例開發環境:win7 64位 +VS2012 + SDL2.0.3 (stable)

第一步:新建MFC基於對話方塊的應用程式(此例工程命名為MFC_SDL),然後直接點選完成即可,如下圖。


第二步:刪除“TODO:在此放置對話方塊控制元件”。新增Picture Control和Button到對話方塊中,修改Button的名字為顯示圖片。


  第三步:SDL相關標頭檔案、lib庫以及dll動態連結庫的設定可以參考這篇文章:SDL2學習筆記1-環境搭建以及HelloSDL

  第四步:開啟MFC_SDLDlg.cpp檔案,在程式中新增標頭檔案

#include <SDL.h>

  第五步:雙擊Button控制元件,轉到滑鼠點選響應程式。新增程式。程式如下:

void CMFC_SDLDlg::OnBnClickedButton1()
{
	// TODO: 在此新增控制元件通知處理程式程式碼
	//The window we'll be rendering to
	SDL_Window* gWindow = NULL;
	//The surface contained by the window
	SDL_Surface* gScreenSurface = NULL;

	//The image we will load and show on the screen
	SDL_Surface* gHelloWorld = NULL;

	//首先初始化
	if(SDL_Init(SDL_INIT_VIDEO)<0)
	{
		printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
		return ;
	}
	//建立視窗
	gWindow=SDL_CreateWindowFrom( (void *)( GetDlgItem(IDC_STATIC)->GetSafeHwnd() ) );
	if(gWindow==NULL)
	{
		printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
		return ;
	}
	//Use this function to get the SDL surface associated with the window.
	//獲取視窗對應的surface
	gScreenSurface=SDL_GetWindowSurface(gWindow);

	//載入圖片
	gHelloWorld = SDL_LoadBMP("Hello_World.bmp");//載入圖片
	if( gHelloWorld == NULL )
	{
		printf( "Unable to load image %s! SDL Error: %s\n", "Hello_World.bmp", SDL_GetError() );
		return ;
	}
	//Use this function to perform a fast surface copy to a destination surface.  
	//surface的快速複製
	//              SDL_Surface* src ,const SDL_Rect* srcrect , SDL_Surface* dst ,  SDL_Rect* dstrect
	SDL_BlitSurface( gHelloWorld ,     NULL ,                     gScreenSurface ,          NULL);
	SDL_UpdateWindowSurface(gWindow);//更新顯示copy the window surface to the screen

}

  第六步:執行程式,點選“顯示圖片”按鈕,現象如下:


  從程式中可以看出,要將SDL視窗嵌入到MFC中很簡單,只要將SDL原來建立視窗的函式:

SDL_Window* gWindow = SDL_CreateWindow("SHOW BMP",SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,SCREEN_WIDTH,SCREEN_HEIGHT,SDL_WINDOW_SHOWN);

  改成下面的函式即可:

SDL_Window* gWindow=SDL_CreateWindowFrom( (void *)( GetDlgItem(IDC_STATIC)->GetSafeHwnd() ) );

其中,IDC_STATIC為PictureControl的ID。