Страница: 1 | 2 |
|
Вопрос: 2 вопроса по PowerBasic
|
Добавлено: 03.05.05 11:03
|
|
Номер ответа: 16 Автор ответа: HOOLIGAN
Вопросов: 0 Ответов: 1066
|
Профиль | | #16
|
Добавлено: 05.05.05 19:43
|
А-а-а-а-а-а!!!
Что за dll делаешь?
Как называться будет функция, которая пойдет на экспорт, какие параметры она принимает, что должна сделать?
Я так понимаю, в dll должен быть передан
а)hWnd окна, для которого нужно сделать дочерний контрол.
б)hInstance приложения
в)имя файла .bmp, который надо отобразить.
Это так?
Или кроме самого статика нужно ещё и его родителя делать тоже из dll?
Ответить
|
Номер ответа: 17 Автор ответа: kolyanoid
Вопросов: 19 Ответов: 60
|
Профиль | | #17
|
Добавлено: 06.05.05 10:40
|
Что за dll делаешь? ДЛЛ для построения и работы с GUI'ем. Просто когда делаешь нормальную игру, без ркедактора уровней никак не обойдёшься, а DarkBasic, на котором игра делается, не обладает возможностями создания и управления окнами и контролами. А делать редактор уровней прямо из-под ДБ - для меня всегда было нечтом вроде мазахизма, я уже не говорю об ограниченности "контролов" (с минимумом гемороя можно только кнопку сделать)
Вот эта ДЛЛ и призвана исправить брешь в ДБ
Как называться будет функция, которая пойдет на экспорт, какие параметры она принимает, что должна сделать? Функция будет называться CREATE_IMGBOX (в верхнем регистре). Она должна ОБЯЗАТЕЛЬНО быть экспортной, иначе ДБ вылетит, когда её вызовет.
Принимает параметры (ID&,X&,Y&,W&,H,ImgFile$) Т.е. Номер этого контрола, положение на окне, длинна, высота, путь к файлу с картинкой, которая задаётся этому IMGBOX'у задаётся.
Я так понимаю, в dll должен быть передан
а)hWnd окна, для которого нужно сделать дочерний контрол.
б)hInstance приложения
в)имя файла .bmp, который надо отобразить.
Это так?
Не. hWnd я беру в самой ДЛЛе. Он у меня хранится в массиве. В этом массиве хранятся хэндлы родительских контролов для каждого контрола. В нём же под индексом 0 хранится хэндл окна. hInstance у меня нет, и я не знаю откуда его взять (из DB точно нельзя).
Или кроме самого статика нужно ещё и его родителя делать тоже из dll? Эм. Родителем для него может быть только TAB-контрол. Но по умолчанию любой контрол создаётся сначала на окне, а потом, если надо, его можно запихать в TAB-контрол. Для этого у меня есть отдельная функция, котрая работает (основана на АПИшном SetParent).
Чтоб проще было представить, что я делаю, вот старый скрин:
http://www.kolyanoid.mail333.com/awm.jpg
Сейчас я продвинулся ГОРАЗДО дальше. Контролов поддерживается куча, не только кнопка, фрейм, лэйбл и текстовое поле, как на скрине (скрин совсем старый).
Всё, что на этом скрине - результат работы этой ДЛЛки. Справа окно с повёрнутым кубом - это уже окно DarkBasic'а, запиханого туда SetParent'ом.
Ответить
|
Номер ответа: 18 Автор ответа: HOOLIGAN
Вопросов: 0 Ответов: 1066
|
Профиль | | #18
|
Добавлено: 06.05.05 12:25
|
Код, что тебе не понравился необязательно повторять весь, создавая окно и затем статик. Возьми оттуда только создание самого статика и посылку ему сообщения STM_SETIMAGE. Можно в качестве родителя указать ему NULL, а затем после создания, установить ему родителя через SetParent.
hInstance можно получить в LIBMAIN (как и в WinMain, это один из входных параметров). Получить и запомнить где-нибудь в переменной.
То, что у тебя не работает с LIBMAIN - возможно неправильно реагируешь на сообщения %DLL_PROCESS_ATTACH.
FUNCTION LIBMAIN (BYVAL hInstance AS LONG, _
BYVAL fwdReason AS LONG, _
BYVAL lpvReserved AS LONG) AS LONG
SELECT CASE fwdReason
CASE %DLL_PROCESS_ATTACH
ghInstance = hInstance 'запомнили
FUNCTION = 1 'success!-обязательно нужно вернуть 1.
LIBMAIN вызывается Виндой при загрузке DLL. При первом вызове сохранил hInstance и затем только подставляешь его.
Ответить
|
Номер ответа: 21 Автор ответа: HOOLIGAN
Вопросов: 0 Ответов: 1066
|
Профиль | | #21
|
Добавлено: 07.05.05 01:43
|
c IMGBUTTON можно поступить иначе. Примерно таким образом:
1. Создать окно, зарегистрировав для него класс (это и будет кнопка)
2. Написать ему оконную процедуру, в которой будут обрабатываться сообщения WM_PAINT, WM_LBUTTONUP, WM_LBUTTONDOWN
3. По WM_PAINT рисовать рамку вокруг кнопки (для этого есть API-функции, которые рисуют такого рода рамки) и на кнопке же нарисовать рисунок, который она должна отображать.
4. По WM_LBUTTONUP и WM_LBUTTONDOWN рисовать соответственно рамку, изображающую отжатое и нажатое состояние кнопки.
Можно попробовать сделать несколько иначе: создать из PB IMGBUTTON, и дальше сабклассинг, перенаправить сообщения для кнопки в отдельную callback-процедуру и опять же обрабатывать три сообщения. Рамку кнопки можно поручить винде, пусть сама рисует, а рисунок сам отрисуешь на DC кнопки.
Всё это в dll делается.
Ответить
|
Страница: 1 | 2 |
Поиск по форуму