游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1045|回复: 0

我用LoadBitmap出现的问题

[复制链接]

56

主题

758

帖子

768

积分

高级会员

Rank: 4

积分
768
发表于 2007-6-13 12:45:00 | 显示全部楼层 |阅读模式
运行一下代码时,贴出的图是桌面背景,这是为什么呢?请那位大侠愿意用宝贵的时间给在下指正,谢谢

#include <windows.h>
#include <ddraw.h>
#include "ddutil.cpp"

LPDIRECTDRAW lpDD;
LPDIRECTDRAWSURFACE lpDDSPrimary;
LPDIRECTDRAWSURFACE lpDDSBack;
LPDIRECTDRAWSURFACE lpDDSOne;

LRESULT CALLBACK WndProc( HWND hwnd , UINT message , WPARAM wParam , LPARAM lParam)
{
        switch(message)
        {
        case WM_PAINT:
                break;
        case WM_KEYDOWN:
                if(wParam==VK_ESCAPE)
                {
                        PostMessage(hwnd,WM_QUIT,TRUE,0);
                }
                if(wParam==VK_F3)
                {
                        lpDDSPrimary->Flip(NULL,DDFLIP_WAIT);
                }
                break;
        case WM_DESTROY:
                if(lpDD != NULL)
    {
        if(lpDDSPrimary != NULL)
        {
                lpDDSPrimary->Release();
                lpDDSPrimary=NULL;
        }
        lpDD->Release();
        lpDD = NULL;
    }
        }

        return DefWindowProc(hwnd,message,wParam,lParam);
};

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
        MSG msg;
        HWND hwnd;

        WNDCLASS wc;
        wc.cbClsExtra=0;
        wc.cbWndExtra=0;
        wc.hbrBackground =(HBRUSH)GetStockObject(BLACK_BRUSH);
        wc.hCursor=NULL;
        wc.hIcon =NULL;
        wc.hInstance=hInstance;
        wc.lpfnWndProc =WndProc;
        wc.lpszClassName="Window";
        wc.lpszMenuName =NULL;
        wc.style =CS_HREDRAW | CS_VREDRAW;

        RegisterClass( &wc);

        hwnd=CreateWindowEx(0,"window","window",WS_POPUP,0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),NULL,NULL,hInstance,NULL);
        if(!hwnd)
                return FALSE;

        ShowWindow(hwnd,nShowCmd);
        UpdateWindow(hwnd);

        LRESULT ddrval;
        ddrval = DirectDrawCreate(NULL, &lpDD, NULL);
        if(ddrval == DD_OK)
{
    // lpDD 是一个可用的 DirectDraw 对象.
        MessageBox(hwnd,"Can Create!","CAN",MB_OK);
}
else
{
    // DirectDraw 对象不能被创建.
        MessageBox(hwnd,"Can't Create!","CANNOT",MB_OK);
}

ddrval = lpDD->SetCooperativeLevel(hwnd, DDSCL_EXCLUSIVE |
    DDSCL_FULLSCREEN);
if(ddrval == DD_OK)
{
    // 独占模式成功.
        MessageBox(hwnd,"Can Fullscreen","Create",MB_OK);
}
else
{
    // 独占模式不成功.
    // 应用程序仍可运行.
}

ddrval = lpDD->SetDisplayMode(640, 480, 8);
if(ddrval == DD_OK)
{
    // 显示模式改变成功.
        MessageBox(hwnd,"Can SetDisplay","Success",MB_OK);
}
else
{
    // 显示模式不能被改变.
    // 这种模式不被支持或
    // 另一个程序取得了独占模式.
}

DDSURFACEDESC ddsd;
ddsd.dwSize =sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount =1;

ddrval =lpDD->CreateSurface(&ddsd,&lpDDSPrimary,NULL);
if(ddrval == DD_OK)
{
    // lpDDSPrimary 指向新页面.
        MessageBox(hwnd,"To New Surface","OK",MB_OK);
}
else
{
    // 页面未创建.
    return FALSE;
}

ShowCursor(false);

DDSCAPS ddscaps;
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack);
if(ddrval == DD_OK)
{
    // lpDDSBack 指向后台缓存.
        MessageBox(hwnd,"To Back","OK",MB_OK);
}
else
{
    return FALSE;
}

ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwHeight = 480;
ddsd.dwWidth = 640;
ddrval = lpDD->CreateSurface(&ddsd, &lpDDSOne, NULL);
if(ddrval != DD_OK)
{
    return FALSE;
}

ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwHeight = 480;
ddsd.dwWidth = 640;
ddrval = lpDD->CreateSurface(&ddsd, &lpDDSOne, NULL);
if(ddrval != DD_OK)
{
    return FALSE;
}

HBITMAP hbm;
// 装载位图资源.
hbm = (HBITMAP)LoadImage(NULL, "A.bmp",NULL, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);

if (hbm == NULL)
{
        MessageBox(hwnd,"hbm==NULL","r",MB_OK);
    return FALSE;
}

DDCopyBitmap(lpDDSOne, hbm, 0, 0, 640, 480);  
DeleteObject(hbm);

RECT rect;
rect.top =0;
rect.bottom =0;
rect.left =640;
rect.right =480;
HRESULT h;
h=lpDDSBack->BltFast(0,0,lpDDSOne,&rect,DDBLTFAST_WAIT);
if(h==NULL)
MessageBox(hwnd,"NULL","S",MB_OK);
lpDDSPrimary->Flip(NULL,DDFLIP_WAIT);
        while (GetMessage(&msg,hwnd,0,0))
        {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }

        return msg.wParam;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-26 04:35

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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