c++ - 我的窗口句柄未使用,无法评估

标签 c++ c visual-c++

我正在尝试将我的 Win32 应用程序封装到一个类中。当我尝试为下面的应用程序启动我的主窗口时,我的问题发生在我的声明和实现中......我注意到我的类方法 InitInstance(); 中的问题;

声明

#pragma once
#include "stdafx.h"
#include "resource.h"
#define MAX_LOADSTRING 100

class RenderEngine {
protected:
    int m_width;
    int m_height;

    ATOM RegisterEngineClass();

public:
    static HINSTANCE m_hInst;
    HWND m_hWnd;
    int m_nCmdShow;
    TCHAR m_szTitle[MAX_LOADSTRING];                    // The title bar text
    TCHAR m_szWindowClass[MAX_LOADSTRING];          // the main window class name

    bool InitWindow();
    bool InitDirectX();
    bool InitInstance();

    //static functions
    static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    static INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);

    int Run();

};

实现

#include "stdafx.h"
#include "RenderEngine.h"
HINSTANCE RenderEngine::m_hInst = NULL;

bool RenderEngine::InitWindow()
{
    RenderEngine::m_hInst = NULL;
    // Initialize global strings
    LoadString(m_hInst, IDS_APP_TITLE, m_szTitle, MAX_LOADSTRING);
    LoadString(m_hInst, IDC_RENDERENGINE, m_szWindowClass, MAX_LOADSTRING);

    if(!RegisterEngineClass())
    {
        return false;
    }

    if(!InitInstance())
    {
        return false;
    }

    return true;
}

ATOM RenderEngine::RegisterEngineClass()
{
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = RenderEngine::WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = m_hInst;
    wcex.hIcon          = LoadIcon(m_hInst, MAKEINTRESOURCE(IDI_RENDERENGINE));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_RENDERENGINE);
    wcex.lpszClassName  = m_szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassEx(&wcex);
}

LRESULT CALLBACK RenderEngine::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Parse the menu selections:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(m_hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: Add any drawing code here...
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

bool RenderEngine::InitInstance()
{
   m_hWnd = NULL;// When I step into my code it says on this line 0x000000 unused = ??? expression cannot be evaluated
   m_hWnd = CreateWindow(m_szWindowClass, m_szTitle, WS_OVERLAPPEDWINDOW,
       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, m_hInst, NULL);

   if (!m_hWnd)// At this point, memory has been allocated unused = ??. It steps over this
   {
      return FALSE;
   }

   if(!ShowWindow(m_hWnd, m_nCmdShow))// m_nCmdShow = 1 and m_hWnd is still unused and expression
   {//Still cannot be evaluated. This statement is true. and shuts down.
        return false;
   }
   UpdateWindow(m_hWnd);

   return true;
}

// Message handler for about box.
INT_PTR CALLBACK RenderEngine::About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

int RenderEngine::Run()
{
    MSG msg;
    HACCEL hAccelTable;

    hAccelTable = LoadAccelerators(m_hInst, MAKEINTRESOURCE(IDC_RENDERENGINE));

    // Main message loop:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}

和调用该类的 winMain 函数

// RenderEngine.cpp : Defines the entry point for the application.
#include "stdafx.h"
#include "RenderEngine.h"

// Global Variables:

RenderEngine go;

    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
        UNREFERENCED_PARAMETER(hPrevInstance);
        UNREFERENCED_PARAMETER(lpCmdLine);

        // TODO: Place code here.
        RenderEngine::m_hInst = hInstance;
        go.m_nCmdShow = nCmdShow;
        if(!go.InitWindow())
        {
            return 0;
        }
            go.Run();

        return 0;
    }

最佳答案

ShowWindow 如果窗口之前不可见,则返回 0,因此 !ShowWindow(m_hWnd, m_nCmdShow) 计算为 true,导致您的 InitInstance 返回 false

至于调试器中所有这些“未使用”的东西,你是在 Debug模式下编译的吗?

关于c++ - 我的窗口句柄未使用,无法评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2892056/

相关文章:

c++ - 为什么 leetcode c++ sort() 给出编译错误?

C++ 如何创建/使用管道和 fork ?

c++ - boost::asio async_send 错误

c++ - poll() socket编程tcp linux多连接问题

c++ - QTextDocument 吃掉多个空格

c++ - 生成不同于数组的 1000 个元素的新元素

c - 如何让 Frama-C 在测试中理解按位 AND?

c - At&T Assembly 索引数组和声明数组

c - 希望提高内联汇编的效率,有人可以提供建议吗?

c++ - 如何只为一个类实现#pragma pointers_to_members()?