游戏开发论坛

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

请问这有什么错???

[复制链接]

4

主题

21

帖子

21

积分

注册会员

Rank: 2

积分
21
发表于 2004-5-28 14:55:00 | 显示全部楼层 |阅读模式
canvasFrame::limpid(CDC *dc)
{
        BITMAP bm;            //声明bm为BITMAP数据结构
        int x,y,i=0;
        GetClientRect(&rect);
        mdc = new CDC;        
        bitmap = new CBitmap;
        bgbmp = new CBitmap;
        mdc->CreateCompatibleDC(dc); //建立与dc兼容的DC
        bgbmp->m_hObject = (HBITMAP):oadImage(NULL,"bground.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE); //载入背景图
        bitmap->m_hObject = (HBITMAP)::LoadImage(NULL,"girl.bmp",IMAGE_BITMAP,298,329,LR_LOADFROMFILE); //载入源位图
        bitmap->GetObject(sizeof(BITMAP),&bm); //取得 bitmap 位图的信息
        unsigned char *px = new unsigned char[bm.bmHeight*bm.bmWidthBytes]; //声明暂存数组
        bitmap->GetBitmapBits(bm.bmHeight*bm.bmWidthBytes,px); //取得源位图各像素点的 RGB 值存入 px 数组中
        for(y=0;y<bm.bmHeight;y++)
                for(x=0;x<bm.bmWidth;x++)
                {
                        px[x*3+y*bm.bmWidthBytes] *= 0.5;   //将 B 色彩值乘以 50%
                        px[x*3+1+y*bm.bmWidthBytes] *= 0.5; //将 G 色彩值乘以 50%
                        px[x*3+2+y*bm.bmWidthBytes] *= 0.5; //将 R 色彩值乘以 50%
                }
        bgbmp->GetObject(sizeof(BITMAP),&bm); //取得 bgbmp 位图的信息
        unsigned char *px1 = new unsigned char[bm.bmHeight*bm.bmWidthBytes];  //声明暂存数组
        bgbmp->GetBitmapBits(bm.bmHeight*bm.bmWidthBytes,px1); //取得源位图各像素点的 RGB 值存入 px1 数组中
        for(y=0;y<bm.bmHeight;y++)
                for(x=0;x<bm.bmWidth;x++)
                {
                        px1[x*3+y*bm.bmWidthBytes] = px1[x*3+y*bm.bmWidthBytes]*0.5 + px; //将 B 色彩值乘以 50% 并与 px 相加
                        px1[x*3+1+y*bm.bmWidthBytes] = px1[x*3+1+y*bm.bmWidthBytes]*0.5 + px[i+1];//将 G 色彩值乘以 50% 并与 px 相加
                        px1[x*3+2+y*bm.bmWidthBytes] = px1[x*3+2+y*bm.bmWidthBytes]*0.5 + px[i+2];//将 R 色彩值乘以 50% 并与 px 相加
                        i=i+3;
                }
        bgbmp->SetBitmapBits(bm.bmHeight*bm.bmWidthBytes,px1); //重设背景图的颜色
        mdc->SelectObject(bgbmp);  //选择位图对象到mdc中
        delete px;
        delete px1;
}


void canvasFrame::OnPaint()
{
        CPaintDC dc(this);    //建立响应WM_PAINT信息的DC
        dc.BitBlt(0,0,rect.right,rect.bottom,mdc,0,0,SRCCOPY);
}

其他还有窗体构造析构的
运行出错:unhandled exception in cavans.exe:0x000005:access vioation

这是书上的原程序,我都没改,到底什么错???
请指教!!

4

主题

21

帖子

21

积分

注册会员

Rank: 2

积分
21
 楼主| 发表于 2004-5-28 17:07:00 | 显示全部楼层

Re:请问这有什么错???

怎么没人回答,好失望。

21

主题

53

帖子

55

积分

注册会员

Rank: 2

积分
55
发表于 2004-5-29 08:05:00 | 显示全部楼层

Re:请问这有什么错???

楼主千万不要完全相信书上的代码,其实最好还是要自己要理解
像素是怎么样存放在内存中的.我也是这样学来的.多看看这个网站的
文章,很多对我来说是经典啊

17

主题

61

帖子

61

积分

注册会员

Rank: 2

积分
61
发表于 2004-5-30 00:54:00 | 显示全部楼层

Re:请问这有什么错???

这是不是《vc动感设计》里的代码?
我也用过,没错啊。我还自己写过,
但是从你给出的信息看来好象是内存溢出。

4

主题

21

帖子

21

积分

注册会员

Rank: 2

积分
21
 楼主| 发表于 2004-5-31 11:18:00 | 显示全部楼层

Re:请问这有什么错???

是vc游戏开发入门 的光盘原码,凡是涉及透明处理的程序都无法编译通过。
可是我看程序没有问题呀??
那为帮我调试一下

17

主题

61

帖子

61

积分

注册会员

Rank: 2

积分
61
发表于 2004-6-2 10:21:00 | 显示全部楼层

Re:请问这有什么错???

没错!我试过!

4

主题

21

帖子

21

积分

注册会员

Rank: 2

积分
21
 楼主| 发表于 2004-6-2 10:47:00 | 显示全部楼层

Re:请问这有什么错???

楼上的大哥,你用的是源程序吗,可以编译通过??
我就是直接使用的原代码,最后就出现运行出错:unhandled exception in cavans.exe:0x000005:access vioation

你可以把你的原代码和编译后的exe文件给我一分吗??
msn:yuanlinhuangjie@hotmail.com
qq:80108329

1

主题

5

帖子

11

积分

新手上路

Rank: 1

积分
11
QQ
发表于 2006-6-27 15:46:00 | 显示全部楼层

你试试我的。呵呵,其实很简单的

/*********************************************************
// 代码说明 DX窗口基本框架
//
//编号:0001
//日期:15:29 2006-6-27
//QQ:85258604
//网名:£ 草下飞 £
//E-MAIL:nbxiong2002@yahoo.com.cn
//BLOG:nbxiong.blog.com.cn
*********************************************************/

#include "stdafx.h"
#include "resource.h"
#include <ddraw.h>

#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE hInst;                                                                // current instance
TCHAR szTitle[MAX_LOADSTRING];                                                                // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];                                                                // The title bar text
BOOL bActive = FALSE;        // 用于判断程序是否运行的变量
LPDIRECTDRAWSURFACE7 ppsur;
LPDIRECTDRAWSURFACE7 pbbur;
LPDIRECTDRAWSURFACE7 popla;
LPDIRECTDRAWSURFACE7 popla2;
DDSURFACEDESC2 desc;
DDSCAPS2 caps;
// Foward declarations of functions included in this code module:
ATOM                                MyRegisterClass(HINSTANCE hInstance);
BOOL                                InitInstance(HINSTANCE, int);
LRESULT CALLBACK        WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK        About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
        // TODO: Place code here.
        MSG msg;
        HACCEL hAccelTable;

        // Initialize global strings
        LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
        LoadString(hInstance, IDC_D0001, szWindowClass, MAX_LOADSTRING);
        MyRegisterClass(hInstance);

        // Perform application initialization:
        if (!InitInstance (hInstance, nCmdShow))
        {
                return FALSE;
        }

        hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_D0001);

        // Main message loop:
        while(1) // 程序的循环
    {
        if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) // 不要特别注意的
        {
            if(!GetMessage(&msg, NULL, 0, 0 ))
                                return msg.wParam;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else if(bActive)     // 就是上面的“程序是否激活”的变量判断
        {
           // ShowThePic();     显示人物图片的函数,上节的内容,就是整合在这儿的!
        }
        else WaitMessage();  // 没有消息时,就等消息:)
    }
