AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
DAX
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.12.2014, 15:12   #1  
Totlant is offline
Totlant
Участник
 
1 / 10 (1) +
Регистрация: 22.10.2013
balloon тултип
Добрый день!
Не работал раньше с DLL-ками, но тут возникла задача сделать всплывающую подсказку а-ля balloon.
Для собственно создания использую createWindowEx, для задания атрибутов sendMessage, для управления окном использую структуру toolInfo http://msdn.microsoft.com/ru-ru/libr...(v=vs.85).aspx
Заранее извиняюсь за кол-во кода, но не знаю, в чем именно может быть ошибка

X++:
    DLL             DLL             = new DLL('User32');
    DLLFunction     createWindowEx  = new DLLFunction(DLL, 'CreateWindowExA');
    Binary          packedText,
                    auxBinary,
                    toolInfo,
                    lpszText,
                    rect;

    str             text;

    int             hwnd;
    int             res;
    boolean         boolRes;
    int             address;

    #WinApi
    #define.WM_USER(0x0400)
    #define.TTM_SETTITLE(#WM_USER + 33)
    #define.TTS_NOPREFIX(0x02)
    #define.TTS_BALLOON(0x40)
    #define.TTS_ALWAYSTIP(0x01)
    #define.TTF_SUBCLASS(0x0010)
    #define.TTF_TRANSPARENT(0x0100)
    #define.TTM_ADDTOOL(#WM_USER + 50)
    ;

    createWindowEx.returns(ExtTypes::DWord);    // hwnd окна
    createWindowEx.arg(ExtTypes::DWord,         // dwExStyle
                       ExtTypes::String,        // lpClassName
                       ExtTypes::String,        // lpWindowName
                       ExtTypes::DWord,         // dwStyle
                       ExtTypes::DWord,         // x
                       ExtTypes::DWord,         // y
                       ExtTypes::DWord,         // nWidth
                       ExtTypes::DWord,         // nHeight
                       ExtTypes::DWord,         // hWndParent
                       ExtTypes::DWord,         // hMenu
                       ExtTypes::DWord,         // hInstance
                       ExtTypes::DWord);        // lpParam

    hwnd    = createWindowEx.call(0,                    
                                  'tooltips_class32',   //lpClassName
                                  '',
                                  #WS_POPUP | #TTS_BALLOON | #TTS_NOPREFIX | #TTS_ALWAYSTIP, // dwStyle
                                  10, 10, 200, 200,     // положение окна
                                  infolog.hWnd(),       // hWndParent
                                  0,
                                  0,
                                  0);

    boolRes = WinApi::setWindowText(hwnd, text);    // возвращает true

// --> оборачиваю toolInfo в Binary
    text        = 'TestMessageHere';
    lpszText    = new Binary(strlen(text) + 1);
    lpszText.string(0, text);

    rect        = new Binary(16);   // rect - положение
    rect.dWord(0, 10);
    rect.dWord(4, 10);
    rect.dWord(8, 500);
    rect.dWord(12, 400);

    toolInfo    = new Binary(32);
    toolInfo.dWord(0, 32);                                  // cbSize
    toolInfo.dWord(4, #TTF_SUBCLASS | #TTF_TRANSPARENT);    // uFlag
    toolInfo.dWord(8, hwnd);                                // hwnd
    toolInfo.dWord(12, 0);                                  // uId
    toolInfo.binary(16, rect);                              // rect
    toolInfo.dWord(20, 0);                                  // hInst
    toolInfo.binary(24, lpszText);                          // lpszText
    toolInfo.dWord(28, 0);                                  // lparam
// <--

// получаю адрес для скармливания sendMessage
    auxBinary   = new Binary(4);
    auxBinary.binary(0, toolInfo);
    address     = auxBinary.dWord(0);

// возвращает true, но положения окна не меняет, надпись не отображает, 
//т.е. отрабатывает как-то криво
    res = WinApi::sendMessageEx(hwnd, #TTM_ADDTOOL, 0, address);

// --> пытаюсь задать caption
    text    = 'SimpleCaption';
    packedText  = new Binary(strlen(text) + 1);
    packedText.string(0, text);

    auxBinary   = new Binary(4);
    auxBinary.binary(0, packedText);
    address     = auxBinary.dWord(0);

// так же true, но никаких визуальных изменений нет
    res = WinApi::sendMessageEx(hwnd, #TTM_SETTITLE, 0, address);

    WinApi::showWindow(hwnd, 1);
    WinApi::updateWindow(hwnd);
В результате получаю едва заметное прозрачное окно без каких либо признаков успешности попыток изменения свойств.
Изменения цвета и прочие методы также не дают результата.
Подозреваю, что неправильно оперирую с Binary.

Axapta 3.0 SP3, система XP professional SP3
Старый 05.12.2014, 09:53   #2  
Player1 is offline
Player1
Участник
Самостоятельные клиенты AX
 
305 / 137 (5) +++++
Регистрация: 21.04.2008
Всплывающее окно
За это сообщение автора поблагодарили: Totlant (1).
Теги
balloon, dllfunction

 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 04:40.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.