游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3777|回复: 7

一个关于DirectDraw的问题

[复制链接]

16

主题

72

帖子

72

积分

注册会员

Rank: 2

积分
72
发表于 2004-9-13 15:05:00 | 显示全部楼层 |阅读模式
怎么创建一个不是全屏的窗口模式呢?
谢谢

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2004-9-13 20:53:00 | 显示全部楼层

Re:一个关于DirectDraw的问题

不就是把协作层设为Normal吗?

7

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2004-9-13 21:37:00 | 显示全部楼层

Re:一个关于DirectDraw的问题

把协议层设为NORMAL,
但是有一点很重要,
就是在窗口模式下,不能使用FLIP()。
只能用BLT把BACKSURFACE复制到PRIMARY SURFACE.

16

主题

72

帖子

72

积分

注册会员

Rank: 2

积分
72
 楼主| 发表于 2004-9-14 11:35:00 | 显示全部楼层

Re:一个关于DirectDraw的问题

谢谢指点
我设置成narmal,但是一运行窗口就没了
下面是程序的部分代码
int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int nCmdShow)
{   
    HWND    hWnd;
        HRESULT hr;

    if (FAILED(WinInit(hInst, nCmdShow, &hWnd)))    return FALSE;
       
         if(FAILED(hr = DirectDrawCreate(NULL, &g_pDdaw, NULL)))
        return E_FAIL;
       
        DWORD                         dwFlags;
        DDSURFACEDESC         ddsd;
        HRESULT          ddrval;
         //ÉèÖÃЭ×÷¼¶±ðΪȫÆÁģʽ
        dwFlags = DDSCL_NORMAL;//DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT;
        g_pDdaw->SetCooperativeLevel(hWnd, dwFlags);
       
        /*DWORD dwStyle  = GetWindowStyle( hWnd );
    dwStyle &= ~WS_POPUP;
    dwStyle |= WS_OVERLAPPED | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX;
    SetWindowLong( hWnd, GWL_STYLE, dwStyle );*/

        //ÉèÖÃÏÔʾģʽ
        //g_pDdaw->SetDisplayMode(640, 480, 16);
        //g_pDdaw->SetDisplayMode(GetSystemMetrics(SM_CXSCREEN),
        //        GetSystemMetrics(SM_CYSCREEN), 0x20);
        // ´´½¨Ö÷Ò³Ãæ
        ZeroMemory(&ddsd, sizeof(ddsd));
        ddsd.dwSize = sizeof(ddsd);
        ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
        ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
        ddsd.dwBackBufferCount = 1;
        ddsd.dwWidth = 320;
        ddsd.dwHeight = 240;

        ddrval = g_pDdaw->CreateSurface(&ddsd, &lpDDSPrimary, NULL);
        if(ddrval != DD_OK) return false;

        // ÏûϢѭ»·
        MSG msg;
        while(GetMessage(&msg, NULL, 0, 0))
        {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }

        return true;
}

int Render()
{
        DDSURFACEDESC         ddsd;
        HRESULT          ddrval;
        WORD *GraphBuffer = NULL;                // »æÍ¼»º³åÇø
        int GraphPitch = 0;                        // »º³åÇø¿ç¶È
        int GraphWidth, GraphHeight;        //Ò³Ãæ¿í¶È£¬Ò³Ãæ¸ß¶È

        ddsd.dwSize = sizeof(ddsd);
        if (!lpDDSPrimary) return false;
        //        HDC hdc;
        //lpDDSPrimary->GetDC(&hdc);
        ddrval = lpDDSPrimary->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);        //Ëø¶¨
        // Ö÷ÒªÓÃlpDDSPrimary½Ó¿ÚLockºóµÄddsd¿í¶ÈºÍ¸ß¶ÈÄ£ÄâFrameBuffer
        /*SetBkColor(hdc, RGB(0, 0, 255));
    SetTextColor(hdc, RGB(255, 255, 0));
    TextOut(hdc, 0, 0, "Hello world", 100);
    lpDDSPrimary->ReleaseDC(hdc);*/

          GraphBuffer = (WORD *)ddsd.lpSurface;                //ÄÚ´æÖ¸Õë
        GraphWidth = 320;                                        //¿í¶È
        GraphHeight = 240;                                //¸ß¶È
        GraphPitch  = ddsd.lPitch >> 1;                                //lPitchÒÔByteΪµ¥Î»¼ÆÊýµÄ£¬
        // ÔÚÕâÀï¿ÉÒÔ×öÄ£ÄâFrameBufferµÄ²Ù×÷
        WORD color16 = 0x0;       
        // Draw a rectangle
        for(int i = 20; i < GraphWidth; i++)
                for(int j = 30; j < GraphHeight; j++)
                        GraphBuffer[i * GraphPitch + j] = color16;

        ddrval = lpDDSPrimary->Unlock(NULL);                                //½âËø
        if(ddrval != DD_OK) return(false);       

        return true;
}

