新人学习DirectX时遇到了一个问题,求前辈指导(求助帖)

AlexLesser 2017-09-27 12:02:41
#include<windows.h>
#include<d3d9.h>
#include<time.h>
#include<iostream>
using namespace std;
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
const string Apptitle = "DirectX Surface Program ";
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000 ) ? 1: 0)
#define screenw 1024
#define screenh 768
LPDIRECT3D9 d3d = NULL;
LPDIRECT3DDEVICE9 d3ddev = NULL;
LPDIRECT3DSURFACE9 backbuffer = NULL;
LPDIRECT3DSURFACE9 surface = NULL;
bool gameover = false;
bool game_init(HWND hwnd)
{
d3d = Direct3DCreate9(D3D_SDK_VERSION);
if (d3d == NULL)
{
MessageBox(hwnd, "error creqating d3d", "error", MB_OK);
return false;
}
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferCount = 1;
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dpp.BackBufferWidth = screenw;
d3dpp.BackBufferHeight = screenh;
d3dpp.hDeviceWindow = hwnd;

d3d->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL, hwnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &d3ddev
);
if (!d3ddev)
{
MessageBox(hwnd, "error creating d3ddev ", " error", MB_OK);
return false;
}
srand((unsigned int)time(NULL));
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
d3ddev->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &backbuffer);
HRESULT result = d3ddev->CreateOffscreenPlainSurface(
100, 100,
D3DFMT_X8R8G8B8,
D3DPOOL_DEFAULT,
&surface,
NULL
);
if (result != D3D_OK) return false;
return true;
}

void game_run(HWND hwnd)
{
if (!d3ddev) return;
if (d3ddev->BeginScene())
{
int r = rand() % 255;
int g = rand() % 255;
int b = rand() % 255;
d3ddev->ColorFill(surface, NULL, D3DCOLOR_XRGB(r, g, b));
RECT rect;
rect.left = rand() % screenw/2;
rect.right = rect.left + rand() % screenw / 2 ;
rect.top = rand() % screenh;
rect.bottom = rect.top + rand() % screenh / 2;
d3ddev->StretchRect(surface, NULL, backbuffer, &rect, D3DTEXF_NONE);
d3ddev->EndScene();
d3ddev->Present(NULL, NULL, NULL, NULL);
}

if (KEY_DOWN(VK_ESCAPE))
PostMessage(hwnd, WM_DESTROY, 0, 0);
}
void game_end(HWND hwnd)
{
if (surface) surface->Release();
if (d3ddev) d3ddev->Release();
if (d3d) d3d->Release();
}
LRESULT WINAPI WinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{

switch (msg)
{
case WM_DESTROY:
gameover = true;
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wparam, lparam);
}

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow)
{
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hinstance;
wc.hIconSm = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = "mainWindowClass";
wc.hIconSm = NULL;
RegisterClassEx(&wc);
HWND window = CreateWindow(" mianWindowClass", Apptitle.c_str(), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
screenw, screenh, (HWND)NULL, (HMENU)NULL, hinstance, (LPVOID)NULL);
if (!window )
{
MessageBox(window, " window error", "error", MB_OK);
return 0;
}
ShowWindow(window, ncmdshow);
UpdateWindow(window);
if (!game_init(window))
{
MessageBox(window, " init error", "error", MB_OK);
return 0;
}

MSG msg;
while (!gameover)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
game_run(window);

}
//game_end(window);
return msg.wParam;
}


应该是CreateWindow出现了错误,返回的总是0,所以下面无法编译下去(新人的推测),百度了几次也没解决,求前辈赐教
...全文
550 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Saleayas 2017-09-28
  • 打赏
  • 举报
