Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Может ли оконная функция быть методом класса?


Автор: Деран 16.8.2008, 19:47
Здравствуйте!
Решил написать собственный класс для создания Windows приложения.
При описании оконной функции как метод класса, возникла проблема!
Если оконную фун. описать как обычную, то все работает.
Может ли оконная функция быть методом класса? Или фун. с CALLBACK не должны быть методами?

Вот пример:
Код

//Window.h
#include <windows.h>

#ifndef _WINDOW_H_
#define _WINDOW_H_

class Window
{
public:
    HWND hWindow;
    WNDCLASS WindowClass;
    MSG Message;
    Window(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);
    int Loop();
    LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);
};

#endif


Код

//Window.cpp
#include "Window.h"

Window::Window(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

    WindowClass.style = CS_HREDRAW | CS_VREDRAW;
    WindowClass.lpfnWndProc = WindowFunc;
    WindowClass.cbClsExtra = 0;
    WindowClass.cbWndExtra = 0;
    WindowClass.lpszClassName = TEXT("Window Class");
    WindowClass.hInstance = hInstance;
    WindowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    WindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    WindowClass.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
    WindowClass.lpszMenuName = NULL;

    RegisterClass(&WindowClass);

    hWindow = CreateWindow(TEXT("Window Class"), TEXT("Window Title"), WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

    ShowWindow(hWindow, nCmdShow);
    UpdateWindow(hWindow);
}

LRESULT CALLBACK Window::WindowFunc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

int Window::Loop()
{
    while(GetMessage(&Message, NULL, 0, 0))
    {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }

    return Message.wParam;
}


Код

//main.cpp
#include "Window.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    Window window(hInstance, hPrevInstance, lpCmdLine, nCmdShow);

    int msgwparam;
    msgwparam = window.Loop();

    return msgwparam;
}


Компилятор выдает следующие ошибки:
'Window::WindowFunc': function call missing argument list; use '&Window::WindowFunc' to create a pointer to member
'=' : cannot convert from 'LRESULT (__stdcall Window::* )(HWND,UINT,WPARAM,LPARAM)' to 'WNDPROC'


поменял как было предложено:
Код

...
WindowClass.lpfnWndProc = &Window::WindowFunc;
...


Осталась вторая ошибка, но она мне не очень понятна!

Автор: volvo877 16.8.2008, 20:07
Цитата(Деран @  16.8.2008,  19:47 Найти цитируемый пост)
Может ли оконная функция быть методом класса?

Может... Только static-методом: http://www.codeproject.com/KB/winsdk/win32windowwrapperclass.aspx

Автор: Dem_max 17.8.2008, 06:55
Вот исходники, бери исходник ElcnU http://forum.sources.ru/index.php?showtopic=159560

Автор: jonie 17.8.2008, 10:19
если кому будет интересно то я когда-то писал такое (см аттач.).
проще не куда уже .. все окна должны просто наследоваться от CWinWrap
при необходимости перегрузить WindowProc()
в ней 
Код

LRESULT CHookTrapWindow::WindowProc(HWND hwnd, UINT msg,
                   WPARAM wParam, LPARAM lParam, PBOOL pbProcessed)
{
    switch(msg) {
        HANDLE_MSG(hwnd,WM_CREATE, OnCreate);

        default:
            *pbProcessed = FALSE;    //not processed
    }
    *pbProcessed = TRUE;    //Yes, message was processed.
    return DefWindowProc(hwnd, msg, wParam, lParam);
}

думаю все понятно.... вроде есть пара незначительных бажков... так что смотрите)

Автор: Деран 20.8.2008, 16:11
Спасибо всем за подсказки и ссылки.

Вывод:
Код

class Window
{
public:
    ...
    static LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);
    ...
};

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)