/*
        while (GetMessage(&msg, NULL, 0, 0))
        {
                if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
                {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }
        }*/

        return msg.wParam;
}



//
//  FUNCTION: MyRegisterClass()
//
//  PURPOSE: Registers the window class.
//
//  COMMENTS:
//
//    This function and its usage is only necessary if you want this code
//    to be compatible with Win32 systems prior to the 'RegisterClassEx'
//    function that was added to Windows 95. It is important to call this function
//    so that the application will get 'well formed' small icons associated
//    with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
        WNDCLASSEX wcex;

        wcex.cbSize = sizeof(WNDCLASSEX);

        wcex.style                        = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc        = (WNDPROC)WndProc;
        wcex.cbClsExtra                = 0;
        wcex.cbWndExtra                = 0;
        wcex.hInstance                = hInstance;
        wcex.hIcon                        = LoadIcon(hInstance, (LPCTSTR)IDI_D0001);
        wcex.hCursor                = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground        = (HBRUSH)GetStockObject(BLACK_BRUSH);
        wcex.lpszMenuName        = NULL;//(LPCSTR)IDC_D0001;
        wcex.lpszClassName        = szWindowClass;
        wcex.hIconSm                = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

        return RegisterClassEx(&wcex);
}

//
//   FUNCTION: InitInstance(HANDLE, int)
//
//   PURPOSE: Saves instance handle and creates main window
//
//   COMMENTS:
//
//        In this function, we save the instance handle in a global variable and
//        create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // Store instance handle in our global variable

   hWnd = CreateWindow(szWindowClass, szTitle, WS_POPUP,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
   
   ////hWnd = CreateWindowEx(WS_EX_TOPMOST, szWindowClass, szTitle, WS_POPUP, 112, 84, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL);
   if (!hWnd)
   {
      return FALSE;
   }
   
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
   LPDIRECTDRAW7 pDD7;
   HRESULT result;
   result=DirectDrawCreateEx(NULL,(void **)&pDD7,IID_IDirectDraw7,NULL);
   if (result!=DD_OK)
   {
           MessageBox(NULL,"建立DX对象失败!","程序初始化",MB_OK);
           return FALSE;
   }
   result=pDD7->SetCooperativeLevel(hWnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN|DDSCL_ALLOWREBOOT);
   if (result!=DD_OK)
   {
           MessageBox(NULL,"设定程序协调级失败!","程序初始化",MB_OK);
           return FALSE;
   }
   result=pDD7->SetDisplayMode(1024,768,32,0,DDSDM_STANDARDVGAMODE);
        if (result!=DD_OK)
   {
           MessageBox(NULL,"设定显示模式失败!","程序初始化",MB_OK);
           return FALSE;
   }
        memset(&desc,0,sizeof(desc));
        desc.dwSize=sizeof(desc);
        desc.dwFlags=DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
        desc.dwBackBufferCount=1;
        desc.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|DDSCAPS_COMPLEX|DDSCAPS_FLIP;
        result=pDD7->CreateSurface(&desc,&ppsur,NULL);
        if(result!=DD_OK)
   {
                MessageBox(NULL,"建立主缓冲区失败!","程序初始化",MB_OK);
                return FALSE;
   }
        caps.dwCaps=DDSCAPS_BACKBUFFER;
        result=ppsur->GetAttachedSurface(&caps,&pbbur);
        if(result!=DD_OK)
        {
                MessageBox(NULL,"连接后缓冲区失败!","程序初始化",MB_OK);
                return FALSE;
        }
        memset(&desc,0,sizeof(desc));
        desc.dwSize=sizeof(desc);
        desc.dwFlags=DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH;
        desc.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN;
        desc.dwWidth=1024;
        desc.dwHeight=768;
        result=pDD7->CreateSurface(&desc,&popla,NULL);
        if(result!=DD_OK)
        {
                MessageBox(NULL,"建立幕后内存区失败!","程序初始化",MB_OK);
                return FALSE;
        }
        result=pDD7->CreateSurface(&desc,&popla2,NULL);
        if(result!=DD_OK)
        {
                MessageBox(NULL,"建立幕后内存区二失败!","程序初始化",MB_OK);
                return FALSE;
        }

        HDC hdc,hdc1;
        HBITMAP bitmap,rwmap;
        hdc=CreateCompatibleDC(NULL);
        bitmap=(HBITMAP)LoadImage(NULL,"x.bmp",IMAGE_BITMAP,1024,768,LR_LOADFROMFILE);
        if(bitmap==NULL)
        {
                MessageBox(NULL,"读取位图失败!","程序初始化",MB_OK);
                return FALSE;
        }
        rwmap=(HBITMAP)LoadImage(NULL,"z.bmp",IMAGE_BITMAP,320,185,LR_LOADFROMFILE);
        if(rwmap==NULL)
        {
                MessageBox(NULL,"读取人物位图失败!","程序初始化",MB_OK);
                return FALSE;
        }
        SelectObject(hdc,bitmap);
        popla->GetSurfaceDesc(&desc);
        result=popla->GetDC(&hdc1);
        BitBlt(hdc1,0,0,desc.dwWidth,desc.dwHeight,hdc,0,0,SRCCOPY);
        SelectObject(hdc,rwmap);
        BitBlt(hdc1,250,150,160,185,hdc,160,0,SRCAND);
        BitBlt(hdc1,250,150,160,185,hdc,0,0,SRCPAINT);
        popla->ReleaseDC(hdc1);
        bitmap=(HBITMAP)LoadImage(NULL,"x2.bmp",IMAGE_BITMAP,1024,768,LR_LOADFROMFILE);
        if(bitmap==NULL)
        {
                MessageBox(NULL,"读取位图失败!","程序初始化",MB_OK);
                return FALSE;
        }
        BITMAP bm;
        GetObject(rwmap,sizeof(BITMAP),&bm);
        unsigned char *px=new unsigned char[bm.bmHeight*bm.bmWidthBytes];
        GetBitmapBits(rwmap,bm.bmHeight*bm.bmWidthBytes,px);
        for (int y=0;y<bm.bmHeight;y++)
        {
                for (int x=0;x<bm.bmWidthBytes;x++)
                {
                        px[x*3+y*bm.bmHeight]*=0.5;
                        px[x*3+1+y*bm.bmHeight]*=0.5;
                        px[x*3+2+y*bm.bmHeight]*=0.5;
                }
        }

        GetObject(bitmap,sizeof(BITMAP),&bm);
        unsigned char *px2=new unsigned char[bm.bmHeight*bm.bmWidthBytes];
        GetBitmapBits(bitmap,bm.bmHeight*bm.bmWidthBytes,px2);
        int i=0;
        for (y=20;y<348;y++)
        {
                for (int x=150;x<447;x++)
                {
                        px2[x*3+y*bm.bmHeight]=px2[x*3+y*bm.bmHeight]*0.5+px;
                        px2[x*3+1+y*bm.bmHeight]=px2[x*3+1+y*bm.bmHeight]*0.5+px[i+1];
                        px2[x*3+2+y*bm.bmHeight]=px2[x*3+2+y*bm.bmHeight]*0.5+px[i+2];
                        i+=3;
                }
        }

        SetBitmapBits(bitmap,bm.bmHeight*bm.bmWidthBytes,px2);
        SelectObject(hdc,bitmap);
        popla2->GetSurfaceDesc(&desc);
        result=popla2->GetDC(&hdc1);
        BitBlt(hdc1,0,0,desc.dwWidth,desc.dwHeight,hdc,0,0,SRCCOPY);
/*        SelectObject(hdc,rwmap);
        BitBlt(hdc1,250,150,160,185,hdc,160,0,SRCAND);*/
        popla2->ReleaseDC(hdc1);
   return TRUE;
}

