resize RIbbon

Автор Тема: resize RIbbon  (Прочитано 10156 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн begizАвтор темы

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
resize RIbbon
« : 08-12-2020, 22:38:04 »
Доброго времени суток, коллеги
не много работал с Ribbons, но появилось пожелание добавить пару динамических combobox в Ribbon
с этим справился, всё хорошо.

проблема пришла от куда не ждал.
на Ribbon куча кнопок, они все видны и даже когда я добавляю свои combobox на высоком разрешении проблем нет.
Но если разрешение монитора меньше чем сколько то, то часть кнопок "уежает/скрывается" за гранью окна
Если изначально резолюция маленькая, то автокад непомещающиеся кнопки сворачивает в PullButton (так вроде называется)

Вопрос: как заставить автокад пересчитать размер Ribbon и свернуть крайние?
код на managed c++, но думаю и вариант на c# подойдет.

если это не тот раздел, и нужно пост перенести на .net, то заранее извиняюсь

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: resize RIbbon
« Ответ #1 : 08-12-2020, 23:47:37 »
Первое, что пришло в голову ResizeControl()
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн begizАвтор темы

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Re: resize RIbbon
« Ответ #2 : 08-12-2020, 23:56:46 »
Так что не быть совсем не в теме.
Ribbon это WPF контрол или что?
ResizeControl на RibbonTab или RibbonMenu?
Завтра оба варианта попробую

Отмечено как Решение begiz 09-12-2020, 09:42:09

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: resize RIbbon
« Ответ #3 : 09-12-2020, 00:12:10 »
Думаю, что как-то так:
Код - C# [Выбрать]
  1. Autodesk.AutoCAD.Ribbon.RibbonPaletteSet rps = Autodesk.AutoCAD.Ribbon.RibbonServices.CreateRibbonPaletteSet();
  2. rps.ResizeControl();
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн begizАвтор темы

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Re: resize RIbbon
« Ответ #4 : 09-12-2020, 09:42:03 »
вот спасибо! всё как надо!
понадобилось только AcWindows.dll добавить

Код - C++ [Выбрать]
  1. #using <AcWindows.dll>
  2. /////////
  3. Autodesk::AutoCAD::Ribbon::RibbonPaletteSet ^ rps = Autodesk::AutoCAD::Ribbon::RibbonServices::CreateRibbonPaletteSet();
  4. rps->ResizeControl();
  5.  

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: resize RIbbon
« Ответ #5 : 09-12-2020, 11:18:54 »
begiz,
Ну значит в очередной раз сработала моя интуиция.  :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн begizАвтор темы

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Re: resize RIbbon
« Ответ #6 : 09-12-2020, 21:36:14 »
нашел видимо специальную функцию для этого дела. RecalculateDockSiteLayout
нашел случайно, проект идет под версии 2010-2021 и в версиях <= 2012 ResizeControl() отсутствует, либо обявлена private

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: resize RIbbon
« Ответ #7 : 09-12-2020, 21:41:26 »
begiz,
Исходник метода ResizeControl(). Обрати внимание, что в конце  он вызывает именно RecalculateDockSiteLayout():

Код - C# [Выбрать]
  1. // Autodesk.AutoCAD.Ribbon.RibbonPaletteSet
  2. using System;
  3. using System.Windows;
  4. using System.Windows.Controls;
  5. using Autodesk.AutoCAD.Windows;
  6. using Autodesk.Internal.Windows;
  7.  
  8. public void ResizeControl()
  9. {
  10.         if (RibbonControl.RibbonOrientation == Orientation.Horizontal)
  11.         {
  12.                 Size deviceIndependentSize = DeviceIndependentSize;
  13.                 deviceIndependentSize.Height = RibbonControl.ActualHeight + ((DocumentSwitchControl != null && DocumentSwitchControl.Visibility == Visibility.Visible) ? DocumentSwitchControl.Height : 0.0);
  14.                 DeviceIndependentSize = deviceIndependentSize;
  15.         }
  16.         else if (base.Dock != 0)
  17.         {
  18.                 if ((base.Style & PaletteSetStyles.SingleColDock) == 0)
  19.                 {
  20.                         if (RibbonControl.AutoHideMode == RibbonAutoHideMode.None)
  21.                         {
  22.                                 RibbonControl.Width = DeviceIndependentSize.Width;
  23.                         }
  24.                         else
  25.                         {
  26.                                 RibbonControl.Width = double.NaN;
  27.                         }
  28.                         return;
  29.                 }
  30.                 if (RibbonControl.AutoHideMode != 0)
  31.                 {
  32.                         RibbonControl.Width = double.NaN;
  33.                 }
  34.                 Size deviceIndependentSize2 = DeviceIndependentSize;
  35.                 if (RibbonControl.AutoHideMode != 0)
  36.                 {
  37.                         deviceIndependentSize2.Width = RibbonControl.ActualWidth;
  38.                         if (mDockedOriginalSize.Width == 0.0)
  39.                         {
  40.                                 mDockedOriginalSize = DeviceIndependentSize;
  41.                         }
  42.                 }
  43.                 else
  44.                 {
  45.                         if (mDockedOriginalSize.Width != 0.0)
  46.                         {
  47.                                 deviceIndependentSize2.Width = mDockedOriginalSize.Width;
  48.                         }
  49.                         mDockedOriginalSize.Width = 0.0;
  50.                 }
  51.                 DeviceIndependentSize = deviceIndependentSize2;
  52.         }
  53.         else
  54.         {
  55.                 Size deviceIndependentSize3 = DeviceIndependentSize;
  56.                 deviceIndependentSize3.Width = Math.Max(deviceIndependentSize3.Width - base.PaletteSize.Width, 0.0);
  57.                 deviceIndependentSize3.Height = Math.Max(deviceIndependentSize3.Height - base.PaletteSize.Height, 0.0);
  58.                 if (RibbonControl.AutoHideMode != 0)
  59.                 {
  60.                         RibbonControl.Width = double.NaN;
  61.                         RibbonControl.InvalidateVisual();
  62.                 }
  63.                 Size deviceIndependentSize4 = DeviceIndependentSize;
  64.                 if (RibbonControl.AutoHideMode != 0)
  65.                 {
  66.                         deviceIndependentSize4.Width = RibbonControl.ActualWidth + deviceIndependentSize3.Width;
  67.                         if (mOriginalSize.Width == 0.0)
  68.                         {
  69.                                 mOriginalSize = DeviceIndependentSize;
  70.                         }
  71.                 }
  72.                 else
  73.                 {
  74.                         if (mOriginalSize.Width != 0.0)
  75.                         {
  76.                                 deviceIndependentSize4.Width = mOriginalSize.Width;
  77.                         }
  78.                         mOriginalSize.Width = 0.0;
  79.                 }
  80.                 DeviceIndependentSize = deviceIndependentSize4;
  81.         }
  82.         if (base.Dock != 0)
  83.         {
  84.                 base.Dock = base.DockEnabled;
  85.         }
  86.         RecalculateDockSiteLayout();
  87. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн begizАвтор темы

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Re: resize RIbbon
« Ответ #8 : 09-12-2020, 22:09:38 »
так так так....
ваше предложение?
для версий 2010-2012 вызывать RecalculateDockSiteLayout, а для 2013+ вызывать ResizeControl?
как правельней?
хотя RecalculateDockSiteLayout вроде как работает на всех версиях как надо...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: resize RIbbon
« Ответ #9 : 09-12-2020, 22:29:41 »
хотя RecalculateDockSiteLayout вроде как работает на всех версиях как надо...
Я привёл код просто к тому, что просматривая библиотеки, перед тем как ответить на твой вопрос, наткнулся на ResizeControl, и увидел что в конечном итоге она вызывает RecalculateDockSiteLayout. Так как проверять мне было не на чем, то я предложил более общую функцию, а ты сам нашел более частную. Так что если она работает как надо, то пользуйся ей. Если работает правильно, то зачем менять?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн begizАвтор темы

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Re: resize RIbbon
« Ответ #10 : 09-12-2020, 22:31:07 »
Цитировать
Если работает правильно, то зачем менять?

логично :)