回复
设置一下 hIcon ,在注册窗口的时候。 可以直接设置为 NULL,就像 hIconSm 一样。 不要留一个不确定的数值。
AlexLesser 2017-09-28
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
我刚放在VS2010、文件、新建、项目、Visual C++、Win32、Win32 项目、……、空项目、完成。 添加我的代码, 项目、属性、配置属性、常规、字符集:使用多字节字符集、确定。 生成、生成解决方案。 …… ========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========
抱歉,前辈,我的问题没有表达清楚。 我也可以生成成功,但运行时弹出弹窗,内容为“ window error”, 是我设置判断window是否初始化成功的,也就是说window一直为null,这是我一直的问题。前辈你应该能看出来这个程序要做的效果,你运行的是成功的么?
赵4老师 2017-09-28
  • 打赏
  • 举报
回复
我刚放在VS2010、文件、新建、项目、Visual C++、Win32、Win32 项目、……、空项目、完成。 添加我的代码, 项目、属性、配置属性、常规、字符集:使用多字节字符集、确定。 生成、生成解决方案。 …… ========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========
赵4老师 2017-09-28
  • 打赏
  • 举报
回复
引用 7 楼 AlexLesser 的回复:
引用 6 楼 zhao4zhong1 的回复:
将我的代码放在VS2015里的C/C++ Windows Application项目中,项目属性中选择使用多字节字符集。
您说的是为win32项目吧,而且我也设置了多字节字符集,但还是失败了
失败你也得把失败对应的错误提示复制粘贴上来才能让别人帮你看看到底哪里的问题吧。
AlexLesser 2017-09-28
  • 打赏
  • 举报
回复
引用 13 楼 zhao4zhong1 的回复:
纠正上帖:
    wc.hIconSm = NULL;
应改为
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
解决了,感谢前辈!
赵4老师 2017-09-28
  • 打赏
  • 举报
回复
纠正上帖:
    wc.hIconSm = NULL;
应改为
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
赵4老师 2017-09-28
  • 打赏
  • 举报
回复
wc.hIconSm = NULL; 应改为 wndClass.hIcon =LoadIcon(NULL, IDI_APPLICATION);
AlexLesser 2017-09-27
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
         wc.lpszClassName = "mainWindowClass";
HWND window = CreateWindow(" mianWindowClass",
关于自己是否适合编程的很简单的测试: 在报纸或杂志上随便找一段约1000字的文章,在Word中输入一遍。输完后再参考下面答案: A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样,且自我感觉很有成就感 A不适合编程(理由:打字准确度偏低、粗心大意) B初级程序员(理由:打字准确度很高、认真细致、自信、理解全角半角概念) C高级程序员(理由:在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证) D软件项目经理(理由:能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业!) 如果想从A变成B的话,到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”
好尴尬。。。十分感谢
AlexLesser 2017-09-27
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
将我的代码放在VS2015里的C/C++ Windows Application项目中,项目属性中选择使用多字节字符集。
您说的是为win32项目吧,而且我也设置了多字节字符集,但还是失败了
赵4老师 2017-09-27
  • 打赏
  • 举报
回复
         wc.lpszClassName = "mainWindowClass";
HWND window = CreateWindow(" mianWindowClass",
关于自己是否适合编程的很简单的测试: 在报纸或杂志上随便找一段约1000字的文章,在Word中输入一遍。输完后再参考下面答案: A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样,且自我感觉很有成就感 A不适合编程(理由:打字准确度偏低、粗心大意) B初级程序员(理由:打字准确度很高、认真细致、自信、理解全角半角概念) C高级程序员(理由:在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证) D软件项目经理(理由:能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业!) 如果想从A变成B的话,到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”
赵4老师 2017-09-27
  • 打赏
  • 举报
回复
将我的代码放在VS2015里的C/C++ Windows Application项目中,项目属性中选择使用多字节字符集。
AlexLesser 2017-09-27
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
仅供参考:(vc6编译没错版)
#include<windows.h>
#include<d3d9.h>
#include<time.h>
#include<iostream>
using namespace std;
#pragma comment(lib,"gdi32.lib")
#pragma comment(lib,"user32.lib")
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
const string Apptitle = "DirectX Surface Program ";
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000 ) ? 1: 0)
#define screenw 1024
#define screenh 768
LPDIRECT3D9 d3d = NULL;
LPDIRECT3DDEVICE9 d3ddev = NULL;
LPDIRECT3DSURFACE9 backbuffer = NULL;
LPDIRECT3DSURFACE9 surface = NULL;
bool  gameover = false;
bool game_init(HWND hwnd) {
    d3d = Direct3DCreate9(D3D_SDK_VERSION);
    if (d3d == NULL) {
        MessageBox(hwnd, "error creqating d3d", "error", MB_OK);
        return false;
    }
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferCount = 1;
    d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
    d3dpp.BackBufferWidth = screenw;
    d3dpp.BackBufferHeight = screenh;
    d3dpp.hDeviceWindow = hwnd;

    d3d->CreateDevice(
        D3DADAPTER_DEFAULT,
        D3DDEVTYPE_HAL, hwnd,
        D3DCREATE_SOFTWARE_VERTEXPROCESSING,
        &d3dpp, &d3ddev
    );
    if (!d3ddev) {
        MessageBox(hwnd, "error creating d3ddev ", " error", MB_OK);
        return false;
    }
    srand((unsigned int)time(NULL));
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
    d3ddev->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &backbuffer);
    HRESULT result = d3ddev->CreateOffscreenPlainSurface(
                         100, 100,
                         D3DFMT_X8R8G8B8,
                         D3DPOOL_DEFAULT,
                         &surface,
                         NULL
                     );
    if (result != D3D_OK) return false;
    return true;
}

