|
09.02.2009, 09:38 | #1 |
Участник
|
Как вывести форму в верхнем левом углу?
Может тема была уже.
Чё-то не нашёл. 1) Создаю форму пустую. 2) В design->left ставлю Auto (right) или Right edge. 3) Запускаю форму Результат полное игнорирование. Ax 3.0
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
09.02.2009, 09:40 | #2 |
Участник
|
Сори, перепутал. В верхнем правом углу.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
09.02.2009, 12:17 | #3 |
Участник
|
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 } 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 ) Последний раз редактировалось petergunn; 09.02.2009 в 12:21. |
|
|
За это сообщение автора поблагодарили: miklenew (2). |
09.02.2009, 12:36 | #4 |
Участник
|
Ну у меня что-то похожее получилось
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 |
Участник
|
Мелкие штрихи
Цитата:
Сообщение от 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 момента на которые обратил внимание:
|
|
09.02.2009, 13:53 | #6 |
Участник
|
Спасибо за уточнение, но мне для узко-локальной задачи и так пойдёт.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
09.02.2009, 13:22 | #7 |
Боец
|
А так не работает? (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 <-- } |
|
09.02.2009, 13:33 | #8 |
Участник
|
Спасибо конечно. Но втором сообщение я написал, что перепутал.
Надо не слева, а с права.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|