效果圖如下
本文主要將我們通過創建窗口、渲染上下文工具、紋理工具、矩形框工具;其需要主要的是:首先我們在顯示BMP時,需要先創建好窗口,再使用渲染工具對窗口進行格式刷,使用紋理工具和渲染工具配合進行BMP圖片顯示,矩形框的作用就是顯示BMP圖片的大小。
下面小例子就是當鼠標點擊時,會通過texture紋理工具,使用渲染拷貝一份紋理顯示至window窗口
#include "playthread.h"
#include <SDL2/SDL.h>
#include <QDebug>
#include <QFile>//#號自動添加雙引號“”
#define END(judge,SDL_Init) \if(judge) \{\qDebug() << #SDL_Init << "error" << SDL_GetError();\goto end;\}playThread::playThread(QObject *parent) : QThread(parent)
{//監聽線程,線程結束后自動釋放線程內存connect(this,&playThread::finished,this,&playThread::deleteLater);
}playThread::~playThread()
{disconnect();//?requestInterruption();quit();wait();qDebug() << "析構了";
}void playThread::run()
{//創建窗口SDL_Window *window = nullptr;//渲染上下文SDL_Renderer *renderer = nullptr;//紋理(直接跟特定驅動程序相關的像素數據)SDL_Texture *texture = nullptr;//矩形框SDL_Rect dstRect = {0,0,50,50};//初始化子系統END(SDL_Init(SDL_INIT_VIDEO),SDL_Init);//創建一個窗口//標題-X-Y-width-heightwindow = SDL_CreateWindow("SDL修改渲染目標",SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,500,500,SDL_WINDOW_SHOWN);END(!window,SDL_CreateWindow);//創建渲染上下文--用于渲染圖形到窗口//這SDL_RENDERER_ACCELERATED -- 個標志告訴 SDL 嘗試創建一個使用硬件加速的渲染器//SDL_RENDERER_PRESENTVSYNC -- 這個標志使渲染器的呈現操作同步到顯示器的垂直同步(VSync)renderer = SDL_CreateRenderer(window, -1,SDL_RENDERER_ACCELERATED |SDL_RENDERER_PRESENTVSYNC);//如果創建失敗if(!renderer){renderer = SDL_CreateRenderer(window,-1,0);END(!renderer,SDL_CreateRenderer);}//創建紋理texture = createTexture(renderer);END(!texture,SDL_CreateTextureFromSurface);//設置渲染目標為windows -- nullptr默認為windowsEND(SDL_SetRenderTarget(renderer,nullptr),SDL_SetRenderTarget);//設置繪制顏色(畫筆顏色)END(SDL_SetRenderDrawColor(renderer,0,0,0,SDL_ALPHA_OPAQUE),SDL_SetRenderDrawColor);//用繪制顏色(畫筆顏色)清除渲染目標---也就是覆蓋END(SDL_RenderClear(renderer),SDL_RenderClear);//拷貝紋理到渲染目標END(SDL_RenderCopy(renderer,texture,nullptr,&dstRect),SDL_rSDL_RenderCopyen);//更新所有的渲染操作到屏幕上SDL_RenderPresent(renderer);//等待退出事件while(!isInterruptionRequested()){SDL_Event event;SDL_WaitEvent(&event);switch(event.type){case SDL_QUIT:{goto end;break;}case SDL_MOUSEBUTTONUP:{showClick(event,renderer,texture);break;}}}end:SDL_DestroyRenderer(renderer);SDL_DestroyTexture(texture);SDL_DestroyWindow(window);SDL_Quit();//初始化子系統后必須做一個退出操作
}SDL_Texture *playThread::createTexture(SDL_Renderer *renderer)
{//創建一個紋理對象SDL_Texture *texture = SDL_CreateTexture(renderer,SDL_PIXELFORMAT_RGB24,SDL_TEXTUREACCESS_TARGET,50,50);if(!texture){//創建失敗return nullptr;}//設置紋理為渲染目標if(SDL_SetRenderTarget(renderer,texture)){return nullptr;}//設置顏色if(SDL_SetRenderDrawColor(renderer,255,255,0,SDL_ALPHA_OPAQUE)){return nullptr;}//畫圖形SDL_Rect rect = {0,0,50,50};if(SDL_RenderDrawRect(renderer,&rect)){return nullptr;}if(SDL_RenderDrawLine(renderer,0,0,50,50)){return nullptr;}if(SDL_RenderDrawLine(renderer,50,0,0,50)){return nullptr;}return texture;
}void playThread::showClick(SDL_Event &event, SDL_Renderer *renderer,SDL_Texture *texture)
{SDL_MouseButtonEvent btn = event.button;int w = 0,h = 0;if(SDL_QueryTexture(texture,nullptr,nullptr,&w,&h)){return;}int x = btn.x - (w >> 1);int y = btn.y - (h >> 1);SDL_Rect dstRect = {x,y,w,h};//SDL_RenderClear(renderer);//賦值紋理到渲染目標SDL_RenderCopy(renderer,texture,nullptr,&dstRect);//更新渲染操作到屏幕上SDL_RenderPresent(renderer);
}