void game_run(HWND hwnd) {
    if (!d3ddev) return;
    if (d3ddev->BeginScene()) {
        int r = rand() % 255;
        int g = rand() % 255;
        int b = rand() % 255;
        d3ddev->ColorFill(surface, NULL, D3DCOLOR_XRGB(r, g, b));
        RECT rect;
        rect.left = rand() % screenw/2;
        rect.right = rect.left + rand() % screenw / 2 ;
        rect.top = rand() % screenh;
        rect.bottom = rect.top + rand() % screenh / 2;
        d3ddev->StretchRect(surface, NULL, backbuffer, &rect, D3DTEXF_NONE);
        d3ddev->EndScene();
        d3ddev->Present(NULL, NULL, NULL, NULL);
    }

    if (KEY_DOWN(VK_ESCAPE))
        PostMessage(hwnd, WM_DESTROY, 0, 0);
}
void game_end(HWND hwnd) {
    if (surface) surface->Release();
    if (d3ddev) d3ddev->Release();
    if (d3d) d3d->Release();
}
LRESULT WINAPI WinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {

    switch (msg) {
    case WM_DESTROY:
        gameover = true;
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, msg, wparam, lparam);
}

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) {
    WNDCLASSEX wc;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC)WinProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hinstance;
    wc.hIconSm = NULL;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "mainWindowClass";
    wc.hIconSm = NULL;
    RegisterClassEx(&wc);
    HWND window = CreateWindow("mainWindowClass", Apptitle.c_str(), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
                               screenw, screenh, (HWND)NULL, (HMENU)NULL, hinstance, (LPVOID)NULL);
    if (!window ) {
        MessageBox(window, " window error", "error", MB_OK);
        return 0;
    }
    ShowWindow(window, ncmdshow);
    UpdateWindow(window);
    if (!game_init(window)) {
        MessageBox(window, " init error", "error", MB_OK);
        return 0;
    }

    MSG msg;
    while (!gameover) {
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        game_run(window);

    }
    game_end(window);
    return msg.wParam;
}
谢谢,我用的是vs2015,新手不太了解区别
赵4老师 2017-09-27
  • 打赏
  • 举报
