包含DirectDraw的Win32项目在VS里怎么都编译不了啊!求各位帮帮忙看一下

fighting0620 2012-10-14 03:21:25
这是整个的代码,主函数的:

#define WIN32_LEAN_AND_MEAN //不用MFC

#include<Windows.h>
#include<WindowsX.h>
#include<MMSystem.h>
#include<iostream>
#include<conio.h>
#include<stdlib.h>
#include<malloc.h>
#include<memory>
#include<string>
#include<stdarg.h>
#include<stdio.h>
#include<math.h>
#include<io.h>
#include<fcntl.h>
using namespace std;

//包含directdraw
#include<ddraw.h>
#pragma comment(lib,"ddraw.lib")
#pragma comment(lib,"dxguid.lib")
#pragma comment(lib,"winmm.lib")

#define WINDOW_CLASS_NAME "WINCLASS1"
//窗口的宽度和高度
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480

//窗口每像素所占的位数
#define SCREEN_BPP 16

//基本的无符号类型
typedef unsigned short USHORT;
typedef unsigned short WORD;
typedef unsigned char UCHAR;
typedef unsigned char BYTE;

#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code))?1:0)
#define KEYUP(vk_code) ((GetAsyncKeyState(vk_code))?0:1)

//建立5.5.5格式的16位像素模式(1位表示透明度)
#define _RGB16BIT555(r,g,b) ((b&31)+((g&31)<<5)+((r&31)<<10))
//建立5.6.5格式的16位像素模式
#define _RGB16BIT565(r,g,b) ((b&31)+((g&63)<<5)+((r&31)<<11))

//初始化一个direct draw结构
#define DDRAW_INIT_STRUCT(ddstruct) { memset(&ddstruct,0,sizeof(ddstruct));ddstruct.dwSize=sizeof(ddstruct); }


HWND main_window_handle = NULL;
HINSTANCE hinstance_app = NULL;

//directdraw要用到的东西

LPDIRECTDRAW7 lpdd = NULL;
LPDIRECTDRAWSURFACE7 lpddsprimary = NULL;
LPDIRECTDRAWSURFACE7 lpddsback = NULL;
LPDIRECTDRAWPALETTE lpddpal = NULL;
LPDIRECTDRAWCLIPPER lpddclipper = NULL;
PALETTEENTRY palette[256];
PALETTEENTRY save_palette[256];
DDSURFACEDESC2 ddsd;
DDBLTFX ddbltfx;
DDSCAPS2 ddscaps;
HRESULT ddrval;
DWORD start_clock_count = 0;

char buffer[80];

LRESULT CALLBACK WindowProc(HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam)
{

PAINTSTRUCT ps;
HDC hdc;
char buffer[80];

switch(msg)
{
case WM_CREATE:
{
//在这里进行初始化
//返回成功
return 0;
}break;
case WM_PAINT:
{
//简单的使窗口生效
hdc=BeginPaint(hwnd,&ps);
//结束绘制
EndPaint(hwnd,&ps);
//返回成功
return 0;
}
case WM_DESTROY:
{
//关闭应用程序,这里发送一个WM_QUIT信息
PostQuitMessage(0);
//返回成功
return 0;
}break;
default:break;
}
//处理我们不关注的信息
return DefWindowProc(hwnd,msg,wparam,lparam);
}

inline void Plot_Pixel_Faster16(int x,int y,
int red,int green,int blue,
USHORT *video_buffer,int lpitch16)
{
//这个函数绘制一个16位模式的像素
//假设调用者已经锁定了主显示表面
//传递给函数一个指针和一个每行的位数

//首先建立颜色字
USHORT pixel = _RGB16BIT565(red,green,blue);

video_buffer[x+y*lpitch16] = pixel;
}


int Game_Main(void *parms = NULL,int num_parms = 0)
{
//游戏主循环,在这里做你所有的处理

//按下ESC键就发送WM_CLOSE信息
if(KEYDOWN(VK_ESCAPE))
SendMessage(main_window_handle,WM_CLOSE,0,0);
//在主显示表面绘制一千个随机像素
//假设ddsd不符合要求,先对其进行规范并设置大小
DDRAW_INIT_STRUCT(ddsd);

//锁定主显示表面
if(FAILED(lpddsprimary->Lock(NULL,&ddsd,
DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,
NULL)))
return 0;
//现在ddsd.lPitch和ddsd.lpSurface是有效的

int lpitch16 = (int)(ddsd.lPitch>>1);
USHORT *video_buffer = (USHORT *)ddsd.lpSurface;

//在主显示表面绘制1000个随机点,他们会立即可见
for (int index=0; index < 1000; index++)
{
// 选择随机的坐标和随机的颜色
int red = rand()%256;
int green = rand()%256;
int blue = rand()%256;
int x = rand()%640;
int y = rand()%480;

//绘制像素
Plot_Pixel_Faster16(x,y,red,green,blue,video_buffer,lpitch16);

} // end for index
//解锁主显示表面
if(FAILED(lpddsprimary->Unlock(NULL)))
return 0;

//返回成功\失败,或者自定义的返回内容
return 1;
}

