Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.038 c
14-1094991356
ПЛОВ
2004-09-12 16:15
2004.10.03
Потерялась мыша...


8-1088939465
Alex C
2004-07-04 15:11
2004.10.03
видео


14-1094846423
Думкин
2004-09-11 00:00
2004.10.03
С днем рождения! 11 сентября


3-1094101624
46_55_41_44
2004-09-02 09:07
2004.10.03
Как можно узнать на какую запись в гриде наведена мышь?


4-1093892608
<b>He`KTo</b>
2004-08-30 23:03
2004.10.03
Звук





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский