包含DirectDraw的Win32项目在VS里怎么都编译不了啊!求各位帮帮忙看一下
这是整个的代码,主函数的:
#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>生成失败。
我怎么改都不行啊!求大神解答一下,在线等啊!