如题,由于本人以前没有接触过Direct3D,所以这个问题搞了好久才搞好,给我印象深刻,写篇博客记录下。
在代码中,使用了两种不同的绘图方式:软解时使用GDI,硬解时使用Direct3D9,因为实现硬解时Direct3D9的COM接口指针已经得到了,所以播放就用Direct3D9了。
由于Direct3D是为3D处理而生的,播放视频只是副业,里面很多名称都是与3D绘图有关。
不说废话了,回到正题上。其实这个问题很简单,是我想复杂了。
在IDirect3D9的CreateDevice方法中,需要传入一个窗口句柄和一个结构体作为创建设备的参数。而在这个结构体中有两个成员:BackBufferWidth和BackBufferHeight。他们的大小直接决定了播放时图像的最大分辨率。如果你传入的是一个小窗口的宽高,不论原视频大小,这个长宽将作为视频播放时的最大宽高值,当你把窗口放大到比这个宽高还要大时,就会出现模糊。
我的解决方法是把以上两个成员赋值为显示器的宽高,因为你窗口放的再大,总不能超过显示器大小(其实就是全屏)。
这样问题是解决了,但不知道这样符不符合Direct3D API的设计初衷。我也不知道在其他API中有没有给出后悔API,在窗口大小发生变化时,可以重设上面两个成员的值。