04.12.2014, 15:12 | #1 |
Участник
|
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 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: Totlant (1). |