Показать сообщение отдельно
Старый 09.02.2009, 13:22   #6  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
Мелкие штрихи
Цитата:
Сообщение от miklenew Посмотреть сообщение
Ну у меня что-то похожее получилось
X++:
int getRightPointer()
{
    Binary      data            = new Binary(32);
    DLL         _winApiDLL      = new DLL('user32');
    DLLFunction fun  = new DLLFunction(_winApiDLL, 'GetWindowRect');
;

    fun.returns(ExtTypes::DWord);

    fun.arg(ExtTypes::DWord, ExtTypes::Pointer);
    fun.call(infolog.hWnd(), data);

    return data.dWord(8);
}

Хм... мне кажется логика getRightPointer() в текущей реализации (использование GetWindowRect вместо GetClientRect) может работать не совсем корректно.
2 момента на которые обратил внимание:
  1. GetWindowRect() дает координаты окна относительно экрана в виде [left, top, right, bottom] - data.dWord(8) = right возвратит правую координату окна по горизонтали, а не ширину его. Если Ax открыта не в режиме 'на весь экран' (SW_MAXIMIZE), то открываемая форма должна уйти за правую границу рабочей области Ax - ровно на растояние от левого края экрана до левой границы Ax.
  2. Если имеются открытые окна с правой стыковкой (окно свойств, например) - то это тоже повлияет правое выравнивание (координаты и размеры окна Ax не изменятся - а вот 'рабочая область' будет меньше).