创建了一个离层表面  ddsd.dwSize=sizeof(ddsd);                          //创建离层表面
ddsd.dwFlags=DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH | 
       DDSD_PIXELFORMAT; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ;
ddsd.dwWidth =WIDTH;
ddsd.dwHeight=HEIGHT; 
 

ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
ddsd.ddpfPixelFormat.dwFlags  = DDPF_RGB ; ddsd.ddpfPixelFormat.dwFlags=DDPF_RGB;
ddsd.ddpfPixelFormat.dwRGBBitCount=24;
ddsd.ddpfPixelFormat.dwRBitMask         =   0x00FF0000;   
ddsd.ddpfPixelFormat.dwGBitMask         =   0x0000FF00;   
ddsd.ddpfPixelFormat.dwBBitMask         =   0x000000FF;   然后用 unsigned char* lpSurf = (unsigned char*)desc.lpSurface;最后对lpSurf操作,怎么画面没有显示呢? 那位又ddraw的窗口模式的例子,,能不能发给我
efengyu@eyou.com

解决方案 »

  1.   

    // 先初始化COM
    CoInitialize(NULL);** CreateWindow
    // 建窗口之后就可以初始化DDraw - 全屏的
    if (FAILED(DirectDrawCreateEx(NULL, (LPVOID *) &g_lpDD, IID_IDirectDraw7, NULL)))
    {
    return FALSE;
    }if (FAILED(g_lpDD->SetCooperativeLevel(g_hWnd, DDSCL_ALLOWREBOOT | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN)))
    {
    return FALSE;
    }if (FAILED(g_lpDD->SetDisplayMode(1024, 768, 16, 0/*refresh rate*/, DDSDM_STANDARDVGAMODE)))
    {
    return FALSE;
    }DDSURFACEDESC2 ddsd = {0}; // surface description structure
    ddsd.dwSize = sizeof(ddsd);// create primary surface
    ddsd.dwFlags = DDSD_CAPS;
    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
    g_lpDD->CreateSurface(&ddsd, &g_lpddsPrimary, NULL);
    // create a back surface
    ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
    ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE;
    ddsd.dwWidth = 1024;
    ddsd.dwHeight = 768;
    if (FAILED(g_lpDD->CreateSurface(&ddsd, &g_lpddsStore, NULL)))
    {
    return FALSE;
    }if(FAILED(g_lpDD->CreateClipper(0, &pcClipper, NULL)))
    {
    return FALSE;
    }if(FAILED(pcClipper->SetHWnd(0, g_hWnd)))
    {
    pcClipper->Release();
    return FALSE;
    }if(FAILED(g_lpddsPrimary->SetClipper(pcClipper)))
    {
    pcClipper->Release();
    return FALSE;
    }// fill background with black
    HDC dxHDC = NULL;
    RECT rc = {0};
    GetClientRect(g_hWnd, &rc);
    g_lpddsStore->GetDC(&dxHDC);
    FillRect(dxHDC, &rc, (HBRUSH) GetStockObject(BLACK_BRUSH));
    g_lpddsStore->ReleaseDC(dxHDC);** // WM_PAINT消息处理
    HDC dxHDC = NULL;
    LPCTSTR lpszMessage = "This is a stinky Application";
    RECT rt;
    POINT p = {0, 0};ClientToScreen(hWnd, &p);
    rt.left = 0 + p.x;
    rt.top = 0 + p.y;
    rt.right = 1024 + p.x;
    rt.bottom = 768 + p.y;RECT rt2 = {100, 100, 200, 200};
    g_lpddsStore->GetDC(&dxHDC);
    SetTextColor(dxHDC, RGB(255, 0, 0));
    TextOut(dxHDC, 20, 60, lpszMessage, lstrlen(lpszMessage));
    SelectObject(dxHDC, (HPEN) GetStockObject(WHITE_PEN));
    MoveToEx(dxHDC, 100, 100, NULL); LineTo(dxHDC, 200, 500);
    g_lpddsStore->ReleaseDC(dxHDC);
    dxHDC = NULL;while (TRUE)
    {
    HRESULT hRet = g_lpddsPrimary->Blt(&rt, g_lpddsStore, NULL, DDBLT_WAIT, NULL);
    if (hRet == DD_OK)
    {
    break;
    }
    else if (hRet == DDERR_SURFACELOST)
    {
    g_lpddsPrimary->Restore();
    g_lpddsStore->Restore();
    }
    else if(hRet != DDERR_WASSTILLDRAWING)
    {
    break;
    }
    }
    // 程序结束时不忘释放
    pcClipper->Release();
    g_lpddsPrimary->Release();
    g_lpddsStore->Release();
    g_lpDD->Release();
    CoUninitialize();
      

  2.   

    这个是全屏模式的,我想问一下窗口模式的该怎么设置ddsd,以及怎样向里面填写RGB数据?