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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.02.2009, 09:38   #1  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Как вывести форму в верхнем левом углу?
Может тема была уже.
Чё-то не нашёл.
1) Создаю форму пустую.
2) В design->left ставлю Auto (right) или Right edge.
3) Запускаю форму
Результат полное игнорирование.
Ax 3.0
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 09.02.2009, 09:40   #2  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Сори, перепутал. В верхнем правом углу.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 09.02.2009, 12:17   #3  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
? WinAPI - выравнивание вправо
Если других 'человеческих' вариантов не предложат, то можно попробовать 'поиграть' правым выравниваением формы средствами WinAPI.
Алгоритм не сложный: получить размеры клиентской области Ax и размеры текущей формы, после этого выставить координаты формы (formDesign.leftValue) таким образом что бы форма была 'прижата' к правой границе рабочей области Ax.

Обработку можно навесить на метод run():
X++:
public void run()
{
    //  --> FormAlignment
    container   rectCurForm ;
    container   rectAxClient;
    int         formWidth   ;
    int         formLeft    ;
    ;
    //  <-- FormAlignment

    super();

    //  --> FormAlignment
    switch( this.form().design().leftMode() )
    {
        case FormLeft::AutoRight :
        case FormLeft::RightEdge :
            rectCurForm = WinAPI::getWindowRect( this.hWnd() )   ;
            rectAxClient = WinAPI::getClientRect( WinAPI::findWindowEx( infolog.hWnd(), 0, 'MDIClient', '' ) ) ;
            formWidth = conpeek( rectCurForm, 3 ) - conpeek( rectCurForm, 1 ) ;
            formLeft = conpeek( rectAxClient, 3 ) - formWidth ;

            this.design().leftValue( formLeft ) ;
            break ;
    }
    //  <-- FormAlignment
}
В класс WinAPI добавить 'обертки' методов BOOL GetWindowRect( HWND hWnd, LPRECT lpRect ) и BOOL GetClientRect( HWND hWnd, LPRECT lpRect ):
X++:
client static container getWindowRect(HWND _hWnd)
{
    #define.sizeOfRectStruct(16)

    DLL         DLL = new DLL(#UserDLL) ;
    DLLFunction DLLFunction = new DLLFunction(DLL,'GetWindowRect');
    Binary      rect = new Binary( #sizeOfRectStruct );
    ;

    DLLFunction.arg( ExtTypes::DWord, ExtTypes::Pointer ) ;
    DLLFunction.returns( ExtTypes::DWord ) ;

    if( DLLFunction.call( _hWnd, rect ) == 0 )
        return connull() ;

    return [ rect.dWord( #offset0 ), rect.dWord( #offset4 ), rect.dWord( #offset8 ), rect.dWord( #offset12 ) ] ;
}
X++:
client static container getClientRect(HWND _HWND)
{
    #define.sizeOfRectStruct(16)

    DLL         DLL = new DLL(#UserDLL) ;
    DLLFunction DLLFunction = new DLLFunction(DLL,'GetClientRect');
    Binary      rect = new Binary( #sizeOfRectStruct );
    ;

    DLLFunction.arg( ExtTypes::DWord, ExtTypes::Pointer ) ;
    DLLFunction.returns( ExtTypes::DWord ) ;

    if( DLLFunction.call( _hWnd, rect ) == 0 )
        return connull() ;

    return [ rect.dWord( #offset0 ), rect.dWord( #offset4 ), rect.dWord( #offset8 ), rect.dWord( #offset12 ) ] ;
}

P.S. Набросал небольшой проект в качестве демонстрации (Ax 3.0 sp05 fp01 )
Вложения
Тип файла: zip FormAlignment_USR.zip (2.5 Кб, 59 просмотров)

Последний раз редактировалось petergunn; 09.02.2009 в 12:21.
За это сообщение автора поблагодарили: miklenew (2).
Старый 09.02.2009, 12:36   #4  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Ну у меня что-то похожее получилось
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);
}
X++:
int getWidth()
{
    Binary      data            = new Binary(32);
    DLL         _winApiDLL      = new DLL('user32');
    DLLFunction fun  = new DLLFunction(_winApiDLL, 'GetWindowRect');
    container con;
;

    fun.returns(ExtTypes::DWord);

    fun.arg(ExtTypes::DWord, ExtTypes::Pointer);
    fun.call(this.hWnd(), data);
    return data.dWord(8) - data.dWord(0);
}
X++:
public void run()
{
    super();
    this.design().left(this.getRightPointer() - this.getWidth()-4);
}
Всё равно. Как-то грустно это.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 09.02.2009, 13:22   #5  
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 не изменятся - а вот 'рабочая область' будет меньше).
Старый 09.02.2009, 13:53   #6  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от petergunn Посмотреть сообщение
Хм... мне кажется логика getRightPointer() в текущей реализации (использование GetWindowRect вместо GetClientRect) может работать не совсем корректно.
Спасибо за уточнение, но мне для узко-локальной задачи и так пойдёт.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 09.02.2009, 13:22   #7  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
А так не работает? (Ax40sp2)
\Classes\SysSetupFormRun\run:

X++:
public void run()
{
    super();

    //EVO: 09.02.09 #Form move test -->
    WinApi::setWindowPos(this.hWnd(), 0, 0, -1, -1, false, true);
    //EVO: 09.02.09 #Form move test <--
}
Warning: в целях эксперимента сделано глобально для всех форм
Старый 09.02.2009, 13:33   #8  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от DSPIC Посмотреть сообщение
А так не работает? (Ax40sp2)
Спасибо конечно. Но втором сообщение я написал, что перепутал.
Надо не слева, а с права.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Форма RunBase открывается в углу Delfins DAX: Программирование 3 18.01.2008 11:34
как открыть форму в фоном режиме Didar DAX: Программирование 3 12.07.2007 10:02
Как обновить форму, если добавление через кнопку? Arahnid DAX: Программирование 5 21.05.2007 11:18
Можно ли редактировать форму, если на нее наложен addRange? Hans DAX: Программирование 10 22.05.2006 16:35
Проблема - не получается редактировать форму shestakov DAX: Программирование 1 18.12.2001 13:32

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:52.