Добрый день!
Не работал раньше с 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