int Game_Init(void *parms = NULL, int num_parms = 0)
{
//在最初的窗口创建之后,主事件循环开始前被调用
//在这里做你所有的初始化工作

//创建IDirectDraw7.0对象
/*if (FAILED(DirectDrawCreateEx(NULL, (void **)&lpdd, IID_IDirectDraw7, NULL)))
return 0;
*/
LPDIRECTDRAW lpdd1 =NULL;
if(FAILED(DirectDrawCreate(NULL,&lpdd1, NULL)))
{
return 0;
}
if(FAILED(lpdd1->QueryInterface(IID_IDirectDraw7,(LPVOID *)&lpdd)))
return 0;
//设置协作级别
if (FAILED(lpdd->SetCooperativeLevel(main_window_handle,
DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX |
DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT)))
return 0;
//规范ddsd并设置尺寸
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwFlags = DDSD_CAPS;
//申请主显示表面
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;

//创建主显示表面
if (FAILED(lpdd->CreateSurface(&ddsd, &lpddsprimary, NULL)))
return 0;

//返回
return 1;
}

int Game_ShutDown(void *parms = NULL,int num_parms = 0)
{
//在游戏退出、主事件循环结束时被调用
//在这里做你所有的清理工作并关闭游戏
if (lpddsprimary)
{
lpddsprimary->Release();
lpddsprimary = NULL;
}

if (lpdd)
{
lpdd->Release();
lpdd = NULL;
}

//返回
return 1;
}

int WINAPI WinMain( HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpcmdline,
int ncmdshow)
{
WNDCLASSEX winclass;
HWND hwnd;
MSG msg;
HDC hdc;

winclass.cbSize = sizeof(WNDCLASSEX);
winclass.style = CS_DBLCLKS | CS_OWNDC |
CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc = WindowProc;
winclass.cbClsExtra = 0;
winclass.cbWndExtra = 0;
winclass.hInstance = hinstance;
winclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
winclass.hCursor = LoadCursor(NULL,IDC_ARROW);
winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
winclass.lpszMenuName = NULL;
winclass.lpszClassName = WINDOW_CLASS_NAME;
winclass.hIconSm = LoadIcon(NULL,IDI_APPLICATION);

//保存类句柄
hinstance_app = hinstance;

//注册类
if(!RegisterClassEx(&winclass))
return 0;

//创建窗口
if(!(hwnd = CreateWindowEx(NULL,
WINDOW_CLASS_NAME,
"游戏控制台1.0",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
0,0,
SCREEN_WIDTH,SCREEN_HEIGHT,
NULL, //父窗口句柄,空则为桌面
NULL,
hinstance, //应用程序实例
NULL)))
return 0;

//保存窗口句柄
main_window_handle = hwnd;

//初始化游戏
Game_Init();

//进入主事件循环
while(TRUE)
{
//测试是否由消息在消息队列中,如果有,就取出该消息
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
//测试是否是退出消息
if(msg.message == WM_QUIT)
break;
//翻译一些催化关键字
TranslateMessage(&msg);
//将消息送入WinProc()中
DispatchMessage(&msg);
}
Game_Main();
}

//关闭游戏
Game_ShutDown();

return msg.wParam;
}

我生成解决方案,总是出现error LNK2019,
1>ManifestResourceCompile:
1> 所有输出均为最新。
1>demo.obj : error LNK2001: 无法解析的外部符号 _IID_IDirectDraw7
1>E:\我的未来\游戏编程\程序\Paint\Debug\Paint.exe : fatal error LNK1120: 1 个无法解析的外部命令
1>
1>生成失败。
我怎么改都不行啊!求大神解答一下,在线等啊!
...全文
340 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
u010410468 2014-01-10
  • 打赏
  • 举报
回复
引用 6 楼 moshang005 的回复:
没装DIRECT SDK包吧。
一定要装DIRECT SDK吗,加入library还不行啊?
moshang005 2013-01-18
  • 打赏
  • 举报
回复
没装DIRECT SDK包吧。
fighting0620 2012-10-14
  • 打赏
  • 举报
回复
我都是少打了\,可是我又重新生成了一下,说无法打开这些LIB文件,我快疯了,求给一个最简单的能编译运行的用到DirectDraw的程序吧!
fighting0620 2012-10-14
  • 打赏
  • 举报
回复
我还试了把这三个文件放入工程文件夹里,也不行
fighting0620 2012-10-14
  • 打赏
  • 举报
回复
#pragma comment(lib,"C:\Program Files\Microsoft Visual Studio 10.0\VC\lib\ddraw.lib")
#pragma comment(lib,"C:\Program Files\Microsoft Visual Studio 10.0\VC\lib\dxguid.lib")
#pragma comment(lib,"C:\Program Files\Microsoft Visual Studio 10.0\VC\lib\winmm.lib")
我这么改了,重新生成解决方案,还是有错误,
>LINK : fatal error LNK1104: 无法打开文件“C:Program FilesMicrosoft Visual Studio 10.0VClibddraw.lib”
1>
1>生成失败。
求解释
hdg3707 2012-10-14
  • 打赏
  • 举报
回复
两个办法选一个就行了
hdg3707 2012-10-14
  • 打赏
  • 举报
回复
1.
#pragma comment(lib,"ddraw.lib")
#pragma comment(lib,"dxguid.lib")
#pragma comment(lib,"winmm.lib")
加上路径,就是类似:
#pragma comment(lib,"C:\\AA\\ddraw.lib")
2.
在工程里设置这些库及头文件的包含路径

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