簡體   English   中英

我如何初始化hwnd

[英]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);
}
}

感謝所有幫助。

根據您提供的信息,無法確定,但這是我最好的猜測:

  1. render_backround()的簽名更改為: void render_backround(HWND hwnd)

  2. 刪除行HWND hwnd; 來自那個 function

  3. 在你的 second.cpp 文件中替換這一行render_backround(); 有了這個: render_backround(hwnd);

  4. 如所寫, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM