AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen Alle Foren als gelesen markieren

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 09.02.2009, 09:38   #1  
miklenew ist offline
miklenew
Участник
Benutzerbild von miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1.688 / 438 (18) +++++++
Registriert seit: 10.07.2006
Ort: г. Ликино-Дулёво
Как вывести форму в верхнем левом углу?
Может тема была уже.
Чё-то не нашёл.
1) Создаю форму пустую.
2) В design->left ставлю Auto (right) или Right edge.
3) Запускаю форму
Результат полное игнорирование.
Ax 3.0
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Alt 09.02.2009, 09:40   #2  
miklenew ist offline
miklenew
Участник
Benutzerbild von miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1.688 / 438 (18) +++++++
Registriert seit: 10.07.2006
Ort: г. Ликино-Дулёво
Сори, перепутал. В верхнем правом углу.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Alt 09.02.2009, 12:17   #3  
petergunn ist offline
petergunn
Участник
 
118 / 279 (10) ++++++
Registriert seit: 30.08.2005
Ort: 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 )
Angehängte Dateien
Dateityp: zip FormAlignment_USR.zip (2,5 KB, 67x aufgerufen)

Geändert von petergunn (09.02.2009 um 12:21 Uhr)
This post has been rated by: miklenew (2).
Alt 09.02.2009, 12:36   #4  
miklenew ist offline
miklenew
Участник
Benutzerbild von miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1.688 / 438 (18) +++++++
Registriert seit: 10.07.2006
Ort: г. Ликино-Дулёво
Ну у меня что-то похожее получилось
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);
}
Всё равно. Как-то грустно это.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Alt 09.02.2009, 13:22   #5  
DSPIC ist offline
DSPIC
Боец
 
1.077 / 1243 (44) ++++++++
Registriert seit: 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: в целях эксперимента сделано глобально для всех форм
Alt 09.02.2009, 13:22   #6  
petergunn ist offline
petergunn
Участник
 
118 / 279 (10) ++++++
Registriert seit: 30.08.2005
Ort: Tyumen
Мелкие штрихи
Zitat:
Zitat von miklenew Beitrag anzeigen
Ну у меня что-то похожее получилось
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 не изменятся - а вот 'рабочая область' будет меньше).
Alt 09.02.2009, 13:33   #7  
miklenew ist offline
miklenew
Участник
Benutzerbild von miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1.688 / 438 (18) +++++++
Registriert seit: 10.07.2006
Ort: г. Ликино-Дулёво
Zitat:
Zitat von DSPIC Beitrag anzeigen
А так не работает? (Ax40sp2)
Спасибо конечно. Но втором сообщение я написал, что перепутал.
Надо не слева, а с права.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Alt 09.02.2009, 13:53   #8  
miklenew ist offline
miklenew
Участник
Benutzerbild von miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1.688 / 438 (18) +++++++
Registriert seit: 10.07.2006
Ort: г. Ликино-Дулёво
Zitat:
Zitat von petergunn Beitrag anzeigen
Хм... мне кажется логика getRightPointer() в текущей реализации (использование GetWindowRect вместо GetClientRect) может работать не совсем корректно.
Спасибо за уточнение, но мне для узко-локальной задачи и так пойдёт.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Форма 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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 13:59 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.