最近有個項目需要在一個指定的視窗上播放流視訊,是以做了個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
工具使用方法如下圖
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TP31UeFpnT4VEROBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL3cTNyQDNxMjM0ADOwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
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函數哈.
運作結果,讓我皮一下可好?
因為程式沒有持續重新整理界面,是以一旦滑鼠劃過檔案夾中有檔案 的地方視窗就被重新整理了.