游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3294|回复: 1

初学DX编程遇到问题请帮忙看看

[复制链接]

2

主题

3

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2003-8-23 12:48:00 | 显示全部楼层 |阅读模式
编译环境BCB5,DX9

就是改了改贵站的游戏基础部分“无名鸟”的教程里的程序

#include <windows.h>
#include <ddraw.h>                                 // DirectDraw所使用的头文件;

// 变量、声明函数;
#if defined( __BORLANDC__ ) && defined( __WIN32__ )
#define _WIN32
#endif

#define WIN32
#define WIN95
LPDIRECTDRAW lpDD;                                // DirectDraw对象;
LPDIRECTDRAWSURFACE lpDDSPrimary;                // DirectDraw主页面;

char Sz1[]="嗨,这是我的第一个DirectX程序";
char Sz2[]="按ESC键退出程序";

LRESULT CALLBACK WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

BOOL InitWindow(HINSTANCE hInstance, int nCmdShow); // 创建主工作窗口;
BOOL InitDDraw(void);                               // 初始化DirectDraw并且打印字幕;
void UninitDDraw(void);                             // 卸载DirectDraw函数;

BOOL InitWindow(HINSTANCE hInstance, int nCmdShow)
{
    HWND hwnd;     // 窗口句柄;
    WNDCLASS wcex; // 窗口类结构;

    // 设置窗口类结构;
    wcex.style=0;                       // 风格;
    wcex.lpfnWndProc=WinProc;           // 窗口处理程序;
    wcex.cbClsExtra=0;                  // 扩充风格;
    wcex.cbWndExtra=0;                  // 扩充程序;
    wcex.hInstance=hInstance;           // 应用程序hInstance句柄;
    wcex.hIcon=LoadIcon(hInstance,IDI_APPLICATION); // 读入默认的图标;
    wcex.hCursor=LoadCursor(NULL,IDC_ARROW);        // 读入默认鼠标形状;
    wcex.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//窗口背景;
    wcex.lpszMenuName=NULL;               // 窗口目录;
    wcex.lpszClassName= "DirectX--Hello"; // 窗口的类名
    // 注册窗口类;
    RegisterClass(&wcex);
    // 创建主窗口;
    hwnd=CreateWindowEx(WS_EX_TOPMOST,"DirectX--Hello","",WS_POPUP|WS_VISIBLE,
                        0,0,GetSystemMetrics(SM_CXSCREEN),
                        GetSystemMetrics(SM_CYSCREEN),NULL,NULL,hInstance,NULL);
    if(!hwnd) return FALSE;
    ShowWindow(hwnd,nCmdShow); // 显示窗口;
    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: // Esc键;
            PostMessage(hWnd,WM_CLOSE,0,0);
            break;
        }
        break;
    case WM_DESTROY:    // 退出消息循环;
        UninitDDraw();
        PostQuitMessage(0);
        break;
    }
    // 调用缺省消息处理过程;
    return DefWindowProc(hWnd,message,wParam,lParam);
}

// 本程序的最核心内容,即DirectDraw的基本功能与用法;
BOOL InitDDraw(void)
{
    DDSURFACEDESC ddsd;
    HDC hdc;
    // 创建DirectDraw对象;
    if(DirectDrawCreate(NULL,&lpDD,NULL)!=DD_OK) return FALSE;
    // 设置为全屏模式;
    if (lpDD->SetCooperativeLevel(GetActiveWindow(),
    DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN)!=DD_OK)
    return FALSE;
    // 设置显示模式;
    if (lpDD->SetDisplayMode(800,600,16)!=DD_OK) return FALSE;
    // 设置主页面信息;
    ddsd.dwSize=sizeof(ddsd);
    ddsd.dwFlags=DDSD_CAPS;
    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;

    // 创建一个表面,类似开辟一块屏幕大小的显示内存;
    if (lpDD->CreateSurface(&ddsd,&lpDDSPrimary,NULL)!=DD_OK) return FALSE;
    // 输出文字;
    if (lpDDSPrimary->GetDC(&hdc)!=DD_OK) return FALSE;
    SetBkColor(hdc,RGB(0,0,0));              // 设置背景色;
    SetTextColor(hdc,RGB(255,255,0));        // 文字颜色;
    TextOut(hdc,250,250,Sz1,lstrlen(Sz1));   // 文字输出函数;
    TextOut(hdc,305,270,Sz2,lstrlen(Sz2));
    lpDDSPrimary->ReleaseDC(hdc);
    return TRUE;
}

void UninitDDraw(void)//卸载DirectDraw;
{
    if(lpDD!=NULL)
    {
        if(lpDDSPrimary!=NULL)
        {
            lpDDSPrimary->Release();
            lpDDSPrimary=NULL;
        }
        lpDD->Release();
        lpDD=NULL;
    }
}

// Windows的主工作函数,类似Dos下Turbo C编程的main();
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,int nCmdShow)
{
    MSG msg;
    // 初始化主窗口;
    if (!InitWindow(hInstance,nCmdShow)) return FALSE;
    // 初始化DirectDraw环境,并实现DirectDraw功能;
    if (!InitDDraw())
    {
        MessageBox(GetActiveWindow(),"初始化DirectDraw时出错!",
                   "Error",MB_OK);
        UninitDDraw();
        DestroyWindow(GetActiveWindow());
        return FALSE;
    }
    // 进入消息循环;
    while (GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

出现以下错误:

[Linker Error] Unresolved external 'DirectDrawCreate' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER5\LIB\C0X32.OBJ

我确保DX的头文件和LIB都拷进了BCB的INCLUDE和LIB目录里了。 [em4]

15

主题

129

帖子

129

积分

注册会员

Rank: 2

积分
129
发表于 2003-8-23 12:53:00 | 显示全部楼层

Re:初学DX编程遇到问题请帮忙看看

嗯,我不是很清楚BCB里的设置,但是在VC里面,要到Project->Setting->Links里面加上ddraw.lib之类的东西的~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-22 05:52

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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