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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.09.2005, 15:43   #1  
Maximin is offline
Maximin
NavAx
NavAx Club
 
409 / 341 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
Покрасить фон Аксапты
Короче - для удобства юзверей есть задачка.
Грубо говоря - нужно установить фон окна Аксапты в определенный цвет.
Есть два требования:
1. Должно позволять покрасить две разных одновременно запущенных Акспт в разные цвета.
2. Не должно быть в виде внешней .dll, .ocx и т.д.

P.S. SetSysColors по понятным причинам не катит. Или катит, но как тогда ловить фокус окна?
Старый 08.07.2006, 14:21   #2  
blokva is offline
blokva
Пенсионер
Аватар для blokva
SAP
NavAx Club
 
743 / 167 (7) ++++++
Регистрация: 04.06.2003
Адрес: Беларусь
Меняем стандартную иконку
Возвращаясь к теме по причине того, что периодически возникают проблеммы с "перепутыванием" открытых экземпляров...а это раздражает...оно меня раздражает (с) Жванецкий
Идея и подсказка Maximin, за что большой респект (к сожалению только 1)
дополнительно к методу WinAPI::setClassLong() добавляем метод в WinGDI

PHP код:
#DEFINE.LR_LOADFROMFILE(0x00000010)
#DEFINE.IMAGE_BITMAP (0)
#DEFINE.IMAGE_ICON   (1)
#DEFINE.IMAGE_CURSOR (2)

