精华内容
下载资源
问答
  • 摘要:VC/C++源码,数据库应用,DDraw.dll DDraw源码,Directx Draw的多个实例,生成DDraw.dll实例,源码项目,不能在XP上运行,压缩包内有多个相关的实例,懂得的人下载源码编译试下。
  • cnc-ddraw cnc-ddraw can fix compatibility issues in older games, such as black screen, bad performance, crashes or defective Alt+Tab.   Features Supports Windows XP, Vista, 7, 8, 10 and Wine GDI / ...
  • DDRAW DEMO

    2009-08-08 23:53:19
    简单的游戏DEMO,演示了如何使用DDRAW
  • Ddraw misc section

    2021-01-01 15:40:53
    I have plans to add a module/class for reading from ddraw in one pass, but for this it is desirable that the section is not so big. (although I think that you can write your own reading function in ...
  • DDraw应用样例

    2017-02-14 18:14:44
    一个简单的DDraw应用程序  DDraw是一个组件。组件由接口组成。 DDraw总共由五个接口组成:  IUnknown:所有com接口都必须从这里继承的。(请看相关文章COM笔记-QueryInterface函数) ...

    一个简单的DDraw应用程序 


    DDraw是一个组件。组件由接口组成。

    DDraw总共由五个接口组成: 

    IUnknown:所有com接口都必须从这里继承的。(请看相关文章COM笔记-QueryInterface函数

    IDirectDraw:使用DDraw必须创建的主接口对象。

    IDirectDrawSurface:创建、控制和显示的实际显示表面。分主显示表面和从显示表面

    IDirectDrawPalette:创建、加载和控制调色板,以及将它关联到显示表面。

    IDirectDrawClipper:剪切DDraw光栅和位图操作到一些可见显示表面的子集。

     

      

     

    这些接口怎么配合起来成为一个DDraw应用程序的: 

    1.  创建DDraw对象并使用QueryInterface()来得到 一个IDirectDraw7接口,或是直接用DirectDrawCreateEx()创建一个DDraw7接口。用这个接口来设置协作级别和视频模式。

    2.  使用IDirectDrawSurface7接口至少创建 一个主显示表面用以绘图。(如果每个像素为8位或更少我们会用到一个调色板)

    3.  用IDirectDrawPalette接口创建 一个调色板。(注意如果像素高于8位,如16位、24位,32位,没有调色板,现在主流2D游戏多数是16色)

    4.  如果DDraw应用程序要使用窗口,或者要减少位图以免溢出DDraw显示表面的可见边界,我们至少需要合建一个剪裁器并将其尺寸设置为可见窗口的范围。如下图

     

    5.  最后就是在表面上绘图了。

    下面开始介绍一个最简单的DDraw应用程序: 

    创建DDraw对象:

    用来DirectDrawCreateEx来直接创建DDraw对象,声明如下:

      

    HRESULT WINAPI DirectDrawCreateEx( GUID FAR *lpGUID, // 视频显卡驱动的GUID,NULL表示系统默认的硬件 LPVOID *lplpDD, // 这是返回的接口 REFIID iid, // 请求接口相对应的ID IUnknown FAR *pUnkOuter // 总是高为NULL );

      

    设置协作级别:

    对DDraw来说,我们唯一关心的是视频显示设备,有两种情况:全屏模式和窗口模式。

    用SetCooperativeLevel来设置DDraw的协作级别。声明如下:

    HRESULT SetCooperativeLevel(HWND hWnd, // 窗口句柄,一般使用主窗口句柄 DWORD dwFlags); // 控制标志

    dwFlags控制标志,它直接影响DDraw与Windows之间协作方式。

    SetCooperativeLevel()的控制标记 

    描述

    DDSCL_ALLOWMODEX

    允许使用Mode X (320x200,240,400) 显示模式.公当设置DDSCL_EXCLUSIVE和DDSCL_FULLSCREEN时生效

    DDSCL_ALLOWREBOOT

    允许在排他(全屏)模式下检测到Ctrl+Alt+Del

    DDSCL_EXCLUSIVE

    请求排他级别。此标记需要与DDSCL_FULLSCREEN标记同时作用

    DDSCL_FPUSETUP

    表示调用 程序希望配置FPU以得到最佳的Direct3D性能(禁用度和异常),这样Direct3D不需要每次都明确地FPU。更多信息,请在DirectX SDK中查询“DDraw协作级别和FPU数度”

    DDSCL_FULLSCREEN

    表示使用全屏模式。其他应用程序的GDI将不能写屏,此标记必须与DDSCL_EXCLUSIVE标记同时使用。

    DDSCL_MULTITHREADED

    请求对于多线程安全的DDraw行为。

    DDSCL_NORMAL

    表示应用程序是一个通常的Windows应用程序。这个标记不能与DDSCL_ALLOWMODEX, DDSCL_EXCLUSIVE, 或 DDSCL_FULLSCREEN标记一起使用。

    DDSCL_NOWINDOWCHANGES

    表示不允许DDraw激活时最小化或还原应用程序窗口。

    上面写了一大堆标记,其实大多数情况是下面两种情况。

    全屏模式:DDSCL_FPUSETUP | DDSCL_ALLOWMODEX | DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT

    窗口模式:DDSCL_NORMAL

    下面例子:

    因为是用于学习,没有把框架搞得太复杂,全写在一个cpp里了。

    关于怎么写一个GUI应用程序,可以查看《一个简单的windows GUI应用程序

    http://www.cnblogs.com/fangyukuan/archive/2010/08/31/1814159.html

    源代码下载

    复制代码
    //------------------------------------------------------------------------- // 文件名 : 6_1.cpp // 创建者 : 方煜宽 // 邮箱 : fangyukuan@gmail.com // 创建时间 : 2010-12-1 23:37 // 功能描述 : 一个简单的DDraw应用程序 // 注意在工程中把ddraw.lib包含进去 // ------------------------------------------------------------------------- #define INITGUID #include<windows.h> #include <ddraw.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); HWND main_window_handle = NULL; // 主窗口句柄 LPDIRECTDRAW7 lpdd = NULL;   // DDraw 对象 int Game_Init(void *parms = NULL, int num_parms = 0) { // 创建ddraw对象 if (FAILED(DirectDrawCreateEx(NULL, (void **)&lpdd, IID_IDirectDraw7, NULL))) return(0); // 窗口模式(设置协作级别) lpdd->SetCooperativeLevel(main_window_handle, DDSCL_NORMAL); return 1; } / int Game_Shutdown() { if (lpdd) { lpdd->Release(); lpdd = NULL; } return 1; }
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { HWND hwnd; MSG msg; TCHAR lpszClassName[] = TEXT("kuan"); WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = ::LoadIcon(NULL,IDI_APPLICATION); wc.hCursor = ::LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)::GetStockObject(BLACK_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = lpszClassName; RegisterClass(&wc); // WS_OVERLAPPEDWINDOW 可以改变窗口大小 // WS_OVERLAPPED 不可以改变窗口大小 // WS_POPUP 全屏 hwnd = CreateWindow(lpszClassName, TEXT("fangyukuan"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, 300,80,800,600, NULL, NULL, hInstance, NULL); main_window_handle = hwnd; // ::ShowWindow(hwnd,SW_SHOWNORMAL); // ::UpdateWindow(hwnd); // while(::GetMessage(&msg,NULL,0,0)) // { // ::TranslateMessage(&msg); // ::DispatchMessage(&msg); // } Game_Init(); while(TRUE) { if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) break; ::TranslateMessage(&msg); ::DispatchMessage(&msg); } } Game_Shutdown(); return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_LBUTTONDOWN: { ::MessageBeep(0); } break; case WM_DESTROY: ::PostQuitMessage(0); break; default: return ::DefWindowProc(hwnd,message,wParam,lParam); } return 0; }
    复制代码

     程序运行效果:

     

    展开全文
  • yuv ddraw Simple application

    2012-12-15 11:31:43
    yuv ddraw 的简单例子
  • ddraw.lib文件

    热门讨论 2013-06-05 22:14:47
    一般JMVC软件Visual studio 低版本转向高版本时会出现找不到ddraw.lib的错误,把这个文件加到库文件中即可解决问题。
  • 使用硬件加速,视频绘制,ddraw 完美封装类,C++类,视频播放器
  • DDraw绘图

    2013-07-16 01:02:00
    首先需要确保电脑上的Ddraw硬件加速功能已经打开,安装DirectX March 2009之后,可以在【开始】菜单->运行 Dxdiag 命令,检查是否打开硬件加速。如图1: 如果DirectDraw加速未启用,需要更新驱动。 ...

    微软已经提供了GDI+绘图方式,但是GDI+绘图较慢,另外微软提供了效率更高的DirectDraw绘图方式。DirectDraw提供硬件加速功能。

    首先需要确保电脑上的Ddraw硬件加速功能已经打开,安装DirectX March 2009之后,可以在【开始】菜单->运行 Dxdiag 命令,检查是否打开硬件加速。如图1:

    image_thumb5

    如果DirectDraw加速未启用,需要更新驱动。


    开始使用DirectDraw编写程序,需要引入ddraw.h头文件,并把ddraw.lib添加到工程里。

    DirectDrawCreate(NULL, &m_lpDirectDraw, NULL) 用于创建一个DirectDraw对象,通过该对象用来创建主表面和离屏表面。

    DirectDraw有两种表面,主表面和离屏表面。主表面是现实跟用户的,离屏便面相对于一个内存块,可以进行图像处理,可以将离屏表面的图像拷贝到主表面,这样就将新的图像显示给用户了。

        // 创建主表面
        DDSURFACEDESC dds;
        ZeroMemory(&dds, sizeof(DDSURFACEDESC));
        dds.dwSize = sizeof(DDSURFACEDESC);
        dds.dwFlags = DDSD_CAPS;
        dds.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
        hr = m_lpDirectDraw->CreateSurface(&dds, &m_PrimarySurface, NULL);

      以上代码用来创建一个主表面,覆盖整个屏幕,dds.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE 用来描述该表面为主表面;

     

    // 创建备用表面
    ZeroMemory(&dds, sizeof(DDSURFACEDESC));
    dds.dwSize = sizeof(DDSURFACEDESC);
    dds.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
    dds.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
    dds.dwWidth = m_ClientRect.Width();
    dds.dwHeight = m_ClientRect.Height();
    hr = m_lpDirectDraw->CreateSurface(&dds, &m_SecondSurface, NULL);

    dds.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN  用来创建备用表面。由于本例子中,是一个CDialog窗体,所以需要创建裁剪器,将图像区域限制在一个CStatic上。

    hr = m_lpDirectDraw->CreateClipper(0, &m_Clipper, NULL);
    if (FAILED(hr))  return FALSE;
    hr = m_Clipper->SetHWnd(NULL, m_Static.m_hWnd);
    if (FAILED(hr)) return FALSE;
    hr = m_PrimarySurface->SetClipper(m_Clipper);

    CreateClipper用于创建裁剪器,SetHWnd设置显示区域的Handle。

    备用表面创建之后需要刷一层背景色,例子中用RGB(100, 100, 100)填充背景色。然后再拷贝图像到备用表面上。
    // 填充备用表面背景色
    DDBLTFX  bltfx;
    ZeroMemory(&bltfx, sizeof(DDBLTFX));
    bltfx.dwSize = sizeof(DDBLTFX);
    bltfx.dwFillColor = RGB(100, 100, 100);
    hr = m_SecondSurface->Blt(NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &bltfx);

    下面将会使用StretchBlt拷贝图像到备用表面,再用Blt把备用表面的图像拷贝到主表面上。这时候显示的图像会被更新。

        hr = m_SecondSurface->GetDC(&hdc);
        CDC*  pDC = CDC::FromHandle(hdc);
        pDC->SetStretchBltMode(COLORONCOLOR);
        ::StretchBlt(hdc, 0, 0, m_ClientRect.Width(), m_ClientRect.Height(), m_image.GetDC(), 0, 0, m_image.GetWidth(),
            m_image.GetHeight(), SRCCOPY);
        m_image.ReleaseDC();
        m_SecondSurface->ReleaseDC(hdc);
        m_PrimarySurface->Blt(m_ClientRect, m_SecondSurface, NULL, DDBLT_WAIT, NULL);

    在开发MFC客户端程序时,通常都会遇到窗体闪烁的问题,这是因为窗体先刷一层背景色(默认为白色)再刷控件图像,由于背景色和图像反差太大,所以有闪烁的感觉,如果使用备用表面绘图,再拷贝到主表面上能有效避免闪烁。因备用表面上绘图、绘背景色不会影响到主表面显示。除非把备用表面的图像拷贝到主表面上。


    如果图像缩小显示的时候需要调用SetStretchBltMode(COLORONCOLOR) 否则会像素堆积,导致图像失真。

    将图像从备用表面拷贝到主表面时需要设置显示区域的屏幕坐标。否则绘图位置会有偏差。大笑
    工程如下:http://files.cnblogs.com/ityujian/TestDDraw.zip

    转载于:https://www.cnblogs.com/ityujian/p/3192508.html

    展开全文
  • ddraw.dll IIS 6.0

    2013-04-02 10:53:08
    IIS 6.0 ddraw.dll IIS 6.0 ddraw.dll IIS 6.0
  • <div><p>In the last version the module ddraw compat dont work, in the log file the file ddraw.dll its loaded but not these functions</p><p>该提问来源于开源项目:elishacloud/dxwrapper</p></div>
  • 在视频上叠加字符或者画框(或者说添加...这三种方式我都会进行一个简单的描述,本文先说说使用ddraw的方式。 先参考一下https://blog.csdn.net/ww506772362/article/details/51034549#commentsedit一文说的很好。 需...

    在视频上叠加字符或者画框(或者说添加水印)的方法有很多种,下面列出3种:

    • 1.将我们要添加的水印与视频数据进行融合;
    • 2.使用D3D;
    • 3.使用ddraw。
      这三种方式我都会进行一个简单的描述,本文先说说使用ddraw的方式。
      先参考一下https://blog.csdn.net/ww506772362/article/details/51034549#commentsedit一文说的很好。
      需要提醒一下的是,本文下方有个评论,非常有用。

    我们如果是在在RGB视频上画图(直线,矩形等),一般采用双缓冲区继续,使用内存MemoryDC,来实现画的图形在视频上显示不闪烁的功能,但是我们知道用RGB显示视频都是使用GDI进行渲染,这样很耗CPU,那么我们能不能在YUV上进行视频渲染呢,答案是肯定的,使用ddraw直接显示yuv就ok了,可以支持yuv422和yuv420的直接使用显卡显示,不耗CPU,但是我们在使用ddraw显示时,然后在配合GDI画图(直线或矩形等),画的图形是闪烁的,原因是我们在ddraw直接显示yuv视频时,使用的是离屏表面的方法,将yuv数据拷贝到离屏表面,然后在blt到主表面,这样用gdi画图时,和视频刷新不同步,造成闪烁,那么我们怎么解决该问题呢?方法如下:
    新增加一个离屏表面,我们定义成osd离屏表面吧,我们将yuv数据拷贝到离屏表面后,在将该离屏表面blt到osd离屏表面,然后在osd离屏表面上画直线或矩形,画完后在blt到主表面,这样画的图形就不会闪烁了。

    这里说说上面链接中的源码,有特定情况下可能会有异常:

    • 1、当我们视频的分辨率与电脑显示器的分辨率不一致时;
    • 2、当播放窗口大小发生改变时;
      对于异常一,我们要求主表面的rect要与离屏表面rect一致,否则,在叠加表面时,会返回0x88760096DDERR_INVALIDRECT
    ZeroMemory(&m_ddsd, sizeof(m_ddsd));
    m_ddsd.dwSize = sizeof(m_ddsd);
    m_ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
    m_ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
    m_ddsd.dwWidth = m_rctDest.right;
    m_ddsd.dwHeight = m_rctDest.bottom;
    
    hr = m_lpddraw->CreateSurface(&m_ddsd, &m_pOsdSurface, NULL);
    

    这里就要求m_rctDest要与主表面的一致:

    对于异常二,我们要求在窗口rect发生改变时,我们对应的离屏表面rect也要对应做改变。

    //创建OSD画图离屏表面
    		if (!m_pOsdSurface || m_lastwidth != nwidth || m_lastheight != nheight || m_rctDestLast.right != m_rctDest.right || m_rctDestLast.bottom != m_rctDest.bottom)
    		{
    			if (m_pOsdSurface)
    			{
    				m_pOsdSurface->Release();
    				m_pOsdSurface = NULL;
    			}
    
    			ZeroMemory(&m_ddsd, sizeof(m_ddsd));
    			m_ddsd.dwSize = sizeof(m_ddsd);
    			m_ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
    			m_ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
    			m_ddsd.dwWidth = m_rctDest.right;
    			m_ddsd.dwHeight = m_rctDest.bottom;
    
    			hr = m_lpddraw->CreateSurface(&m_ddsd, &m_pOsdSurface, NULL);
    			if (hr != DD_OK)
    			{
    				return false;
    			}
    		}
    

    这里要求增加一个判断,当主表面窗口rect发生改变时,我们需要重新创建离屏表面。
    现在我把全部源码放出来:
    h文件:

    #ifndef _H_DISPLAY_H_
    #define _H_DISPLAY_H_
    
    #include "ddraw.h"
    #include <time.h>
    #include <stdio.h>
    #include <string>
    class display
    {
    public:
    	display();
    public:
    	virtual ~display();
    public:
    	long init(HWND hwnd);
    	void uninit();
    	long inputsource(unsigned char * src, long nwidth, long nheight, long ntype, long nrate, __int64 npts, bool bOsd=false, std::string sOSD="", int x=0, int y=0, int size = 0, int fontr = 0, int fontg = 0, int fontb = 0, float diaphaneity = 0.0);
    	static BOOL WINAPI DDEnumCallBack( GUID *pguid, LPTSTR pszdesc, LPTSTR pszdevicename, LPVOID pcontext, HMONITOR hmonior );
    	long createoffscreen(LPDIRECTDRAWSURFACE7 * offscreen, DDSURFACEDESC2 * ddsd, long nwidth, long nheight, long ntype);
    	long createddsd(DDSURFACEDESC2 * ddsd, long nwidth, long nheight, long ntype);
    
    	void showOSD(HRESULT ddrval, std::string sOSD, int x, int y, int size, int fontr, int fontg, int fontb, float diaphaneity);
    
    	void reinit();
    private:
    	struct MONITOR_INFO
    	{
    		LPDIRECTDRAW7 lpDD;				// DirectDraw 对象指针
    		HMONITOR hMon;	
    	};
    	LPDIRECTDRAW7 m_lpddraw;						// DirectDraw 对象指针
    	LPDIRECTDRAWSURFACE7 m_lpddsprimary;			// DirectDraw 主表面指针
    	LPDIRECTDRAWSURFACE7 m_lpddsoffscr;				// DirectDraw 离屏表面指针
    	LPDIRECTDRAWSURFACE7 m_lpddsoffscr2;			// DirectDraw 离屏表面指针
    	LPDIRECTDRAWCLIPPER m_lpclipper;
    	HWND m_hwnd;
    	DDSURFACEDESC2 m_ddsd;
    	bool m_init;
    	long m_lastwidth;
    	long m_lastheight;
    
    	RECT m_rctDest;			// 目标区域
    	RECT m_rctSour;			// 源区域
    	RECT m_rctDestLast;
    	DDBLTFX  m_ddbltfx;
    	//osd
    	LPDIRECTDRAWSURFACE7 m_pOsdSurface; 			//画图表面
    };
    
    #endif
    

    cpp文件:

    #include "display.h"
    
    #pragma  comment (lib, "ddraw.lib")
    #pragma comment(lib, "dxguid.lib")
    
    display::display() : m_lpddraw(NULL),m_lpddsprimary(NULL), m_lpddsoffscr(NULL),
    	m_lpddsoffscr2(NULL), m_pOsdSurface(NULL), m_lpclipper(NULL), m_init(false), m_lastwidth(0), m_lastheight(0)
    {
    	memset(&m_ddsd, 0, sizeof(m_ddsd));
    }
    
    display::~display()
    {
    }
    
    BOOL WINAPI display::DDEnumCallBack( GUID *pguid, LPTSTR pszdesc, LPTSTR pszdevicename, LPVOID pcontext, HMONITOR hmonior )
    {
    	LPDIRECTDRAW7            lpDD = NULL;				// DirectDraw 对象指针
    	MONITOR_INFO *pthis = ( MONITOR_INFO *)pcontext;
    	if ( !pthis )
    	{
    		return FALSE;
    	}
    	if ( pthis->hMon == hmonior )
    	{
    		if (DirectDrawCreateEx(pguid, (void**)&lpDD, IID_IDirectDraw7, NULL) != DD_OK)
    		{
    			OutputDebugStringA("创建lpDD error!\r\n");
    		}
    		pthis->lpDD = lpDD;
    		lpDD = NULL;
    	}
    
    	OutputDebugStringA("创建DirectDraw begin\r\n");
    	// 创建DirectDraw对象
    
    	return TRUE;
    }
    
    void display::reinit()
    {
    	uninit();
    	init(m_hwnd);
    }
    
    long display::init(HWND hwnd)
    {
    	if (m_init)
    	{
    		return 0;
    	}
    	m_hwnd = hwnd;
    	//MONITOR_INFO mi_lpdd;
    	//mi_lpdd.hMon = ::MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
    	// 枚举监视器并创建DirectDraw对象
    // 	DirectDrawEnumerateExA( display::DDEnumCallBack, 
    // 		&mi_lpdd,
    // 		DDENUM_ATTACHEDSECONDARYDEVICES | 
    // 		DDENUM_DETACHEDSECONDARYDEVICES | 
    // 		DDENUM_NONDISPLAYDEVICES
    // 		);
    // 	m_lpddraw = mi_lpdd.lpDD;
    	if(m_lpddraw == NULL)
    	{
    		if (DirectDrawCreateEx(NULL, (VOID**)&m_lpddraw,IID_IDirectDraw7,NULL) != DD_OK) 
    		{
    			OutputDebugStringA("display::init 创建DirectDraw NOK\r\n");
    		}
    		if (!m_lpddraw)
    		{
    			OutputDebugStringA("display::init 2创建DirectDraw NOK\r\n");
    			return -1;
    		}
    	}
    	if (m_lpddraw->SetCooperativeLevel(NULL, DDSCL_NORMAL | DDSCL_NOWINDOWCHANGES | DDSCL_ALLOWREBOOT ) != DD_OK)
    	{
    		OutputDebugStringA("display::init 创建lpDDxiezuo error!\r\n");
    		if (m_lpddraw)
    		{
    			m_lpddraw->Release();
    			m_lpddraw = NULL;
    		}
    		return -1;
    	}
    	// 创建主表面
    	DDSURFACEDESC2			ddsd;				// DirectDraw 表面描述
    	ZeroMemory(&ddsd, sizeof(ddsd));
    	ddsd.dwSize = sizeof(ddsd);
    	ddsd.dwFlags = DDSD_CAPS;// | DDSD_BACKBUFFERCOUNT;
    	ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
    	//ddsd.dwBackBufferCount = 1;
    	if (m_lpddraw->CreateSurface(&ddsd, &m_lpddsprimary, NULL) != DD_OK)
    	{
    		OutputDebugStringA("display::init 创建m_lpddsprimary error!\r\n");
    		if (m_lpddraw)
    		{
    			m_lpddraw->Release();
    			m_lpddraw = NULL;
    		}
    		return -1;
    	}
    	if(m_lpddraw->CreateClipper(0, &m_lpclipper, NULL) != DD_OK)
    	{
    		if (m_lpddraw)
    		{
    			m_lpddraw->Release();
    			m_lpddraw = NULL;
    		}
    		OutputDebugStringA("display::init 创建m_lpclipper error!\r\n");
    		return -1;
    	}
    
    	m_lpclipper->SetHWnd(0, hwnd);
    	m_lpddsprimary->SetClipper(m_lpclipper);
    	m_init = true;
    	return 0;
    }
    
    void display::uninit()
    {
    	if (m_lpddsoffscr)
    	{
    		m_lpddsoffscr->Release();
    		m_lpddsoffscr = NULL;
    	}
    	if (m_lpddsoffscr2)
    	{
    		m_lpddsoffscr2->Release();
    		m_lpddsoffscr2 = NULL;
    	}
    	if (m_pOsdSurface)
    	{
    		m_pOsdSurface->Release();
    		m_pOsdSurface = NULL;
    	}
    	if (m_lpddsprimary)
    	{
    		m_lpddsprimary->Release();
    		m_lpddsprimary = NULL;
    	}
    	if (m_lpclipper)
    	{
    		m_lpclipper->Release();
    		m_lpclipper = NULL;
    	}
    	if (m_lpddraw)
    	{
    		m_lpddraw->Release();
    		m_lpddraw = NULL;
    	}
    	m_init = false;
    	m_lastwidth = 0;
    	m_lastheight = 0;
    }
    
    long display::createddsd(DDSURFACEDESC2 * ddsd, long nwidth, long nheight, long ntype)
    {
    	ddsd->dwSize = sizeof(*ddsd);
    	ddsd->ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY ; //DDSCAPS_OVERLAY DDSCAPS_OFFSCREENPLAIN;
    	ddsd->dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;// | DDSD_PITCH | DDSD_LPSURFACE;
    	ddsd->dwWidth = nwidth;
    	ddsd->dwHeight = nheight;
    	ddsd->ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
    	ddsd->ddpfPixelFormat.dwFlags = DDPF_FOURCC;
    	if ( ntype == 2)
    	{
    		ddsd->ddpfPixelFormat.dwFourCC = MAKEFOURCC('R','G','B',' ');
    		ddsd->ddpfPixelFormat.dwFlags |= DDPF_RGB;
    		ddsd->ddpfPixelFormat.dwRGBBitCount = 32;
    	}
    	else if ( ntype == 3)
    	{
    		ddsd->ddpfPixelFormat.dwFourCC = MAKEFOURCC('Y','V','1','2');
    		ddsd->ddpfPixelFormat.dwFlags |= DDPF_YUV;
    		ddsd->ddpfPixelFormat.dwYUVBitCount = 12;
    	}
    	else if ( ntype == 4)
    	{
    		ddsd->ddpfPixelFormat.dwFourCC = MAKEFOURCC('U','Y','V','Y');
    		ddsd->ddpfPixelFormat.dwFlags |= DDPF_YUV;
    		ddsd->ddpfPixelFormat.dwYUVBitCount = 16;
    	}
    	else if ( ntype == 5)
    	{
    		ddsd->ddpfPixelFormat.dwFourCC = MAKEFOURCC(/*'I','4','2','0'*/'Y','V','1','2');
    		ddsd->ddpfPixelFormat.dwFlags |= DDPF_YUV;
    		ddsd->ddpfPixelFormat.dwYUVBitCount = 12;
    	}
    	else if ( ntype == 6)
    	{
    		ddsd->ddpfPixelFormat.dwFourCC = MAKEFOURCC('Y','U','Y','2'); //or YUYV. the same format.
    		ddsd->ddpfPixelFormat.dwFlags |= DDPF_YUV;
    		ddsd->ddpfPixelFormat.dwYUVBitCount = 16;
    	}
    	else
    	{
    		OutputDebugStringA("************LOG_RTM, unsupported pixel format: %d, pcd->m_bdInRender.nType\r\n");
    		return -1;
    	}
    	return 0;
    }
    
    long display::createoffscreen(LPDIRECTDRAWSURFACE7 * offscreen, DDSURFACEDESC2 * ddsd, long nwidth, long nheight, long ntype)
    {
    	__int64 nerror = 0;
    	HRESULT result = m_lpddraw->CreateSurface(ddsd, offscreen, NULL);
    	if(FAILED(result))
    	{
    		if (result == DDERR_NODIRECTDRAWHW)
    		{
    			OutputDebugStringA("************createoffscreen DDERR_NODIRECTDRAWHW*************************\n");
    			reinit();
    		}
    		return -1;
    	}
    	return 0;
    }
    
    long display::inputsource(unsigned char * src, long nwidth, long nheight, long ntype, long nrate, __int64 npts, bool bOsd, std::string sOSD, int x, int y, int size, int fontr, int fontg, int fontb, float diaphaneity)
    {
    	if (!m_init)
    	{
    		return -1;
    	}
    	__int64 nerror = 0;
    	if (!m_lpddsoffscr || m_lastwidth != nwidth || m_lastheight != nheight)
    	{
    		if (m_lpddsoffscr)
    		{
    			m_lpddsoffscr->Release();
    			m_lpddsoffscr = NULL;
    		}
    		nerror = createddsd(&m_ddsd, nwidth, nheight, ntype);
    		if (nerror)
    		{
    			OutputDebugStringA("display::inputsource createddsd error[m_lpddsoffscr equ null]\r\n");
    			return -1;
    		}
    		//创建数据离屏表面
    		nerror = createoffscreen(&m_lpddsoffscr, &m_ddsd, nwidth, nheight, ntype);
    		if (nerror)
    		{
    			OutputDebugStringA("display::inputsource createoffscreen error[m_lpddsoffscr equ null]\r\n");
    			return -1;
    		}
    	}
    	if (!m_lpddsoffscr)
    	{
    		OutputDebugStringA("display::inputsource error[m_lpddsoffscr equ null]\r\n");
    		return -1;
    	}
    	HRESULT hr = m_lpddsoffscr->Lock(NULL,&m_ddsd, /*DDLOCK_WAIT |*/ DDLOCK_WRITEONLY,NULL);
    	if (hr == DDERR_SURFACELOST) 
    	{
            OutputDebugStringA("DDERR_SURFACELOST DDERR_SURFACELOST DDERR_SURFACELOST...1\n");
    		hr = m_lpddsoffscr->Restore(); 
    		hr = (hr != DD_OK)? hr : m_lpddsoffscr->Lock(NULL,&m_ddsd,/*DDLOCK_WAIT |*/ DDLOCK_WRITEONLY,NULL); 
    	}
    	if (hr != DD_OK)
    	{
    		OutputDebugStringA("display::inputsource  Lock error\r\n");
    		return -1;
    	}
    
    	LPBYTE lpSurf = (LPBYTE)m_ddsd.lpSurface;
    	LPBYTE lpSurfV = lpSurf + m_ddsd.dwHeight*m_ddsd.lPitch;
    	LPBYTE lpSurfU = lpSurfV + (m_ddsd.dwHeight*m_ddsd.lPitch>>2);
    	if (3 == ntype || 5 == ntype)
    	{
    		LPBYTE lpY = src;
    		LPBYTE lpU;
    		LPBYTE lpV;
    		if (3 == ntype)
    		{
    			lpV = lpY + nwidth * nheight;
    			lpU = lpV + (nwidth * nheight>>2);
    		}
    		else
    		{
    			lpU = lpY + nwidth * nheight;
    			lpV = lpU + (nwidth * nheight>>2);
    		}
    		// 填充离屏表面
    		unsigned long lddsdHeightHalf = m_ddsd.dwHeight>>1;
    		unsigned long lddsdlPitchHalf = m_ddsd.lPitch>>1; 
    		unsigned long lWidhtHalf = nwidth>>1;
    		for(unsigned long i = 0; i < m_ddsd.dwHeight; i++)
    		{
    			memcpy(lpSurf, lpY, nwidth);
    			lpY += nwidth;
    			lpSurf += m_ddsd.lPitch;
    
    			if (i < lddsdHeightHalf)
    			{
    				memcpy(lpSurfU, lpU, lWidhtHalf);				
    				lpU += lWidhtHalf;
    				lpSurfU += lddsdlPitchHalf;
    
    				memcpy(lpSurfV, lpV, lWidhtHalf);
    				lpV += lWidhtHalf;
    				lpSurfV += lddsdlPitchHalf;				
    			}
    		}
    	}
    
    	m_lpddsoffscr->Unlock(NULL);
    
    	m_rctDestLast = m_rctDest;
    	m_rctSour.left = 0;
    	m_rctSour.top = 0;
    	m_rctSour.right = m_ddsd.dwWidth;
    	m_rctSour.bottom = m_ddsd.dwHeight;
    
    	GetClientRect(m_hwnd, &m_rctDest);				
    	MONITORINFO mi;
    	memset(&mi, 0, sizeof(MONITORINFO));
    	mi.cbSize = sizeof(MONITORINFO);
    	HMONITOR hmon = ::MonitorFromWindow(m_hwnd, MONITOR_DEFAULTTONEAREST);
    	if (!hmon)
    	{
    		OutputDebugStringA("display::inputsource MonitorFromWindow error[hmon equ null]\r\n");
    		return -1;
    	}
    	::GetMonitorInfo(hmon, &mi);
    	m_rctDest.left -= mi.rcMonitor.left;
    	m_rctDest.right -= mi.rcMonitor.left;
    	m_rctDest.top -= mi.rcMonitor.top;
    	m_rctDest.bottom -= mi.rcMonitor.top;
    	ClientToScreen(m_hwnd, (LPPOINT)&m_rctDest.left);
    	ClientToScreen(m_hwnd, (LPPOINT)&m_rctDest.right);
    		
    	memset(&m_ddbltfx, 0, sizeof(m_ddbltfx));
    	m_ddbltfx.dwSize = sizeof(m_ddbltfx);
    	m_ddbltfx.dwROP = SRCCOPY;
    
    	if (bOsd)
    	{
    		//创建OSD画图离屏表面
    		if (!m_pOsdSurface || m_lastwidth != nwidth || m_lastheight != nheight || m_rctDestLast.right != m_rctDest.right || m_rctDestLast.bottom != m_rctDest.bottom)
    		{
    			if (m_pOsdSurface)
    			{
    				m_pOsdSurface->Release();
    				m_pOsdSurface = NULL;
    			}
    
    			ZeroMemory(&m_ddsd, sizeof(m_ddsd));
    			m_ddsd.dwSize = sizeof(m_ddsd);
    			m_ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
    			m_ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
    			m_ddsd.dwWidth = m_rctDest.right;
    			m_ddsd.dwHeight = m_rctDest.bottom;
    
    			hr = m_lpddraw->CreateSurface(&m_ddsd, &m_pOsdSurface, NULL);
    			if (hr != DD_OK)
    			{
    				return false;
    			}
    		}
    
    		//加入Osd离屏表面内容
    		HRESULT ddrval;
    		ddrval = m_pOsdSurface->Blt(&m_rctDest, m_lpddsoffscr, NULL, DDBLT_WAIT, NULL);
    		if (ddrval != DD_OK)
    		{
    			ddrval = m_lpddsprimary->Blt(&m_rctDest, m_lpddsoffscr, &m_rctSour, DDBLT_WAIT, NULL);
    		}
    		else
    		{
    			showOSD(ddrval, sOSD, x, y, size, fontr, fontg, fontb, diaphaneity);
    		}
    	}
    	else
    	{
    		// Blt到主表面上
    		HRESULT hr2 = m_lpddsprimary->Blt(&m_rctDest, m_lpddsoffscr, &m_rctSour, DDBLT_WAIT, &m_ddbltfx);
    
    		if (hr2 == DDERR_SURFACELOST)
    		{
    			OutputDebugStringA("DDERR_SURFACELOST DDERR_SURFACELOST DDERR_SURFACELOST...\n");
    			hr2 = m_lpddsprimary->Restore();
    		}
    		if (hr2 != DD_OK)
    		{
    			OutputDebugStringA("display::inputsource Blt error\r\n");
    			return -1;
    		}
    	}
    	m_lastwidth = nwidth;
    	m_lastheight = nheight;
    	return 0;
    }
    
    void display::showOSD(HRESULT ddrval, std::string sOSD, int x, int y, int size, int fontr, int fontg, int fontb, float diaphaneity)
    {
    	HDC hDC = NULL;
    	ddrval = m_pOsdSurface->GetDC(&hDC);
    
    	if ((ddrval == DD_OK) && (hDC != NULL))
    	{
    		LOGFONT lf; //定义字体结构
    		lf.lfWeight = 400; //字体磅数=10
    		lf.lfHeight = size*3/2; //字体高度(旋转后的字体宽度)=56
    		lf.lfWidth = size/2; //字体宽度(旋转后的字体高度)=20
    		lf.lfUnderline = FALSE; //无下划线
    		lf.lfStrikeOut = FALSE; //无删除线
    		lf.lfItalic = FALSE; //非斜体
    		lf.lfEscapement = 0; //字体显示角度=270°
    		lf.lfCharSet = DEFAULT_CHARSET; //使用缺省字符集
    		//lf.lfPitchAndFamily = DEFAULT_PITCH;
    		strcpy(lf.lfFaceName, "Arial "); //字体名=@system
    
    		HFONT myLogFont = CreateFontIndirect(&lf);
    		HGDIOBJ pOldFont = SelectObject(hDC, myLogFont);//选入设备描述表
    
    		//SetTextCharacterExtra(hDC, 0);
    		//叠加文字
    		SetBkMode(hDC, TRANSPARENT);
    
    		COLORREF rgb = RGB(fontr, fontg, fontb);
    		SetTextColor(hDC, rgb);
    
    		int nWidth = m_rctDest.right - m_rctDest.left;
    		int nHeight = m_rctDest.bottom - m_rctDest.top;
    		x = m_rctDest.left + x % nWidth;
    		y = m_rctDest.top + y % nHeight;
    
    		int nPx = (double)(lf.lfWidth) * (sOSD.size());
    		int nPy = lf.lfHeight;
    		if ((x + nPx) > m_rctDest.right)
    		{
    			x = m_rctDest.right - nPx;
    		}
    		if (y + nPy > m_rctDest.bottom)
    		{
    			y = m_rctDest.bottom - nPy;
    		}
    		if (y < nPy)
    		{
    			y = nPy;
    		}
    		if (x < m_rctDest.left)
    		{
    			x = m_rctDest.left;
    		}
    		
    		TextOut(hDC, x, y, sOSD.c_str(), sOSD.size());
    
    		SelectObject(hDC, pOldFont); //将myFont从设备环境中分离
    		DeleteObject(myLogFont); //删除myLogFont对象
    
    		m_pOsdSurface->ReleaseDC(hDC);
    		m_lpddsprimary->Blt(&m_rctDest, m_pOsdSurface, &m_rctDest, DDBLT_WAIT, NULL);
    	}
    }
    
    展开全文
  • VS2008 Ddraw

    2008-06-14 19:39:37
    DDRAW应用程序框架源码 水平有限,恳请批评指正!
  • mfc 里加入ddraw

    2010-01-21 22:05:41
    在mfc窗口内 加入ddraw,在窗口中写direct 表面
  • 一个简单的DDraw应用程序  上次谈到DDraw是一个组件。组件由接口组成。 DDraw总共由五个接口组成:  IUnknown:所有com接口都必须从这里继承的。(请看相关文章COM笔记-QueryInterface函数) IDirectDraw:...
     
    

    一个简单的DDraw应用程序 

    上次谈到DDraw是一个组件。组件由接口组成。

    DDraw总共由五个接口组成: 

    IUnknown:所有com接口都必须从这里继承的。(请看相关文章COM笔记-QueryInterface函数

    IDirectDraw:使用DDraw必须创建的主接口对象。

    IDirectDrawSurface:创建、控制和显示的实际显示表面。分主显示表面和从显示表面

    IDirectDrawPalette:创建、加载和控制调色板,以及将它关联到显示表面。

    IDirectDrawClipper:剪切DDraw光栅和位图操作到一些可见显示表面的子集。

     

      

     

    这些接口怎么配合起来成为一个DDraw应用程序的: 

    1.  创建DDraw对象并使用QueryInterface()来得到 一个IDirectDraw7接口,或是直接用DirectDrawCreateEx()创建一个DDraw7接口。用这个接口来设置协作级别和视频模式。

    2.  使用IDirectDrawSurface7接口至少创建 一个主显示表面用以绘图。(如果每个像素为8位或更少我们会用到一个调色板)

    3.  用IDirectDrawPalette接口创建 一个调色板。(注意如果像素高于8位,如16位、24位,32位,没有调色板,现在主流2D游戏多数是16色)

    4.  如果DDraw应用程序要使用窗口,或者要减少位图以免溢出DDraw显示表面的可见边界,我们至少需要合建一个剪裁器并将其尺寸设置为可见窗口的范围。如下图

     

    5.  最后就是在表面上绘图了。

    下面开始介绍一个最简单的DDraw应用程序: 

    创建DDraw对象:

    用来DirectDrawCreateEx来直接创建DDraw对象,声明如下:

      

    HRESULT WINAPI DirectDrawCreateEx(
      GUID FAR *lpGUID,              // 视频显卡驱动的GUID,NULL表示系统默认的硬件
      LPVOID *lplpDD,                // 这是返回的接口
      REFIID iid,                    // 请求接口相对应的ID
      IUnknown FAR *pUnkOuter        // 总是高为NULL
    );

      

    设置协作级别:

    对DDraw来说,我们唯一关心的是视频显示设备,有两种情况:全屏模式和窗口模式。

    用SetCooperativeLevel来设置DDraw的协作级别。声明如下:

    HRESULT SetCooperativeLevel(HWND hWnd, // 窗口句柄,一般使用主窗口句柄 DWORD dwFlags); // 控制标志

    dwFlags控制标志,它直接影响DDraw与Windows之间协作方式。

    SetCooperativeLevel()的控制标记 

    描述

    DDSCL_ALLOWMODEX

    允许使用Mode X (320x200,240,400) 显示模式.公当设置DDSCL_EXCLUSIVE和DDSCL_FULLSCREEN时生效

    DDSCL_ALLOWREBOOT

    允许在排他(全屏)模式下检测到Ctrl+Alt+Del

    DDSCL_EXCLUSIVE

    请求排他级别。此标记需要与DDSCL_FULLSCREEN标记同时作用

    DDSCL_FPUSETUP

    表示调用 程序希望配置FPU以得到最佳的Direct3D性能(禁用度和异常),这样Direct3D不需要每次都明确地FPU。更多信息,请在DirectX SDK中查询“DDraw协作级别和FPU数度”

    DDSCL_FULLSCREEN

    表示使用全屏模式。其他应用程序的GDI将不能写屏,此标记必须与DDSCL_EXCLUSIVE标记同时使用。

    DDSCL_MULTITHREADED

    请求对于多线程安全的DDraw行为。

    DDSCL_NORMAL

    表示应用程序是一个通常的Windows应用程序。这个标记不能与DDSCL_ALLOWMODEX, DDSCL_EXCLUSIVE, 或 DDSCL_FULLSCREEN标记一起使用。

    DDSCL_NOWINDOWCHANGES

    表示不允许DDraw激活时最小化或还原应用程序窗口。

    上面写了一大堆标记,其实大多数情况是下面两种情况。

    全屏模式:DDSCL_FPUSETUP | DDSCL_ALLOWMODEX | DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT

    窗口模式:DDSCL_NORMAL

    下面例子:

    因为是用于学习,没有把框架搞得太复杂,全写在一个cpp里了。

    关于怎么写一个GUI应用程序,可以查看《一个简单的windows GUI应用程序

    http://www.cnblogs.com/fangyukuan/archive/2010/08/31/1814159.html

    源代码下载

    #define INITGUID
    
    #include<windows.h>
    #include <ddraw.h>
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
     
    HWND main_window_handle = NULL;        // 主窗口句柄
    LPDIRECTDRAW7 lpdd    = NULL;         // DDraw 对象
    
    int Game_Init(void *parms = NULL, int num_parms = 0)
    {
       // 创建ddraw对象
       if (FAILED(DirectDrawCreateEx(NULL, (void **)&lpdd, IID_IDirectDraw7, NULL)))
          return(0);
    
       // 窗口模式(设置协作级别)
       lpdd->SetCooperativeLevel(main_window_handle, DDSCL_NORMAL);
       return 1;
    }
    
    /
    int Game_Shutdown()
    {
       if (lpdd)
       {
          lpdd->Release();
          lpdd = NULL;
       } 
       return 1;
    }
    
    int WINAPI WinMain(HINSTANCE hInstance,
                  HINSTANCE hPrevInstance,
                  LPSTR lpCmdLine,
                  int nShowCmd)
    {
       HWND hwnd;
       MSG msg;
       TCHAR lpszClassName[] = TEXT("kuan");
    
       WNDCLASS wc;
       wc.style = CS_HREDRAW | CS_VREDRAW;
       wc.lpfnWndProc = WndProc;
       wc.cbClsExtra = 0;
       wc.cbWndExtra = 0;
       wc.hInstance = hInstance;
       wc.hIcon = ::LoadIcon(NULL,IDI_APPLICATION);
       wc.hCursor = ::LoadCursor(NULL,IDC_ARROW);
       wc.hbrBackground = (HBRUSH)::GetStockObject(BLACK_BRUSH);
       wc.lpszMenuName = NULL;
       wc.lpszClassName = lpszClassName;
    
       RegisterClass(&wc);
    
       // WS_OVERLAPPEDWINDOW 可以改变窗口大小
       // WS_OVERLAPPED 不可以改变窗口大小
       // WS_POPUP 全屏
       hwnd = CreateWindow(lpszClassName,
          TEXT("fangyukuan"),
          WS_OVERLAPPEDWINDOW | WS_VISIBLE,
          300,80,800,600,
          NULL,
          NULL,
          hInstance,
          NULL);
    
       main_window_handle = hwnd;
    
    //  ::ShowWindow(hwnd,SW_SHOWNORMAL);
    //  ::UpdateWindow(hwnd);
    //    while(::GetMessage(&msg,NULL,0,0))
    //    {
    //       ::TranslateMessage(&msg);
    //       ::DispatchMessage(&msg);
    //    }
    
       Game_Init();
       while(TRUE)
       {
          if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
          { 
             if (msg.message == WM_QUIT)
               break;
            ::TranslateMessage(&msg);
            ::DispatchMessage(&msg);
          }
       }
       Game_Shutdown();
       return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hwnd,
                      UINT message,
                      WPARAM wParam,
                      LPARAM lParam)
    
    {
       switch(message)
       {
       case WM_LBUTTONDOWN:
          {
            ::MessageBeep(0); 
          }
          break;
       case WM_DESTROY:
          ::PostQuitMessage(0);
          break;
       default:
          return ::DefWindowProc(hwnd,message,wParam,lParam);
       }
       return 0;
    }
    

     程序运行效果:

     

    展开全文
  • DDraw 创建表面

    2013-02-25 15:12:31
    创建DDraw对象和设置协作级别请看《一个简单的DDraw应用程序》 设置模式 SetDisplayMode为设置视频模式的函数 HRESULT SetDisplayMode(DWORD dwWidth, // 屏幕宽 DWORD dwHeight, // 屏幕高 DWORD dwBPP,
  • ddraw相关

    千次阅读 2009-10-28 13:02:00
    //////////////////////////////////////使用ddraw将表面刷成单一色,使用ddblttfx的dwFillColor来填充。 DDBLTFX ddbltfx; ddbltfx.dwSize = sizeof(ddbltfx); ddbltfx.dwFillColor = ddpf.dwBBitMask; // Pure ...
  • 基于窗口的DDRAW编程

    2012-02-17 17:31:07
    是一个基于窗口模式DDraw编程,这是一个测试工程!
  • <div><p>Hi Narzoul, for unknown reasons I find myself with a strange slow playback even without the use of your ddraw.dll. I probably have a global problem with the operating system or with the ...
  • ddraw显示详解

    千次阅读 2010-12-16 18:16:00
    前些时间做过一个ddraw显示来代替原来的gdi显示,显示的速度快了许多,在不断的探索中,终于明白了ddraw的用法。现在记下来。本人文字功底欠佳,如有不明白的地方,一起讨论。1.ddraw 与 gdi的区别两者都可以用来...
  • Ddraw 创建表面

    2012-08-24 12:48:13
    转载于:... 创建DDraw对象和设置协作级别请看《一个简单的DDraw应用程序》 设置模式 SetDisplayMode为设置视频模式的函数 HRESULT SetDisplayMode(DWORD dwWidth, // 屏幕宽
  • ddraw 视频下画图

    千次阅读 2016-04-01 10:11:44
    我们如果是在在RGB视频上画图(直线,矩形等),一般采用双缓冲区继续,使用内存...答案是肯定的,使用ddraw直接显示yuv就ok了,可以支持yuv422和yuv420的直接使用显卡显示,不耗CPU,但是我们在使用ddraw显示时,然后在
  • H264解码之DDraw显示YUV

    2019-10-07 09:10:20
    头文件: #pragma once #include "ddraw.h" #include <time.h> #pragma comment (lib, "ddraw.lib") #pragma comment(lib, "dxguid.lib") class display { public: display(void); public: ...
  • <div><p>As current Wine versions have ddraw issues this has been very useful however if the executable is not listed within ddraw.ini then it won't be applied. So things like XWIS multiplayer ...
  • Ddraw的2d地图编辑器

    2011-02-13 17:43:08
    C++写的Ddraw的2d地图编辑器!!!!!
  • DDraw做的打字游戏,有音效效果!运行程序前,请正确配置DX!!!!
  • DDRAW 裂屏原理以及解决方案 video frame display synchronization
  • ddraw rgb显示

    千次阅读 2012-02-28 11:51:34
    看到用direcdraw 显示Yuv视频数据,一点都不耗cpu,就想试下ddraw下RGB的显示,发现我的电脑显卡不支持24位的离屏表面的创建,只好创建一个32位的表面,然后将24位的RGB数据copy到32位的离屏表面,BGRA的格式,现在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 530
精华内容 212
关键字:

ddraw