2014-11-08 2 views
1

Вот мой заголовокСоздание окна в 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 студент в программировании ... Here is the image of the error

ОБНОВЛЕНО: Ошибка выше была исправлена ​​путем замены

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 снова за помощью. .

+2

@ πάντα ῥεῖ:. Извините, но это, безусловно, не объявление Если вы не поняли проблему вопроса, или вы просто ленивы. Корень проблемы состоит в том, что метод класса (символ) 'WndProc' объявлен и используется в структуре' WNDCLASSEX', но фактическая реализация 'WndProc' (конечно) не является методом класса (поскольку ожидаемый прототип для оконных процедур Win32 не подходит для функций члена класса). Однако символ члена класса накладывает глобальный символ сферы. Вы можете либо избавиться от объявления члена класса, либо использовать оператор '::' scope. – datenwolf

+0

@ πάντα ῥεῖ: Итак, да, спасибо за закрытие «дубликата» (а это не так), чтобы люди не могли дать правильные ответы. Молодцы ... молодцы. – datenwolf

ответ

2
static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 

Вы должны определить это с помощью области видимости класса или как компилятор, если его глобальный статический или статический член класса знаю Так оно и должно быть

LRESULT CALLBACK Base::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
+1

Нельзя использовать ключевое слово 'static' при определении статического члена класса. Правильная реализация: 'LRESULT CALLBACK Base :: WndProc (HWND hWnd, сообщение UINT, WPARAM wParam, LPARAM lParam) {...}'. – IInspectable

+0

Но тогда у статики будет ошибка в cpp: «класс хранения здесь не может быть указан» –

+0

Спасибо большое. @IInspectable! Но когда я нажал кнопку «Отладка», ошибки не было, но окно не появилось. Визуальная студия «готова», но ничего не появляется. Есть идеи? –