Импорт winapi

  1. 2 г. назад
    2 г. назад исправил Виталий

    Здравствуйте. Мне очень нравится monkey, но я заметил, что у него нет полей ввода. Мне нужно создать поле ввода TextBox, которое будет вызываться на клик мыши в новом окне. Я сделал нечто подобное с MessageBox используя luser32:
    #CC_OPTS += "-static -lUser32"

    Import "funcs.cpp"

    Extern

    Function MessageBox:Int(hwnd:Int, x:CString, y:CString, type:Int) = "MessageBoxA"
    Function ToCString:CString(str:String)

    Class CString Abstract
    End

    Public

    В funcs.cpp записано:

    #define ToCString(_1) (_1).ToCString<char>()

    Все работает с MessageBox.

    Пытался подобным образом создать TextBox с помощью функции CreateWindow, но не выходит. Подскажите, пожалуйста, как это сделать? И верен ли сам подход вообще?

  2. devolonter

    4 Mar 2015 Администратор

    Приветствую. Не советую мешать WinAPI с GLFW и Monkey, проблем больше чем профита.

    Во-первых, сборщик мусора будет удалять указатели, если не задать специальный флаг: #CPP_GC_MODE=2, но в этом случае производительность игры пострадает.
    Во-вторых очень сложно будет отловить события в другом окне и передать все это обратно в приложение Monkey.
    В-третьих - это не кроссплатформенно, даже в пределах одного таргета.

    Проще взять модуль игрового GUI. Например, Jungle GUI или какой-нибудь другой.

    Если все же хочется помучаться, можешь посмотреть модуль wxMonkey . Это не WinAPI, но попытка прикрутить нативный UI к Monkey

  3. 2 г. назад исправил Виталий

    Понятно. Тогда такой вопрос. Есть dll написанная на Delphi для Blitz3D и файл decls, декларирующий функции, как можно подключить её в c++, чтобы оттуда декларировать функции из библиотеки в Monkey, или подключить dll к Monkey, если это возможно?

    Просто от меня требуют решить этот вопрос через декстопное окошко, а не с помощью модулей GUI для Monkey.

  4. 2 г. назад удалено Виталий
  5. devolonter

    5 Mar 2015 Администратор

    Подключить dll можно. Могу описать как я делал это с curl, но только с MinGW.
    Имеем: заголовочные файлы, собранные библиотеки, a. или .lib файлы.

    Изменяем gcc_winnt/Makefile следующим образом:
    - к строке CPPFLAGS добавляем -I../curl/include (относительный путь к заголовочным файлам).

    CPPFLAGS=$(CCOPTS) -I../glfw/include -I../glfw/lib -I../glfw/lib/win32 -I../openal/include -I../stb -I../curl/include

    - к LDFLAGS добавляем путь к .a или .lib файлам

    LDFLAGS=-Wl,--subsystem,windows -L../openal/libs/Win32 -L../curl/lib/Win32

    - ну и в завершении добавляем библиотеку в используемые:

    LDLIBS=-lopengl32 -lOpenAL32 -lws2_32 -lcurldll

    После этого в нативном коде импортируем заголовочный файл и используем функции в Monkey или через обертку.

  6. Спасибо!) Уже сделал через обертку, но все равно спасибо, интересный подход :)

или зарегистрируйтесь чтобы комментировать!