Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: 2 вопроса по PowerBasic Добавлено: 03.05.05 11:03  

Автор вопроса:  kolyanoid

Ответить

  Ответы Всего ответов: 22  

Номер ответа: 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 и затем только подставляешь его.

Ответить

Номер ответа: 19
Автор ответа:
 kolyanoid



Вопросов: 19
Ответов: 60
 Профиль | | #19 Добавлено: 06.05.05 15:45
Во, пасиба! Теперь LIBMAIN работает :)

УРА_А_А_А_А_А!!!! ПАЛУЧИЛОСЬ! :)
Получилось через лейбл. Через СeateWindowEx - нет :(

Мужики, пардон. Это я стормозил - не догадался лейблу в стиле указать SS_BITMAP (вот идиот! прим. ред.) ^_^

ВСЕМ СПАСИБО! :)

Ответить

Номер ответа: 20
Автор ответа:
 kolyanoid



Вопросов: 19
Ответов: 60
 Профиль | | #20 Добавлено: 07.05.05 00:27
Вот только жаль, что с IMGBUTTON'ом такого фокуса не вышло :(

Ответить

Номер ответа: 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 делается.

Ответить

Номер ответа: 22
Автор ответа:
 kolyanoid



Вопросов: 19
Ответов: 60
 Профиль | | #22 Добавлено: 07.05.05 20:35
Пасиба, HOOLIGAN, но мне уже просто лень гемороиться с ней. Меня не напрягает её отсутствие. И еслиб не багфикс, то я бы сказал, что мой проект завершён :) А доработка - это "до востребования" :) Лучше пойду сделаю редактор и засяду дальше свою игру делать ^_^

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам