游戏开发论坛

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

求助 ,图片显示的问题

[复制链接]

16

主题

158

帖子

168

积分

注册会员

Rank: 2

积分
168
发表于 2004-4-17 17:51:00 | 显示全部楼层 |阅读模式

通过下面的方法将图片加到一个页面,然后将其bltfast到主页面,为什么不行啊?
HDC hdcSf;
        HBITMAP hbmp;
        LPDIRECTDRAWSURFACE7 lpTmpSurf;

        //=====Load Bitmap Picture=====
        hbmp = (HBITMAP)LoadImage(NULL,p_BMPName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
        if (!hbmp)
                // failed to load, return failure to caller
                return NULL;

        //=====Create Temp DirectdrawSurface=====
    DDSURFACEDESC2 ddsd;
    //set memory zero
        memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
        //surface descriptor
        ddsd.dwSize = sizeof( ddsd );
        ddsd.dwFlags = DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT;
        ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; //offscreen surface
        ddsd.dwHeight=p_width;
        ddsd.dwWidth=p_height;
        if ( DD_OK != lpDD->CreateSurface( &ddsd, &(lpTmpSurf), NULL ))
        {
            SAFE_RELEASE(lpTmpSurf);
                return NULL; //create offscreen surface
        }
       
        //=====Create the DC=====
    lpTmpSurf->GetDC(&hdcSf);
           //Create a compatible DC
        HDC bitmap_dc=CreateCompatibleDC(hdcSf);
       
        HBITMAP oldbmp=(HBITMAP)::SelectObject(bitmap_dc,hbmp);
        ::BitBlt(hdcSf,0,0,p_width,p_height,bitmap_dc,0,0,SRCCOPY);

        //Release all DC
         if(oldbmp)
        ::SelectObject(bitmap_dc,oldbmp);
         :eleteDC(bitmap_dc);
        lpTmpSurf->ReleaseDC(hdcSf);

        return lpTmpSurf;

0

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2004-4-17 19:27:00 | 显示全部楼层

Re:求助 ,图片显示的问题

路过的人啊~~~~~~~~~~~~~~~

47

主题

145

帖子

3602

积分

论坛元老

Rank: 8Rank: 8

积分
3602
发表于 2004-4-17 20:09:00 | 显示全部楼层

Re:求助 ,图片显示的问题

我只知道不行,,,,,,别问我为什么不行。。。。

1

主题

5

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2004-4-17 20:19:00 | 显示全部楼层

Re:求助 ,图片显示的问题

hbmp = :HBITMAP)LoadImage(NULL,p_BMPName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
LoadImage是api函数。要加::
你下面建成的是后台页面,不能在屏幕显示的。ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; //offscreen surface从这一句可以看出。

主页面是不用设定ddsd.dwHeight=p_width;
ddsd.dwWidth=p_height;

16

主题

158

帖子

168

积分

注册会员

Rank: 2

积分
168
 楼主| 发表于 2004-4-17 23:24:00 | 显示全部楼层

Re:求助 ,图片显示的问题

这是个分函数,就是创建一个离屏的页面,把图片画上,然后在把这个页面复制到主页面,为什么也不行啊。

18

主题

122

帖子

132

积分

注册会员

Rank: 2

积分
132
发表于 2004-4-29 18:59:00 | 显示全部楼层

Re:求助 ,图片显示的问题

我觉得结构没什么错误  可能具体的函数错了把       一般都是先建立一个主页  之后后页
图片复制到后页  后页传输到主页显示  
如果你要API的我有  不过DXDRAW的 没有   只有前后页的

32

主题

377

帖子

378

积分

中级会员

Rank: 3Rank: 3

积分
378
发表于 2004-4-30 10:41:00 | 显示全部楼层

Re:求助 ,图片显示的问题

我把我自己写的一个完整的图象显示程序给你吧。我没用bltfast,而是自己写的copy函数。(效果比blt好多了)自己建个工程加进去,再把你要显示的两张图放在同一目录下(一张叫“yuna.bmp",一张叫"rikku.bmp")。(alpha是半透明函数)
#include<windows.h>
#include<ddraw.h>
HWND hwnd;
LPDIRECTDRAW7 IpDD;
LPDIRECTDRAWSURFACE7 IpDDSPrimary;
LPDIRECTDRAWSURFACE7 IpDDSBuffer;
LPDIRECTDRAWSURFACE7 IpDDSBack[2];
DDSURFACEDESC2 ddsd,ddsd_src,ddsd_dest;
HBITMAP bitmap;
HDC hdc1,hdc;
int i;
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
bool LoadPicture(char *PictureName,int i);
bool initwindow(char *windowname,HINSTANCE hinstance,int windowmodw);
bool initddraw();
void Copy(LPDIRECTDRAWSURFACE7 lPrimary,LPDIRECTDRAWSURFACE7 lPbuffer);
void CALLBACK Go(HWND hwnd,UINT uMsg,UINT iDevent,DWORD dwTime);
void Alpha();
int PASCAL WinMain(HINSTANCE hinstance,HINSTANCE hPrevhinstance,LPSTR lpCmdLine,int windowmode){
        if(!initwindow("ExpForCopy",hinstance,windowmode)||!initddraw()){
                MessageBox(hwnd,"MyFish","There must be something wrong!",MB_OK);
                return false;
        }
        if(!LoadPicture("rikku.bmp",0))return false;
        if(!LoadPicture("yuna.bmp",1))return false;
        SetTimer(hwnd,0,500,Go);
        MSG msg;       
    for(;;){
       
                if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
                        if(msg.message==WM_QUIT){
                                MessageBox(hwnd,"Let's us get out of this window","gogogo",MB_OK);
                                break;
                        }
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }
        }
        return msg.lParam;
}
bool initwindow(char *windowname,HINSTANCE hinstance,int windowmode){
        WNDCLASSEX win;
        win.cbSize=sizeof(WNDCLASSEX);
        win.style=CS_HREDRAW|CS_VREDRAW;
        win.lpfnWndProc=(WNDPROC)WinProc;
        win.cbClsExtra=0;
        win.cbWndExtra=0;
        win.hInstance=hinstance;
        win.hIcon=NULL;
        win.hCursor=NULL;
        win.hbrBackground=CreateSolidBrush(RGB(255,255,255));
        win.lpszMenuName=NULL;
        win.lpszClassName=windowname;
        win.hIconSm=NULL;
        RegisterClassEx(&win);
        hwnd=CreateWindow(windowname,windowname,WS_POPUP|WS_MAXIMIZE,CW_USEDEFAULT,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),NULL,NULL,hinstance,NULL);
        if(!hwnd)return false;
        ShowWindow(hwnd,windowmode);
        UpdateWindow(hwnd);
        return true;
}
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
        switch(message){
        case WM_KEYDOWN:
                switch(wParam){
                case VK_ESCAPE:
                        KillTimer(hwnd,0);
                        PostMessage(hwnd,WM_CLOSE,0,0);
                        break;
                }
                return 0;
        case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
        }
        return DefWindowProc(hwnd,message,wParam,lParam);
}
bool initddraw(){
        if(DirectDrawCreateEx(NULL,(void**)&IpDD,IID_IDirectDraw7,NULL)!=DD_OK)return false;
        if(IpDD->SetCooperativeLevel(hwnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN|DDSCL_NOWINDOWCHANGES|DDSCL_ALLOWREBOOT)!=DD_OK)return false;
        if(IpDD->SetDisplayMode(1024,768,32,0,DDSDM_STANDARDVGAMODE)!=DD_OK)return false;
        memset(&ddsd,0,sizeof(DDSURFACEDESC2));
        ddsd.dwSize=sizeof(ddsd);
        ddsd.dwFlags=DDSD_CAPS;
        ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE;
        if(IpDD->CreateSurface(&ddsd,&IpDDSPrimary,NULL)!=DD_OK)return false;
        ddsd.dwFlags=DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT;
        ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY;
        ddsd.dwHeight=768;
        ddsd.dwWidth=1024;
        if(IpDD->CreateSurface(&ddsd,&IpDDSBuffer,NULL)!=DD_OK)return false;
        for(int i=0;i<2;i++)if(IpDD->CreateSurface(&ddsd,&IpDDSBack,NULL)!=DD_OK)return false;
        hdc=::CreateCompatibleDC(NULL);  
        return true;
}
bool LoadPicture(char *PictureName,int i){
        bitmap=(HBITMAP):oadImage(NULL,PictureName,IMAGE_BITMAP,1024,768,LR_LOADFROMFILE);
        ::SelectObject(hdc,bitmap);
        if(IpDDSBack->GetSurfaceDesc(&ddsd)!=DD_OK)return false;
        if(IpDDSBack->GetDC(&hdc1)!=DD_OK)return false;
        ::BitBlt(hdc1,0,0,ddsd.dwWidth,ddsd.dwHeight,hdc,0,0,SRCCOPY);
        IpDDSBack->ReleaseDC(hdc1);
        return true;
}
void Copy(LPDIRECTDRAWSURFACE7 lPrimary,LPDIRECTDRAWSURFACE7 lPbuffer){
        ZeroMemory(&ddsd_src,sizeof(ddsd_src));
        ddsd_src.dwSize=sizeof(ddsd_src);
        ZeroMemory(&ddsd_dest,sizeof(ddsd_dest));
        ddsd_dest.dwSize=sizeof(ddsd_dest);
        lPrimary->Lock(NULL,&ddsd_src,DDLOCK_WAIT,NULL);
        lPbuffer->Lock(NULL,&ddsd_dest,DDLOCK_WAIT,NULL);
        BYTE *lPsrc=(BYTE*)ddsd_src.lpSurface;
        BYTE *lPdest=(BYTE*)ddsd_dest.lpSurface;
        for(int y=0;y<768;y++){
                memcpy(lPsrc,lPdest,4096);
                lPsrc+=ddsd_src.lPitch;
                lPdest+=ddsd_dest.lPitch;
        }
        lPrimary->Unlock(NULL);
        lPbuffer->Unlock(NULL);
}
void CALLBACK Go(HWND hwnd,UINT uMsg,UINT iDevent,DWORD dwTime){
        /*Copy(IpDDSBuffer,IpDDSBack[PictureNumber]);
        if(PictureNumber==0)PictureNumber++;
        else PictureNumber--;
        Copy(IpDDSPrimary,IpDDSBuffer);*/
        Alpha();
        Copy(IpDDSPrimary,IpDDSBuffer);
        i++;
}
void Alpha(){
        Copy(IpDDSBuffer,IpDDSBack[0]);
        ZeroMemory(&ddsd_src,sizeof(ddsd_src));
        ddsd_src.dwSize=sizeof(ddsd_src);
        ZeroMemory(&ddsd_dest,sizeof(ddsd_dest));
        ddsd_dest.dwSize=sizeof(ddsd_dest);
        IpDDSBuffer->Lock(NULL,&ddsd_src,DDLOCK_WAIT,NULL);
        IpDDSBack[1]->Lock(NULL,&ddsd_dest,DDLOCK_WAIT,NULL);            
    _int64 mask=0x7f7f7f7f7f7f7f7f;
        _asm{
                mov eax,ddsd_src.lpSurface
                mov ebx,ddsd_dest.lpSurface
                mov edi,768
FirstLoop:
                push eax
                push ebx
                mov esi,512
SecondLoop:
                movq mm0,[eax]
                movq mm1,[ebx]
                psrlw mm0, 1
                pand mm0, mask
                paddusb mm0,mm1
                movq [eax],mm0
                add eax,8
                add ebx,8
                dec esi
                jnz SecondLoop
                pop ebx
        pop eax
                add eax,ddsd_src.lPitch
                add ebx,ddsd_dest.lPitch
                dec edi
                jnz FirstLoop
                emms
        }
        IpDDSBuffer->Unlock(NULL);
        IpDDSBack[1]->Unlock(NULL);
}
               

18

主题

122

帖子

132

积分

注册会员

Rank: 2

积分
132
发表于 2004-4-30 19:22:00 | 显示全部楼层

Re:求助 ,图片显示的问题

大哥你WINMAIN  写的怎么这么乱还好意思拿出来啊    就你这个实用吗
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-30 16:53

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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