回复
仅供参考:(vc6编译没错版)
#include<windows.h>
#include<d3d9.h>
#include<time.h>
#include<iostream>
using namespace std;
#pragma comment(lib,"gdi32.lib")
#pragma comment(lib,"user32.lib")
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
const string Apptitle = "DirectX Surface Program ";
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000 ) ? 1: 0)
#define screenw 1024
#define screenh 768
LPDIRECT3D9 d3d = NULL;
LPDIRECT3DDEVICE9 d3ddev = NULL;
LPDIRECT3DSURFACE9 backbuffer = NULL;
LPDIRECT3DSURFACE9 surface = NULL;
bool  gameover = false;
bool game_init(HWND hwnd) {
    d3d = Direct3DCreate9(D3D_SDK_VERSION);
    if (d3d == NULL) {
        MessageBox(hwnd, "error creqating d3d", "error", MB_OK);
        return false;
    }
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferCount = 1;
    d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
    d3dpp.BackBufferWidth = screenw;
    d3dpp.BackBufferHeight = screenh;
    d3dpp.hDeviceWindow = hwnd;

    d3d->CreateDevice(
        D3DADAPTER_DEFAULT,
        D3DDEVTYPE_HAL, hwnd,
        D3DCREATE_SOFTWARE_VERTEXPROCESSING,
        &d3dpp, &d3ddev
    );
    if (!d3ddev) {
        MessageBox(hwnd, "error creating d3ddev ", " error", MB_OK);
        return false;
    }
    srand((unsigned int)time(NULL));
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
    d3ddev->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &backbuffer);
    HRESULT result = d3ddev->CreateOffscreenPlainSurface(
                         100, 100,
                         D3DFMT_X8R8G8B8,
                         D3DPOOL_DEFAULT,
                         &surface,
                         NULL
                     );
    if (result != D3D_OK) return false;
    return true;
}

void game_run(HWND hwnd) {
    if (!d3ddev) return;
    if (d3ddev->BeginScene()) {
        int r = rand() % 255;
        int g = rand() % 255;
        int b = rand() % 255;
        d3ddev->ColorFill(surface, NULL, D3DCOLOR_XRGB(r, g, b));
        RECT rect;
        rect.left = rand() % screenw/2;
        rect.right = rect.left + rand() % screenw / 2 ;
        rect.top = rand() % screenh;
        rect.bottom = rect.top + rand() % screenh / 2;
        d3ddev->StretchRect(surface, NULL, backbuffer, &rect, D3DTEXF_NONE);
        d3ddev->EndScene();
        d3ddev->Present(NULL, NULL, NULL, NULL);
    }

    if (KEY_DOWN(VK_ESCAPE))
        PostMessage(hwnd, WM_DESTROY, 0, 0);
}
void game_end(HWND hwnd) {
    if (surface) surface->Release();
    if (d3ddev) d3ddev->Release();
    if (d3d) d3d->Release();
}
LRESULT WINAPI WinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {

    switch (msg) {
    case WM_DESTROY:
        gameover = true;
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, msg, wparam, lparam);
}

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) {
    WNDCLASSEX wc;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC)WinProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hinstance;
    wc.hIconSm = NULL;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "mainWindowClass";
    wc.hIconSm = NULL;
    RegisterClassEx(&wc);
    HWND window = CreateWindow("mainWindowClass", Apptitle.c_str(), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
                               screenw, screenh, (HWND)NULL, (HMENU)NULL, hinstance, (LPVOID)NULL);
    if (!window ) {
        MessageBox(window, " window error", "error", MB_OK);
        return 0;
    }
    ShowWindow(window, ncmdshow);
    UpdateWindow(window);
    if (!game_init(window)) {
        MessageBox(window, " init error", "error", MB_OK);
        return 0;
    }

    MSG msg;
    while (!gameover) {
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        game_run(window);

    }
    game_end(window);
    return msg.wParam;
}
AlexLesser 2017-09-27
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
         wc.lpszClassName = "mainWindowClass";
HWND window = CreateWindow(" mianWindowClass",
关于自己是否适合编程的很简单的测试: 在报纸或杂志上随便找一段约1000字的文章,在Word中输入一遍。输完后再参考下面答案: A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样,且自我感觉很有成就感 A不适合编程(理由:打字准确度偏低、粗心大意) B初级程序员(理由:打字准确度很高、认真细致、自信、理解全角半角概念) C高级程序员(理由:在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证) D软件项目经理(理由:能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业!) 如果想从A变成B的话,到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”
很感谢,但问题不是在这

33,321

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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