Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Может ли оконная функция быть методом класса? LRESULT CALLBACK WindowFunc(...); 
V
    Опции темы
Деран
  Дата 16.8.2008, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 17.7.2008

Репутация: нет
Всего: 1



Здравствуйте!
Решил написать собственный класс для создания 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;
...


Осталась вторая ошибка, но она мне не очень понятна!
PM   Вверх
volvo877
Дата 16.8.2008, 20:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: нет
Всего: 116



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

Может... Только static-методом: http://www.codeproject.com/KB/winsdk/win32...apperclass.aspx
PM MAIL   Вверх
Dem_max
Дата 17.8.2008, 06:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Вот исходники, бери исходник ElcnU  GUI на API (библиотека), Очередной велосипед



--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
jonie
Дата 17.8.2008, 10:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



если кому будет интересно то я когда-то писал такое (см аттач.).
проще не куда уже .. все окна должны просто наследоваться от 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);
}

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

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  wndProc.rar 1,47 Kb


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Деран
Дата 20.8.2008, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 17.7.2008

Репутация: нет
Всего: 1



Спасибо всем за подсказки и ссылки.

Вывод:
Код

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

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0442 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.