Размер значков для панели инструментов

Автор Utera, 31.03.12, 12:25:26

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Utera

Здравствуйте.
В последних версиях компаса появилась возможность менять размер кнопок панели инструментов. Появилась и новая функция для определения размеров значков для кнопок - LibraryBmpBeginID.
В SDK есть пример описания функции на Си:


// Получить начало диапазона иконок для команд библиотеки
// ---
unsigned int WINAPI LibraryBmpBeginID( unsigned int bmpSizeType )
{
int res = 0;
switch ( bmpSizeType )
{
case ksBmp1616: res = 1000; break;
case ksBmp2424: res = 2000; break;
}
return res;
}


На Delphi написал:


function LibraryBmpBeginID(bmpSizeType: Integer): Integer; pascal;
begin
  Result := 0;
  case bmpSizeType of
    0: Result := 1000;  // 16x16
    1: Result := 2000;  // 24x24
    2: Result := 3000;  // 32x32
    3: Result := 4000;  // 48x48
  end;
end;

exports
  LibraryBmpBeginID name 'LIBRARYBMPBEGINID', // по образу и подобию
  LibraryEntry name 'LIBRARYENTRY',
  LibraryID name 'LIBRARYID';




В файле ресурсов:


1001 BITMAP "1001.bmp"
2001 BITMAP "2001.bmp"
3001 BITMAP "3001.bmp"
4001 BITMAP "4001.bmp"


Компилируется без ошибок, но значок все время 16х16. Что не так?
Помогите, кто чем может.

Функция предназначена для обеспечения отображения иконок команд библиотеки с размером, соответствующим настройкам интерфейса КОМПАС-3D. Это условие выполняется?
Файлы ресурсов, старые при изменении желательно удалять, среда скомпилирует новые если их нет, а если есть может изменения не внести, есть такой глюк, даже в DELPHI XE2.



PS

Нужно еще учесть что идентификатор ресурса файла bmp должен равняться = идентификатор команды + начало диапазона иконок. В вашем случае  идентификатор ресурса файла bmp 16х16 должен равняться = 1000 + идентификатор команды (в примере он = 1, поэтому идентификатор ресурса = 1001).

Utera

В компасе установил  Размер значков – Единый = 32х32.
Файл ресурсов содержит все значки, но на всякий случай удалил.
Команда в библиотеке всего одна (идентификатор 1). Для этой команды и назначил значки разных размеров.
Компилил в Delphi XE и в Delphi XE2, и ничего.

Сама запись

exports
  LibraryBmpBeginID name 'LIBRARYBMPBEGINID',

правильна?

#4
Вы нигде не указали, как Вы объявляете функцию? Я объявил бы её так:
interface
...
function LibraryBmpBeginID(bmpSizeType:Integer):Integer; pascal; stdcall; export;
...
implementation

Если Вы объявите так, то будет правильно.
exports
  LibraryBmpBeginID name 'LibraryBmpBeginID',

Остальное всё, тоже вроде правильно, а вообще в отладчике функция отрабатывается?

Utera

Я не знаю, как отлаживать такие библиотеки. При попытке запустить отладчик, возникает ошибка "Cannot run project ...".

А полную картинку ошибки, где её полное описание можно?

Utera

На форуме уже обсуждалась возможность отладки библиотек. По-моему ничем хорошим дело не кончилось.
http://forum.ascon.ru/index.php/topic,12930.0.html

Укажите полный путь к Kompas.exe

Utera

Открывается страница CPU с ассемблерным кодом. Там ничего не понять.

Utera

Вставил в функцию глобальную переменную:

function LibraryBmpBeginID(bmpSizeType: Integer): Integer; pascal;
begin
  Saze := 'bmpSizeType';
  Result := 0;
  ...

Вывел значение Saze в Label. После запуска библиотеки, Label чистая. Похоже функция пролетает мимо.

Это ещё не факт, эта функция может быть вызвана раньше, чем создастся Ваша форма.

Utera

Если то же самое сделать в функции получения имени

function LibraryID: UINT; pascal;
begin
  Saze := 'LibraryID';
  Result := 100;
end;

Saze получает нужное значение.

Utera

Странно, но получилось.

LibraryBmpBeginID name 'LIBRARYBMPBEGINID'
заменил на
LibraryBmpBeginID name 'LibraryBmpBeginID'

Значки меняются. Sabahs спасибо за участие.