//
//  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND        - process the application menu
//  WM_PAINT        - Paint the main window
//  WM_DESTROY        - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        int wmId, wmEvent;
        TCHAR szHello[MAX_LOADSTRING];
        LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
        RECT rt;
        GetClientRect(hWnd,&rt);
        rt.top=0;
        rt.left=0;
        rt.bottom=768;
        rt.right=1024;

        switch (message)
        {
                case WM_COMMAND:
                        wmId    = LOWORD(wParam);
                        wmEvent = HIWORD(wParam);
                        // Parse the menu selections:
                        switch (wmId)
                        {
                                case IDM_ABOUT:
                                   DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
                                   break;
                                case IDM_EXIT:
                                   DestroyWindow(hWnd);
                                   break;
                                default:
                                   return DefWindowProc(hWnd, message, wParam, lParam);
                        }
                        break;
                        case WM_PAINT:
                        //        pbbur->BltFast(0,0,popla,&rt,DDBLTFAST_WAIT);
                        //        ppsur->Flip(NULL,DDFLIP_WAIT);
                        break;
                case WM_DESTROY:
                        PostQuitMessage(0);
                        break;
                case WM_ACTIVATE:
                        bActive = TRUE;
                        break;
                case WM_SETCURSOR:
                        SetCursor(NULL);
        return TRUE;
                case WM_LBUTTONDOWN:
                        pbbur->BltFast(0,0,popla,&rt,DDBLTFAST_WAIT);
                        ppsur->Flip(NULL,DDFLIP_WAIT);
                        return TRUE;
                case WM_RBUTTONDOWN:
                        pbbur->BltFast(0,0,popla2,&rt,DDBLTFAST_WAIT);
                        ppsur->Flip(NULL,DDFLIP_WAIT);
                        return TRUE;
                case WM_KEYDOWN:
                        switch(wParam)
                        {
                        case VK_ESCAPE:      // 处理按下 ESC 键的反应
                                PostMessage(hWnd, WM_CLOSE, 0, 0);   // 发送一个关闭窗口的命令
                                break;
                        }
                        break;

                default:
                        return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}

// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
        switch (message)
        {
                case WM_INITDIALOG:
                                return TRUE;

                case WM_COMMAND:
                        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
                        {
                                EndDialog(hDlg, LOWORD(wParam));
                                return TRUE;
                        }
                        break;
        }
    return FALSE;
}

/*********************************************************
//
■■■■■■■■■■■■■■■■■■■■■■■■
这个世界只有两种人,懂二进制的和不懂二进制的。
■■■■■■■■■■■■■■■■■■■■■■■■
//
*********************************************************/
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-24 19:19

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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