Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Адрес функии / 10 сообщений из 10, страница 1 из 1
01.04.2004, 13:08
    #32465399
pacman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Адрес функии
Привет.
Мне неоходимо передать указатель на фукцию в качестве параметра фунции
SetWindowLongA(Handle(this),-4,/*указатель на функцию*/ MyFunctionProc);
Я объявил функцию MyFunctionProc
Но не знаю как получить ее адрес или указатель на нее.
Речь идет о Subclassing a Window и мне нужно перехватить некоторое сообщение родителя для этого надо получить адрес функции DefProc заменить ее на свою а затем вызвать снова родную.
Может кто-нибудь знает как получить указатель на функцию или event ?
Спасибо !
...
Рейтинг: 0 / 0
01.04.2004, 13:47
    #32465499
gerss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Адрес функии
В PowerBuilder в принципе нет указателей. То, что ты хочешь, сделать невозможно. Именно поэтому мне приходилось писать dll с помощью других средств (Delphi) - для реализации функций, требующих работы с указателями.
...
Рейтинг: 0 / 0
01.04.2004, 14:41
    #32465632
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Адрес функии
Если у тебя PB9, то напиши wrapper на С++ и через PBNI вызывай твою ф-ю на PbScript.
...
Рейтинг: 0 / 0
01.04.2004, 20:21
    #32466201
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Адрес функии
Pacman, может поточнее напишешь, что именно ты хочешь сделать. Как тут правильно заметили, адресов функций и callbackов в РВ нет.
Теоретически можно сделать Subclassing имея экспортированную функцию в DLLе, которая зовётся в Open eventе окна и ей передается handle окна. Она в свою очередь зовёт
Код: plaintext
SetWindowLong(hWnd, GWL_WNDPROC, (DWORD) SubClassFunc)
, SubClassFunc же живёт в DLLе.

Судя по автормне нужно перехватить некоторое сообщение родителя, может быть можно сделать проще - через other event, messaging API и т.д. и т.п.
...
Рейтинг: 0 / 0
02.04.2004, 11:25
    #32466735
pac1man
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Адрес функии
Вариант с отдельной dll( на другом языке) которая поможет сделать то что надо мне нравится.

Раз уж мир не не без добрых людей на этом форуме, то разрешите немного подробнее описать проблему.
Пишу на BP7.
Все началось с того что я захотел просто немного видоизменить стандартный button. Сделать что то типа Flat.
Создал новый объект наследуемый от commandbutton.Затем согласно тому что я понял из MSDN , для того что бы рисовать его самому, изменил style в консрукторе
Код: plaintext
SetWindowLongA( Handle(this), GWL_STYLE,GetWindowLongA(Handle(this),GWL_STYLE )+ BS_OWNERDRAW )
В этом случае я отвечаю за дальнейшую прорисовку кнопки.
И здесь я задумался, а как же я поймаю сообщение
WM_DRAWITEM
This message is sent to the owner window of an owner-drawn button or menu when a visual aspect of the button or menu has changed.
( но и это еще не все)
Мой класс этого сообщения не получает , его получает владелец.
Согласно логике надо что бы вся реализация находилась в одном классе.( Кнопка должна быт универсальной , кинул на форму и все).
С этой проблемой я справился просто, написал всю прорисовку кнопки в событии pbm_paint(все отлично рисуется , кнопка получилась просто прелесть)
А затем я подумал а что если кнопка должна быть Default or Cancel( т.е. в случае если она лежит на форме с неким sle (editbox) то при нажатии Enter
должен сработать click event.
И тут я столкнулся вот с чем если Установить свойство Default =true
то кнопка получит стиль BS_DEFPUSHBUTTON соответственно , а MSDN пишет

Do not combine the BS_OWNERDRAW style with any other button styles.

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

Хотя на этот вопрос я кажется нашел ответ.
Извините что так много пишу.
В момент когда в sle жмем Enter ...
An application sends a DM_GETDEFID message to retrieve the identifier of the default push button control for a dialog box.

и происходит вот что...

If a default push button exists, the high-order word of the return value contains the value DC_HASDEFID and the low-order word contains the control identifier. Otherwise, the return value is zero.

Если поймать это сообщение то тогда я могу обмануть и вернуть идентификатор той кнопки которой я пожелаю.Поверив если моя переменная MyDefault =true
А для того что бы поймать это и другие сообщения владельца я должен получить указатель на функцию WindowDefaultProc( функция обработки сообщений)
Затем присвоить этому указателю адрес своей функции обработать что что мне надо и вызвать родную его, предварительно запомнив ее где-то.

Как быть ?
Спасибо за внимание
...
Рейтинг: 0 / 0
02.04.2004, 15:14
    #32467236
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Адрес функии
авторКак быть ?
Оставьте все как есть. Неужели так часто в PB вы рисуете формочки с кнопками и editbox-ами ? По любому весь основной интерфейс реализуется через DataWindow, всякие кнопки и edit-ы чисто вспомогательное средство и так мучаться по моему явно не стоит. Тем более что вместо flat-кнопкок можно спокойно организовать Toolbar. Плюс приложение PB можно переключить на XP схему, просто создав манифест или поставив соотвествующую галочку в PB9. Хотя опять же по XP-шному будут только стандартные контролсы выглядеть, DataWindow по любому будет рисоваться сам.

Так что зря Вы затеялись, PB не тот язык, чтобы универсальные компоненты катать. Я не сомневаюсь, что в конце концов и на нем можно сделать что хочешь, но кроме геммора и просто огромной кучи багов ничего больше не получится. Лучше все таки использовать PB по назначению :)
...
Рейтинг: 0 / 0
02.04.2004, 18:08
    #32467624
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Адрес функии
Вот тебе Flat Button

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
$PBExportHeader$u_cbflat.sru
forward
global type u_cbflat from commandbutton
end type
end forward

