天天看點

SDL在指定的windows視窗上繪圖或播放

最近有個項目需要在一個指定的視窗上播放流視訊,是以做了個ffmpeg+sdl的播放器,期間遇到個小問題,如何用sdl在指定的視窗上渲染呢?

網上查了半天,有人說在初始化sdl之前用SDL_putenv函數

char sdl_var[64];   
sprintf(sdl_var, "SDL_WINDOWID=%d", hWnd);//主視窗句柄 
SDL_putenv(sdl_var);
           

可是我的vs環境說找不到這個函數,不知道是什麼原因,知道的兄弟可以評論告知一下.

也許是sdl 2.0後廢棄了吧.

後來的解決方案是用SDL_CreateWindowFrom函數.

使用方法:

1.先獲得視窗句柄.測試的話,可以使用visual studio的spy工具.高版本好像沒有這個工具了.

下載下傳位址:https://download.csdn.net/download/weixin_44117123/12686861

工具使用方法如下圖

SDL在指定的windows視窗上繪圖或播放

2.将sdl建立視窗的SDL_CreateWindow函數替換成以下語句:

HWND handle = (HWND)0x001B1A84;	//這裡是step1獲得的句柄.
SDL_Window *window = SDL_CreateWindowFrom(handle);
           

完整代碼:

#include <stdio.h>
#include<cstring>
#include<Windows.h>
#pragma comment(lib,"SDL2.lib")
#pragma comment(lib,"SDL2main.lib")

extern "C"
{
#include "SDL.h"
}
int main(int argc, char* args[])
{
	//視窗含有的surface
	SDL_Surface* screenSurface = NULL;

	//初始化SDL
	if (SDL_Init(SDL_INIT_VIDEO) < 0)
	{
		printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
	}
	else {
		//建立 window
		//SDL_Window *window = SDL_CreateWindow("ShowPicture", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN);
		HWND handle = (HWND)0x00090CA0;		//獲得的視窗句柄是00090CA0
		SDL_Window *window = SDL_CreateWindowFrom(handle);

		if (window == NULL)
		{
			printf("Window could not be created! SDL_Error: %s\n", SDL_GetError());
		}
		else {
			//渲染層
			SDL_Renderer * renderer = SDL_CreateRenderer(window, -1, 0);
			SDL_Surface *pic = SDL_LoadBMP("123.bmp");
			//載入的圖檔生成SDL材質
			SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer, pic);

			//把材質複制到渲染器
			SDL_RenderCopy(renderer, texture, NULL, NULL);
			//顯示出來
			SDL_RenderPresent(renderer);

			bool quit = false;
			SDL_Event event;

			while (!quit)
			{//主消息循環
				SDL_WaitEvent(&event);

				switch (event.type)
				{
					//使用者從菜單要求退出程式
				case SDL_QUIT:
					quit = true;
					break;
				}
			}

			// 清理資源
			SDL_DestroyTexture(texture);
			SDL_FreeSurface(pic);
			SDL_DestroyRenderer(renderer);
			SDL_DestroyWindow(window);
		}
	}

	//退出SDL 
	SDL_Quit();

	return 0;
}

           

注:以上代碼來源于網際網路,我隻是改了建立視窗的SDL_CreateWindow函數哈.

運作結果,讓我皮一下可好?

SDL在指定的windows視窗上繪圖或播放

因為程式沒有持續重新整理界面,是以一旦滑鼠劃過檔案夾中有檔案 的地方視窗就被重新整理了.