Вот мой заголовокСоздание окна в OO
#pragma once
#ifndef BASE_H
#define BASE_H
#include <Windows.h>
#include <windowsx.h>
class Base
{
HWND hWnd;
WNDCLASSEX WndCls;
HRESULT Hr;
public:
Base();
static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
void RegisterWnd(HINSTANCE hInstance);
void ShowWnd(int nCmdShow);
~Base();
};
#endif
Вот мой base.cpp
#include "Base.h"
Base::Base()
{
}
static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
// sort through and find what code to run for the message given
switch (message)
{
// this message is read when the window is closed
case WM_DESTROY:
{
// close the application entirely
PostQuitMessage(0);
return 0;
} break;
}
// Handle any messages the switch statement didn't
return DefWindowProc(hWnd, message, wParam, lParam);
}
void Base::RegisterWnd(HINSTANCE hInstance)
{
ZeroMemory(&WndCls, sizeof(WNDCLASSEX));
WndCls.cbSize = sizeof(WNDCLASSEX);
WndCls.hbrBackground = (HBRUSH)COLOR_WINDOW;
WndCls.hCursor = LoadCursor(NULL, IDC_ARROW);
WndCls.hIcon = LoadIcon(hInstance, NULL);
WndCls.hIconSm = LoadIcon(hInstance, NULL);
WndCls.hInstance = hInstance;
WndCls.lpfnWndProc = WndProc;
WndCls.lpszClassName = "ClsName";
WndCls.style = CS_HREDRAW | CS_VREDRAW;
Hr = RegisterClassEx(&WndCls);
if (FAILED(Hr))
MessageBox(NULL, "Window Class failed to register.", "ERROR", MB_OK);
hWnd = CreateWindowEx(
NULL,
"WndClassName",
"WndName",
WS_OVERLAPPEDWINDOW,
100, 100,
480, 640,
NULL,
NULL,
hInstance,
NULL);
if (FAILED(hWnd))
MessageBox(NULL, "Window Class failed to create", "ERROR", MB_OK);
}
void Base::ShowWnd(int nCmdShow)
{
Hr = ShowWindow(hWnd, nCmdShow);
if (FAILED(Hr))
MessageBox(NULL, "Failed to display Window", "ERROR", MB_OK);
}
Base::~Base()
{
}
А вот мой main.cpp
#include "Base.h"
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
Base CreateWnd;
CreateWnd.RegisterWnd(hInstance);
CreateWnd.ShowWnd(nCmdShow);
MSG Msg;
while (GetMessage(&Msg, NULL, 0, 0))
{
// translate keystroke messages into the right format
TranslateMessage(&Msg);
// send the message to the WindowProc function
DispatchMessage(&Msg);
}
// return this part of the WM_QUIT message to Windows
return Msg.wParam;
}
Проблема заключается в том, Я продолжаю получать это сообщение об ошибке, о котором я не понимаю. Извините за плохой explanation..Still студент в программировании ...
ОБНОВЛЕНО: Ошибка выше была исправлена путем замены
static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
с
LRESULT CALLBACK Base::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
Благодаря Рави и не поддается быстрой помощи.
Теперь у меня другая ошибка. D: Когда я нажал на отладку, все работает отлично, но ничего не появляется. Окно не отображается. Visual Studio отлично работает как «Ready». (К сожалению, я не хочу, чтобы сделать еще один новый вопрос, потому что он все еще связан с создающим окном в оо
ВТОРОЙ UPDATE: Моего имя класса в CreateWindowEx
отличается от RegisterWnd
..My плохо Благодаря IInspectable снова за помощью. .
@ πάντα ῥεῖ:. Извините, но это, безусловно, не объявление Если вы не поняли проблему вопроса, или вы просто ленивы. Корень проблемы состоит в том, что метод класса (символ) 'WndProc' объявлен и используется в структуре' WNDCLASSEX', но фактическая реализация 'WndProc' (конечно) не является методом класса (поскольку ожидаемый прототип для оконных процедур Win32 не подходит для функций члена класса). Однако символ члена класса накладывает глобальный символ сферы. Вы можете либо избавиться от объявления члена класса, либо использовать оператор '::' scope. – datenwolf
@ πάντα ῥεῖ: Итак, да, спасибо за закрытие «дубликата» (а это не так), чтобы люди не могли дать правильные ответы. Молодцы ... молодцы. – datenwolf