global type u_cbflat from commandbutton
integer width =  402 
integer height =  112 
integer textsize = - 10 
integer weight =  400 
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename =  "Arial" 
string text =  "Flat?" 
end type
global u_cbflat u_cbflat

type prototypes
Function long GetWindowLongA (long hWindow, integer nIndex) Library 
 "user32.dll" 
Function long SetWindowLongA (long hWindow, integer nIndex, long dwNewLong) 
Library  "user32.dll" 

end prototypes

type variables
CONSTANT LONG BS_FLAT =  32768 
CONSTANT int GWL_STYLE  = - 16 

end variables

on u_cbflat.create
end on

on u_cbflat.destroy
end on

event constructor;ulong ll_style
ll_style = GetWindowLongA(handle(this), GWL_STYLE)

IF ll_style <>  0  THEN 
        SetWindowLongA(handle(this), GWL_STYLE, ll_style +  BS_FLAT) 
END IF

end event
...
Рейтинг: 0 / 0
05.04.2004, 10:50
    #32468642
pac1man
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Адрес функии
Спасибо.
Про BS_FLAT я и не подумал.

А как же быть с цветом? Например если я хочу надпись на кнопке вывести красным.Или Background color изменить.
...
Рейтинг: 0 / 0
05.04.2004, 18:32
    #32469621
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Адрес функии
авторА как же быть с цветом? Например если я хочу надпись на кнопке вывести красным.Или Background color изменить.Ну, собственно для этого существует UserObject Panter, что значительно проще чем упражнения с ownerdrawn controls :-) .

Вот пример (не очень универсальный) того как делать ownerdrawn combobox без PB9 и PBNI
http://www.xs4all.nl/~onkie/pbtip020.html

Вот пример того как делать Custom-drawn ListView and TreeView Controls с PB9 и PBNI
http://powerbuilder.codexchange.sybase.com/files/documents/67/1127/CustomDrawDemo.zip
...
Рейтинг: 0 / 0
05.04.2004, 18:33
    #32469623
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Адрес функии
... и вдогонку - Custom draw button using MFC and PBNI
http://powerbuilder.codexchange.sybase.com/files/documents/67/837/visualpbni.zip
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Адрес функии / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]