static int liadImage(str _file)
{
    
DLL             dll;
    
DLLFunction     dllFunction;
    
int             result;
    ;

    
dll = new DLL('user32.dll');
    
dllFunction = new DLLFunction(dll,'LoadImageA');
    
dllFunction.arg(ExtTypes::DWordExtTypes::StringExtTypes::DWordExtTypes::DWordExtTypes::DWordExtTypes::DWord);
    
dllFunction.returns(ExtTypes::DWord);

    
result dllFunction.call(null_file#IMAGE_ICON, 16, 16, #LR_LOADFROMFILE);

    
return result;

оффтоп:немного хардкода правда, но мне простительно

ну и собсно меняем:

PHP код:
static void AxIconChange(Args _args)
{
    
#define.GCL_HICON          (-14)
    #WinAPI

    
int                     icomainwin;
    ;
    
mainwin infolog.hWnd();
    
// например для тестового экземпляра стандартная иконка с большой синей буквой "Т" в центре
    
ico =  WinGDI::liadImage("D:\\222\\AxApplT.ico");
    
    
WinAPI::setClassLong(mainwin#GCL_HICON, ico);

зы: на всякий случай, прикладываю архивчик с измененными стандартными иконками.
ззы: у себя я меняю автоматически при входе в опре деленный экземпляр аксапты путем указания и последующей обработки необходимой команды в поле "Startap Command" в конфигурационной утилиты. Если интересует могу рассказать как.

Добавил скриншотик, как это выглядит в таскбаре, по порядку: тестовая, рабочая, локальная
Миниатюры
Нажмите на изображение для увеличения
Название: Разные иконки.jpg
Просмотров: 599
Размер:	7.8 Кб
ID:	1972  
Вложения
Тип файла: rar AxIcons.RAR (3.8 Кб, 232 просмотров)
__________________
Законы природы еще никто не отменял!
А еще у меня растет 2 внучки!!! Кому интересно подробности тут:
http://www.baby-shine.com/

Последний раз редактировалось blokva; 08.07.2006 в 14:34.
За это сообщение автора поблагодарили: Antant (1).
Старый 10.07.2006, 07:42   #3  
Antant is offline
Antant
Участник
 
82 / 17 (1) ++
Регистрация: 03.12.2005
Пытаюсь поставить свою строку в заголовке окна в начале работы системы - не получается. Происходит какое-то обновление всего окна сразу после загрузки системы. Можете подсказать метод, который вызывается после такого обновления, чтобы название окна не менялось после того, как я его изменю.
__________________
И почему никто меня не любит?
Да, я надоедливый
Старый 10.07.2006, 10:46   #4  
blokva is offline
blokva
Пенсионер
Аватар для blokva
SAP
NavAx Club
 
743 / 167 (7) ++++++
Регистрация: 04.06.2003
Адрес: Беларусь
Цитата:
Сообщение от Antant
Пытаюсь поставить свою строку в заголовке окна в начале работы системы - не получается. Происходит какое-то обновление всего окна сразу после загрузки системы. Можете подсказать метод, который вызывается после такого обновления, чтобы название окна не менялось после того, как я его изменю.
С этим надо дополнительно разбираться, лезть в МСДН, а пока нету времени, может кто-то с ходу знает что и как надо вызывать?
__________________
Законы природы еще никто не отменял!
А еще у меня растет 2 внучки!!! Кому интересно подробности тут:
http://www.baby-shine.com/
Старый 10.07.2006, 11:03   #5  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
\Classes\Info\onEventGoingIdle
X++:
//Event fired by kernel when the client goes idle.
//It is not fired during CTRL-Break dialog.
void onEventGoingIdle()
{
    this.operationProgressClear();
    this.endLengthyOperation(true);
    ///
    if(strLwr(curUserID())!='admin')
        TitleChanger::changeTitle();
}
X++:
static void changeTitle()
{
    #define.WM_SETTEXT(0x000C)
    str         caption;
    str prefix=new Session().AOSName()+": ";
    int  defWindowProc(
                               int              _handle,
                               int              _msg,
                               int              _wParam,
                               str              _lParam )
    {
        int         ret;
        DLL         _DLL             = new DLL('USER32');
        DLLFunction _defwproc        = new DLLFunction(_DLL, 'DefWindowProcA');
        ;

        _defwproc.returns(ExtTypes:: DWord); // LRESULT
        _defwproc.arg(ExtTypes:: DWord);     // handle window
        _defwproc.arg(ExtTypes:: DWord);     // message
        _defwproc.arg(ExtTypes:: DWord);     // wparm
        _defwproc.arg(ExtTypes::String);     // lparm

        return  _defwproc.call(_handle, _msg, _wParam, _lParam);
    }
    ;
    caption = winapi::getWindowText(infolog.hWnd());
    if(!StrUtils::startsWith(caption, prefix))
        defWindowProc(infolog.hWnd(), #WM_SETTEXT, 0, prefix + caption);
}
X++:
// строка _s начинается на _suffix
static boolean startsWith(str _s, str _prefix)
{
    return
        strLen(_s)>=strLen(_prefix)
        &&
        subStr(_s, 1, strLen(_prefix))==_prefix;
}
За это сообщение автора поблагодарили: blokva (1), gl00mie (1), Antant (1), Sergey Petrov (1), kpoxa (0).
Старый 29.07.2010, 12:22   #6  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Штатно в заголовке окна клиента AX 2009 из информации о сервере показывается лишь название хоста AOS'а. Чтобы не заморачиваться с изменением иконок, отображением названия каталога с приложением и проч., захотелось видеть в заголовке название БД (схемы в случае с Oracle). Для Oracle пришлось делать отдельный метод, потому что если задать в настройках AOS некий "общий" TNS, а схему указать отдельно, то я не нашел, как ее выцепить штатными средствами. В общем, решено это все было следующим образом:
\Classes\Info\DEV_setAxWorkspaceTitle
X++:
/// <summary>
///     выставляет более информативный и в то же время лаконичный заголовок окна рабочей области AX
/// </summary>
/// <param name="_hWnd">
///     дескриптор окна рабочей области, для которой нужно поменять заголовок
/// </param>
protected void DEV_setAxWorkspaceTitle( HWND _hWnd = this.hWnd( xInfo::currentWorkspaceNum() ) )
{
    xSession    session;
    str         caption;
    ;
    Debug::assert( _hWnd != 0 );
    session = new xSession();
    caption = strfmt( @"%1 [%2@%3: %4 %5] - [%6 - %7]", "@SYS119901", DEV_getCurrentDatabaseName(), session.AOSName(),
                        "@SYS7115", session.sessionId(), xInfo::currentWorkspaceNum(), curext()
                    );
    WinAPI::setWindowText( _hWnd, caption );
}
\Classes\Global\DEV_getCurrentDatabaseName
X++:
/// <summary>
///     возвращает название текущей базы (MsSQL) или схемы (Oracle)
/// </summary>
/// <returns>
///     название базы/схемы, с которой работает AOS
/// </returns>
/// <exception cref="Exception::Error">
///     выбрасывается, если используемая СУБД - не Ms SQL или Oracle
/// </exception>
public static client server str DEV_getCurrentDatabaseName()
{
    DatabaseId  databaseId;
    str         ret;
    ;
    ret = classFactory.globalCache().get( funcname(), '', '' );
    if (ret == '')
    {
        databaseId = SqlSystem::databaseBackendId();
        switch (databaseId)
        {
            case DatabaseId::Oracle :
                ret = DEV_getCurrentOracleSchemaName();
                break;
            case DatabaseId::MS_Sql_Server :
                ret = new SqlSystem().loginDatabase();
                break;
            default :
                throw error( Error::wrongUseOfFunction( funcname() ) );
        }
        classFactory.globalCache().set( funcname(), '', ret );
    }
    return ret;
}
\Classes\Global\DEV_getCurrentOracleSchemaName
X++:
/// <summary>
///     возвращает название текущей схемы в Oracle, если текущая используемая СУБД - Oracle
/// </summary>
/// <returns>
///     название текущей схемы в Oracle
/// </returns>
public static server str DEV_getCurrentOracleSchemaName()
{
    SqlStatementExecutePermission   sqlStatmPerm;
    str                             sqlStatm;
    Statement                       statement;
    ResultSet                       resultSet;
    str                             ret;
    ;
    Debug::assert( SqlSystem::databaseBackendId() == DatabaseId::Oracle );
    sqlStatm = @"select sys_context( 'userenv', 'current_schema' ) current_schema from dual";
    sqlStatmPerm = new SqlStatementExecutePermission( sqlStatm );
    sqlStatmPerm.assert();
    statement = new Connection().createStatement();
    // BP Deviation Documented
    resultSet = statement.executeQuery( sqlStatm );
    if (resultSet.next())
    {
        ret = resultSet.getString( 1 );
    }
    CodeAccessPermission::revertAssert();
    return ret;
}
Вызов this.DEV_setAxWorkspaceTitle() был добавлен в методы класса Info workspaceWindowCreated() и onEventGoingIdle(). Получилось примерно так:
За это сообщение автора поблагодарили: mazzy (2), raz (5), lev (2), aidsua (2), npokypatop (1).
Теги
ax2009, axapta, download, faq, winapi, база данных, внешний вид, законченный пример, иконка, интерфейс, полезное, фон

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как сильно модифицировано ваше приложение Аксапты? mazzy DAX: Прочие вопросы 30 14.04.2011 17:26
Вставка строк в таблицы Аксапты сторонними средствами Андре DAX: База знаний и проекты 1 07.05.2009 16:49
миграция - в Аксапте и с Аксапты somebody DAX: Программирование 5 18.10.2005 11:06
Как быстро освоить библиотеку классов Аксапты? spartan DAX: Программирование 9 11.05.2005 12:07
Экспорт / импорт Help topics и запуск второй сессии Аксапты из-под себя DmitrySt DAX: Программирование 0 25.11.2004 00:22

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 11:41.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.