實現目的
SDL是一個非常優秀的跨平臺的開源 UI lib, 在視頻,遊戲等領域都有比較廣泛的利用。
我爲了開發一套Windows端的網路哦攝像頭監控軟件,因此選用了wpf和sdl的組合。其中sdl負責視頻顯示,wpf負責界面元素和業務邏輯的開發。
實現原理
嵌入Window
無論上層的框架如何變動,最後必定會調用CreateWindow()創建Window, 因此,我們採用將SDL嵌入創建好的Window中的方式實現窗口的集成。
消息循環
SDL的主程序和Win32主程序一樣,都是如下類似的消息循環體。而WPF框架像其他Windows UI框架一樣,都已經幫我們寫好了主消息循環體。
而且Windows也限制在其他非UI線程中操作UI元素,因此我們用一個Timer消息來輪詢SDL的消息。
while (SDL_PollEvent(&e)){
//If user closes the window
if (e.type == SDL_QUIT){
quit = true;
}
//If user presses any key
if (e.type == SDL_KEYDOWN){
quit = true;
}
//If user clicks the mouse
if (e.type == SDL_MOUSEBUTTONDOWN){
quit = true;
}
}
實現細節
軟件環境
SDL在MFC中的實現
首先我在MFC中驗證如何將SDL嵌入已經創建的Window中去。參考如下的鏈接便便實現了:
http://blog.csdn.net/lights_joy/article/details/4049123ci'ci
此demo的下載鏈接如下:
http://download.csdn.net/detail/chenxiemin/8084343
SDL在WPF中的實現
sdl嵌入wpf中的過程要稍微複雜一點。
雖然我們可以獲得WPF中的Window Handler(博客地址http://blog.csdn.net/senophen/article/details/1566126)。
但是因爲WPF會在創建的Window上蓋上一層,因此我們選擇使用WPF提供的 HwndHost類。參見 http://msdn.microsoft.com/en-us/library/ms742522(v=vs.110).aspx。
此demo的下載鏈接如下:http://download.csdn.net/detail/chenxiemin/8089115