[英]How do I initialize hwnd
我正在尝试制作一款 32 位游戏以获得体验,但我遇到了一个问题,一个错误不断弹出,提示“使用了未初始化的变量 hwnd”,我明白它的意思,但我不知道将 hwnd 初始化为什么。 我试过将 hwnd 设置为 render_state.memory 但它不喜欢那个以太。
(如果您尝试编译这些,请确保将属性中的配置设置为所有配置,并在第一个(下面的那个)上从构建中排除为 true。另外,下面的 .cpp 文件是名为 render.cpp 的文件)
这是有错误的代码:
#include <Windows.h>
struct Render_State
{
int
width,
hight;
void* memory;
BITMAPINFO bitmap_info;
};
Render_State render_state;
void render_backround()
{
if (WM_PAINT)
{
PAINTSTRUCT ps;
HWND hwnd;
HDC hdc = BeginPaint(hwnd, &ps);
unsigned int* pixel = (unsigned int*)render_state.memory;
for (int y = 0; y < render_state.hight; y++)
{
for (int x = 0; x < render_state.width; x++)
{
*pixel++ = x * y + x;
}
}
// render
StretchDIBits(
hdc,
0,
0,
render_state.width,
render_state.hight,
0,
0,
render_state.width,
render_state.hight,
render_state.memory,
&render_state.bitmap_info,
DIB_RGB_COLORS,SRCCOPY
);
{
}
EndPaint(hwnd, &ps);
}
}
这是 second.cpp 文件(这是主程序):
#include "renderer.cpp"
#include <Windows.h>
bool running = true;
LRESULT CALLBACK windows_callback(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
LRESULT result = 0;
switch (uMsg)
{
case WM_CLOSE:
case WM_DESTROY:
{
PostQuitMessage(0);
}
break;
render_backround();
case WM_SIZE:
{
RECT rect;
GetClientRect(hwnd, &rect);
render_state.width = rect.right - rect.left;
render_state.hight = rect.bottom - rect.top;
int size = render_state.width*render_state.hight*sizeof(unsigned int);
if(render_state.memory)VirtualFree(render_state.memory,0,MEM_RELEASE);
render_state.memory=VirtualAlloc(
0,size,
MEM_COMMIT|MEM_RESERVE,
PAGE_READWRITE);
render_state.bitmap_info.bmiHeader.biSize =
sizeof(render_state.bitmap_info.bmiHeader);
render_state.bitmap_info.bmiHeader.biWidth =render_state.width;
render_state.bitmap_info.bmiHeader.biHeight =render_state.hight;
render_state.bitmap_info.bmiHeader.biPlanes = 1;
render_state.bitmap_info.bmiHeader.biBitCount = 32;
render_state.bitmap_info.bmiHeader.biCompression = BI_RGB;
}
break;
default:
{
result = DefWindowProc(hwnd, uMsg, wParam, lParam);
}
}
return result;
}
int WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd
)
{
//compile window
CHAR clsName[] = "test";
WNDCLASSA window_class = {};
window_class.style = CS_HREDRAW | CS_VREDRAW;
window_class.lpszClassName = clsName;
window_class.lpfnWndProc = windows_callback;
//register clases
ATOM atom = RegisterClassA(&window_class);
if (0 == atom)
{
DWORD err = GetLastError();
return 1;
}
// create window
HWND window = CreateWindow(
clsName,
"game",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT,
CW_USEDEFAULT,
720,
360,
0,
0,
hInstance,
0
);
if (NULL == window)
{
DWORD err = GetLastError();
return 1;
}
MSG msg;
// Main message loop:
while (GetMessage(&msg, nullptr, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
感谢所有帮助。
根据您提供的信息,无法确定,但这是我最好的猜测:
将render_backround()
的签名更改为: void render_backround(HWND hwnd)
删除行HWND hwnd;
来自那个 function
在你的 second.cpp 文件中替换这一行render_backround();
有了这个: render_backround(hwnd);
如所写, render_backround(hwnd);
无法到达。 您缺少一个case WM_PAINT:
它前面的行。
我认为这是通往 go 的方式,因为您的windows_callback
windows_callback 后来被注册为回调(如命名所示)。 这意味着 Windows 将负责传递合理的参数。 在这些参数中恰好有一个HWND
,正是您所需要的。 因此,如果设置的回调机制完全有效,我们可以预期回调中的这个HWND
实例将是可以使用的。 因此,您只需要在render_backround
function 中使用完全相同的实例,因此您必须将它传递到那里而不是让它声明自己的实例(这会导致您的错误)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.