Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Простой класс создает ошибку при компиле!

11K
04 апреля 2008 года
coolcoder
39 / / 14.08.2006
Приветствую вас, уважаемые!
Прошу вас помочь разобраться с такой проблемой. Имеется следующий код:
Код:
class Window
{
protected:
    WNDCLASSEX wc;
    HWND hWnd;
public:
    LPCTSTR ClassName;
    LPCTSTR WindowName;
    int x;
    int y;
    int nWidth;
    int nHeight;

    LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
    {
        switch( msg )
        {
            case WM_DESTROY:
                Cleanup();
                PostQuitMessage( 0 );
                return 0;

            case WM_PAINT:
                Render();
                ValidateRect( hWnd, NULL );
                return 0;
        }

        return DefWindowProc( hWnd, msg, wParam, lParam );
    }

    Window()
{
    // Register the window class
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, //на эту строчку ругается error C2440: 'initializing' : cannot convert from 'overloaded-function' to 'WNDPROC'
                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                      L"D3D Tutorial", NULL };
    RegisterClassEx( &wc );

    // Create the application's window
    HWND hWnd = CreateWindow( L"D3D Tutorial", L"D3D Tutorial 01: CreateDevice",
                              WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
                              NULL, NULL, wc.hInstance, NULL );

    // Initialize Direct3D
    if( SUCCEEDED( InitD3D( hWnd ) ) )
    {
        // Show the window
        ShowWindow( hWnd, SW_SHOWDEFAULT );
        UpdateWindow( hWnd );

        // Enter the message loop
        MSG msg;
        while( GetMessage( &msg, NULL, 0, 0 ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
    }

    UnregisterClass( L"D3D Tutorial", wc.hInstance );
}
};

Что можно с этим сделать? Класс-то ведь предельно простой, но такая фигня выдается при компиле! Как исправить?
353
04 апреля 2008 года
Nixus
840 / / 04.01.2007
Должно быть:
static LRESULT WINAPI MsgProc
11K
04 апреля 2008 года
coolcoder
39 / / 14.08.2006
Спасибо, Nixus, сработало! Но позволь задать вопрос, почему оно сработало?.. Просто хотелось бы разобраться.
353
04 апреля 2008 года
Nixus
840 / / 04.01.2007
Потому что без static ты определяешь не статический метод класса, который должен быть вызван с спередачей указателя на класс (чего WinAPI делаеть не умеет). Со static ты по сути задаешь обычную функцию, которой не требуется передача указателя на класс.
11K
15 апреля 2008 года
coolcoder
39 / / 14.08.2006
Сделал вот так:
Код:
#include <windows.h>

class Window
{
public:
    HWND handle;
    WNDCLASS window_class;
    LPCTSTR class_name;
    LPCTSTR window_name;
    int x, y, width, height;
   
    static LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
    {
        switch( msg )
        {
            case WM_DESTROY:
                //Cleanup();
                PostQuitMessage( 0 );
                return 0;

            case WM_PAINT:
                //Render();
                ValidateRect( hWnd, NULL );
                return 0;
        }

        return DefWindowProc( hWnd, msg, wParam, lParam );
    }
   
    void Init()
    {

        window_class.style=CS_CLASSDC;
        window_class.lpfnWndProc=&MsgProc;
        window_class.cbClsExtra=0L;
        window_class.cbWndExtra=0L;
        window_class.hbrBackground=NULL;
        window_class.hCursor=NULL;
        window_class.hIcon=NULL;
        window_class.hInstance=GetModuleHandle(NULL);
        window_class.lpszClassName=class_name;
        window_class.lpszMenuName=NULL;
       
        RegisterClass( &window_class );
        handle=CreateWindow( class_name, window_name,
                              WS_OVERLAPPEDWINDOW, x, y, width, height,
                              NULL, NULL, window_class.hInstance, NULL );
    }


    void Show()
    {
        ShowWindow(handle, SW_SHOWDEFAULT);
        UpdateWindow(handle);
    }
};

int main()
{
    Window window;
    window.class_name=L"xiu";
    window.window_name=L"pizda";
    window.x=0;
    window.y=0;
    window.height=800;
    window.width=600;
    window.Init();
    window.Show();
    return 0;
}

Скомпилилось и заработало, но окно консоли просто промелькнуло и мгновенно исчезло, но никакого окна не показалось:( Что делать?
11K
15 апреля 2008 года
coolcoder
39 / / 14.08.2006
ОБАНА!!!!! Вставил перед ретурном из мейна слип на 5 секурд и узрел своё окно!!! Но такая фигня, что в теле самого окна находится то, что было под ним на рабочем столе или в других окнах под созданным мной окном. Как это исправить?
87
15 апреля 2008 года
Kogrom
2.7K / / 02.02.2008
Написать что-то типа

window_class.hbrBackground = (HBRUSH)(COLOR_3DSHADOW+1);

И не пишите матом в коде. Потом привыкнете, а оно вылезет в самый неудачный момент при демонстрации проекта заказчику...
11K
15 апреля 2008 года
coolcoder
39 / / 14.08.2006
Спасибо, написал и сработало, но все равно если поверх моего окна окажется другое, то от другого окна остается шлейф, короче, не перерисовывается оно:(
87
15 апреля 2008 года
Kogrom
2.7K / / 02.02.2008
Попробуй доверить системе перерисовку твоего окна, убрав обработку WM_PAINT из MsgProc.
11K
16 апреля 2008 года
coolcoder
39 / / 14.08.2006
Опыты показали, что системе тоже нельзя доверять - эффект тот же самый.
353
21 апреля 2008 года
Nixus
840 / / 04.01.2007
Сделай так:

Код:
void Show()
    {
        MSG Msg;
        ShowWindow(handle, SW_SHOWDEFAULT);
        UpdateWindow(handle);

        while(GetMessage(&Msg, NULL, 0, 0))
        {
            TranslateMessage(&Msg);
            DispatchMessage(&Msg);
        }
    }
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог