Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.03;
Скачать: CL | DM;

Вниз

Оконная процедура и класс   Найти похожие ветки 

 
RagE ©   (2004-08-20 09:27) [0]

Добрый день всем. Я вот вчера пробовал написать класс который будет на WinAPI окошко создавать и обрабатывать сообщения. Так вот столькнулся со следующей проблемой. Помещаю функцию WndProc внутрь класса, при заполнении структуры WNDCLASS компилятор кричит что ему нужна переменная. Кто нибудь сталкивался с таким? И вообще возможно ли это реализовать. Пробовал искать в исходниках делфийских форм но нифига не понял. Вернее не нашел где есть подобный момент.


 
Digitman ©   (2004-08-20 09:33) [1]


> Помещаю функцию WndProc внутрь класса


это как ? поясни кодом ...


> при заполнении структуры WNDCLASS компилятор кричит что
> ему нужна переменная


если кричит, дай ему переменную)... все равно не отстанет

а еще лучше приведи сюда свой проблемный код ..


 
KSergey ©   (2004-08-20 09:40) [2]

Да, для запихавния в класс оконной процедуры надо попотеть. Штука в том, что при вызове любого метода из любого класса ему неявно передается указатель на экземпляр объекта. Понятно, что ни о каких экземплярах никаких объектов никакая виндовс не знает.

Насколько я понимаю, фактически всегда получается, что делается некая универсальная единая процедура (все класса), которая собственно и привязывается всем окнам. Связь окон и экземпляров объектов обеспечивается либо внешними структурами, либо через приписывание доп. параметров виндовому окну при создании экземпляра. А уже из этой общей процедуры вызывается метод соотв. экземпляра объекта, связанного с данным окном.


 
jack128 ©   (2004-08-20 09:44) [3]


> Помещаю функцию WndProc внутрь класса
>
>
> это как ? поясни кодом ...
ИМХО, имелось ввиду, что WinProc - метод..


> при заполнении структуры WNDCLASS компилятор кричит что
>
> > ему нужна переменная
Там суть в том, что у тя WinProc - метод, то есть процедура, в которую первым неявным параметром передается Self. У тя список параметров в WinProc будт отличаться от необходимого.. Если WinProc обязательно должна быть методом, то см в сторону MakeObjectInstance.. И вообще в сторону TWinControl/TCustomForm , там все это уже делалось..


 
Digitman ©   (2004-08-20 09:51) [4]


> jack128 ©   (20.08.04 09:44) [3]


> имелось ввиду, что WinProc - метод


из авторского описания это вовсе не очевидно
но, думаю, автор действительно не видит и/или не понимает разницы между просто функцией и функциональным методом класса


 
RagE ©   (2004-08-20 10:59) [5]

KSergey ©   (20.08.04 09:40) [2]
По такому пути и пришлось идти
jack128 ©   (20.08.04 09:44) [3]
в исходники смотрел но так нифига и не понял, не нашел я там места где это реализовано, может конечно плохо искал.
Digitman ©   (20.08.04 09:51) [4]
в том то и дело что до конца не понимаю.


 
KSergey ©   (2004-08-20 11:13) [6]

> [4] Digitman ©   (20.08.04 09:51)
> > имелось ввиду, что WinProc - метод
> из авторского описания это вовсе не очевидно

Разве???

> RagE ©   (20.08.04 09:27)
> Помещаю функцию
> WndProc внутрь класса


 
Digitman ©   (2004-08-20 11:29) [7]


> KSergey ©   (20.08.04 11:13) [6]


> Разве???


а мне вот не очевидно, под этой фразой можно понимать все что угодно, к тому же в эту кашу попадает упоминание WNDCLASS и посему непонятно, о каком классе идет речь - то ли о классе окна то ли о собственном создаваемом классе


> RagE ©   (20.08.04 10:59) [5]


ты бы посмотрел для начала внимательно, как это реализовано в ф-ции AllocateHWND() у самого Борланда и сделал бы собственную реализацию по образу и подобию, почерпнув из борландовской реализации только самые необходимые ключевые моменты во всей этой петрушке


 
RagE ©   (2004-08-20 12:53) [8]

Digitman ©   (20.08.04 11:29) [7]
Cпасибо за наводку. Буду смотреть


 
Darthman ©   (2004-08-20 15:47) [9]

Прочитал ветку, но проблему так и не понял.


 
RagE ©   (2004-08-20 16:03) [10]

Darthman ©   (20.08.04 15:47) [9]
Все проблемы больше нет. помог makeobjectinstance. Хотя он же породил проблему увеличения бинарника.


 
Darthman ©   (2004-08-20 16:09) [11]

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


 
Digitman ©   (2004-08-20 16:15) [12]


> RagE ©   (20.08.04 16:03) [10]


ну если ты его "один в один" содрал, со всеми зависимостями, то - конечно)

тады и вся затея твоя выеденного яйца не стоит, если  тянешь за собой те же самые стандартные модули


 
jack128 ©   (2004-08-20 17:40) [13]

на вскидку такая идея:
Для каждого виндового оконного класса можно аллокировать дополнительную память (при регистрации класса - WNDCLASS.cbClsExtra) - запиши в эту память адрес твоего метода. А для каждого окна можно создать атом и записать в него твой объект, ассоциированный с этим окном (как в VCL ControlAtom). Соответственно в оконной процедуре ты видираешь адрес метода и объект и вызываешь этот метод..


 
RagE ©   (2004-08-20 18:53) [14]

jack128 ©   (20.08.04 17:40) [13]
Да вобщем такая затея наверное никчему. Обойдусь расположением WinProc как обычной функции вне класса.



Страницы: 1 вся ветка

Текущий архив: 2004.10.03;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.024 c
1-1095246863
Razer
2004-09-15 15:14
2004.10.03
Поддержка тегов в RichEdit/RxRichEdit


6-1088974260
Квэнди
2004-07-05 00:51
2004.10.03
Копирование файлов


4-1093120848
Getsevich
2004-08-22 00:40
2004.10.03
Закрытие процесса


6-1091011983
Nikolay
2004-07-28 14:53
2004.10.03
Передача буфера большего чем ~270kb


1-1095147167
denisww
2004-09-14 11:32
2004.10.03
Вопрос по ListView