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

Ваш аккаунт

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

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

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

Обработка оконных сообщений

3.2K
19 июля 2005 года
Unregistered
26 / / 22.08.2004
Доброго времени суток!
Помогите плз решить мою траблу...
Создаю класс, в нем объявляю функции в том числе и оконную функцию.При попытке присвоить свойству lpfnWndProc в структуре WNDCLASS метод класса, соответствующий типу WNDPROC, получаю ошибку компилятора (MS VC 7)
"Cannot convert 'overloaded-function to WNDPROC'"

Код:
class MainWndClass
{
...
public:
WNDCLASS wc;
...
bool InitWindow();
LRESULT CALLBACK MainWndProc(...);
};

...

bool MainWndClass::InitWindow
{
...
wc.lpfnWndProc = (WNDPROC)MainWndProc;
...
return true;
}


Помогите плз очень надо!!!
401
19 июля 2005 года
Br@in RIPper
289 / / 15.02.2003
Цитата:
Originally posted by Unregistered
Доброго времени суток!
Помогите плз решить мою траблу...
Создаю класс, в нем объявляю функции в том числе и оконную функцию.При попытке присвоить свойству lpfnWndProc в структуре WNDCLASS метод класса, соответствующий типу WNDPROC, получаю ошибку компилятора (MS VC 7)
"Cannot convert 'overloaded-function to WNDPROC'"

Код:
class MainWndClass
{
...
public:
WNDCLASS wc;
...
bool InitWindow();
LRESULT CALLBACK MainWndProc(...);
};

...

bool MainWndClass::InitWindow
{
...
wc.lpfnWndProc = (WNDPROC)MainWndProc;
...
return true;
}


Помогите плз очень надо!!!




функция обработки оконных сообщений должна быть CALLBACK. глобально ее объявлять надо, а не в классе

LRESULT CALLBACK WindowProc( HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);

406
19 июля 2005 года
vitaly2003s
481 / / 27.07.2004
Объявляй как статик:

class CMyWnd{

public:
static LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg, WPARAM wParam, LPARAM lParam);

};


LRESULT CALLBACK CMyWnd::WindowProc(HWND hwnd,UINT uMsg, WPARAM wParam, LPARAM lParam)
{

return 0;
}
401
19 июля 2005 года
Br@in RIPper
289 / / 15.02.2003
Цитата:
Originally posted by vitaly2003s
Объявляй как статик:

class CMyWnd{

public:
static LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg, WPARAM wParam, LPARAM lParam);

};


LRESULT CALLBACK CMyWnd::WindowProc(HWND hwnd,UINT uMsg, WPARAM wParam, LPARAM lParam)
{

return 0;
}



это точно работает? и указатель this верный?
странно, странно...

406
19 июля 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by Br@in RIPper
это точно работает? и указатель this верный?
странно, странно...



Нет,в таком виде нельзя получить доступ к членам и методам данного класса,хотя можно при создании окна указать указатель на данный класс как доп параметр при создании окна и потом уже его использовать в самом окне,естественно что private и protected члены будут недоступны.
В принципе такой вид аналогичен глобальному WNDPROC с разницей лиш в том что данный метод содержится в классе,вобщем просто для удобства.

401
19 июля 2005 года
Br@in RIPper
289 / / 15.02.2003
Цитата:
Originally posted by vitaly2003s
Нет,в таком виде нельзя получить доступ к членам и методам данного класса,хотя можно при создании окна указать указатель на данный класс как доп параметр при создании окна и потом уже его использовать в самом окне,естественно что private и protected члены будут недоступны.
В принципе такой вид аналогичен глобальному WNDPROC с разницей лиш в том что данный метод содержится в классе,вобщем просто для удобства.



спасибо. я так и думал :)

3
20 июля 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by vitaly2003s
хотя можно при создании окна указать указатель на данный класс как доп параметр при создании окна и потом уже его использовать


На самом деле методов передавать указатель на экземпляр класса множество. Здесь в форуме уже как-то обсуждалось.
Самый остроумный способ реализован в WTL.

Цитата:
Originally posted by vitaly2003s
естественно что private и protected члены будут недоступны.


Здесь ты неправ. Из статических методов есть доступ ко всем остальным членам класса.

Цитата:
Originally posted by vitaly2003s

В принципе такой вид аналогичен глобальному WNDPROC с разницей лиш в том что данный метод содержится в классе,вобщем просто для удобства.


Исходя из предыдущего замечания получается, что не совсем аналогичен.

2.9K
21 июля 2005 года
pushkin
43 / / 13.09.2004
Цитата:
Originally posted by Green

Здесь ты неправ. Из статических методов есть доступ ко всем остальным членам класса.



А как это можно из статического метода класса получить доступ к полями объекта этого класса, не пользуясь указателем на этот объект? Статический метод класса же принадлежит сразу всем объектам этого класса и он "не знает", на каком из объектов он был вызван.

3
21 июля 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by pushkin
А как это можно из статического метода класса получить доступ к полями объекта этого класса, не пользуясь указателем на этот объект? Статический метод класса же принадлежит сразу всем объектам этого класса и он "не знает", на каком из объектов он был вызван.



Ты путаешь два понятия: область видимости и информация об экземпляре.

Информация об экземпляре имеется, ты сам предложил один из способов её получения:

Цитата:

можно при создании окна указать указатель на данный класс как доп параметр при создании окна


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

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог