Показать сообщение отдельно
Старый 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 Кб, 64 просмотров)

Последний раз редактировалось petergunn; 09.02.2009 в 12:21.
За это сообщение автора поблагодарили: miklenew (2).