HRESULT WinInit(HINSTANCE hInst, int nCmdShow, HWND* phWnd)
{   
        WNDCLASS wc;
    HWND     hWnd;

    // Register the Window Class
    wc.lpszClassName = TEXT("FrameBuffer");
    wc.lpfnWndProc   = MainWndProc;
    wc.style         = CS_VREDRAW | CS_HREDRAW;
    wc.hInstance     = hInst;
    wc.hIcon         = LoadIcon(NULL,IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;

    if (RegisterClass(&wc) == 0)      return E_FAIL;

    // Create and show the main window
    hWnd = CreateWindow(TEXT("FrameBuffer"), TEXT("FrameBuffer test"),
                 WS_OVERLAPPEDWINDOW, 0, 0, 400, 300,
                 GetDesktopWindow(), NULL, wc.hInstance, NULL);
       
    if (hWnd == NULL)   return E_FAIL;

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    *phWnd = hWnd;

    return S_OK;
}

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{   switch(msg)
    {   case WM_KEYDOWN:
             PostMessage(hWnd, WM_CLOSE, 0, 0);
             return 0L;
        case WM_SYSCOMMAND:            
             break;
                case WM_PAINT:                // »æÖÆ
            Render();
            ValidateRect(hWnd, NULL);
                        break;
        case WM_DESTROY:
                        SAFE_RELEASE(lpDDSPrimary);
                        SAFE_RELEASE(g_pDdaw);
             PostQuitMessage(0);
             return 0L;
    }

    return DefWindowProc(hWnd, msg, wParam, lParam);
}

33

主题

669

帖子

669

积分

高级会员

Rank: 4

积分
669
QQ
发表于 2004-9-14 12:43:00 | 显示全部楼层

Re:一个关于DirectDraw的问题

首先,不进行换页操作,BackBuffer就不需要了,以下修改
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount = 1;

ddsd.dwFlags = DDSD_CAPS ;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE ;

还有你的窗口大小是不上和主页面大小不一样

16

主题

72

帖子

72

积分

注册会员

Rank: 2

积分
72
 楼主| 发表于 2004-9-15 10:45:00 | 显示全部楼层

Re:一个关于DirectDraw的问题

谢谢!
这样窗口可以调整了,但是
for(int i = 20; i < GraphWidth; i++)
    for(int j = 30; j < GraphHeight; j++)
         GraphBuffer[i * GraphPitch + j] = color16;
矩形没有画在窗口呢,只要当窗口最大化时才能看到
谢谢!
新手的问题是不是逗很傻呀

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2004-9-15 20:25:00 | 显示全部楼层

Re:一个关于DirectDraw的问题

使用GetWindowRect函数。
对将要绘制的图形进行定位。

0

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2004-9-17 23:34:00 | 显示全部楼层

Re:一个关于DirectDraw的问题

首先,明确一点,窗口模式下的主表面就是整个的桌面屏幕,所以为了不要弄脏桌面,就要在BLT()的时候进行剪裁,而且是只按照窗口大小进行剪裁,当然你的窗口要是大小改变了或是移动了怎么办呢?恩,用楼上的方法GetWindowRect()获取窗口的位置,不过要记住,这个函数的返回值是整个窗口的坐标(包括控件和边框),所以你的裁剪窗口就要抛去这一部分,一般来说,边框的宽是3个像素,而标题栏是16个像素,减去这些就行了。关于显示模式我就不说了啊,呵呵呵,偷个懒
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-8-20 16:46

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表