Как получить сторону прикрепления PaletteSet.Dock? Выдает все 4 стороны сразу...

Автор Тема: Как получить сторону прикрепления PaletteSet.Dock? Выдает все 4 стороны сразу...  (Прочитано 6805 раз)

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

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

  • ADN OPEN
  • Сообщений: 2
  • Карма: 0
Помогите, пожалуйста, получить значение стороны прикрепления палитры.
Код - C# [Выбрать]
  1. _paletteSet.Dock = DockSides.Left; //Строчка работает нормально, палитра прикрепляется на левую сторону экрана.
  2. Config.Data.DockSideAddBlock = (int)_paletteSet.Dock; //Значение = 61440, что соответствует сумме всех 4 направлений из перечисления DockSides, а должно быть = 4096, если я все правильно понимаю...

Пробовал выдрать значение стороны таким образом, но тогда условие по if  не выполняется...
Код - C# [Выбрать]
  1. if (_paletteSet.Dock == DockSides.Right)
  2. {
  3.       Config.Data.DockSideAddBlock = "Right";
  4. }
  5. if (_paletteSet.Dock == DockSides.Left)
  6. {
  7.        Config.Data.DockSideAddBlock = "Left";
  8. }

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
_paletteSet.Dock = DockSides.Left; //Строчка работает нормально, палитра прикрепляется на левую сторону экрана.
Config.Data.DockSideAddBlock = (int)_paletteSet.Dock; //Значение = 61440, что соответствует сумме всех 4 направлений из перечисления DockSides, а должно быть = 4096, если я все правильно понимаю...
Если посмотреть при помощи ILSpy свойство Dock, то именно так оно и работает, т.е. не указывает к какой стороне прикреплено, а к каким сторонам может быть прикреплено:
Код - C# [Выбрать]
  1. // Acmgd, Version=24.1.0.0, Culture=neutral, PublicKeyToken=null
  2. // Autodesk.AutoCAD.Windows.PaletteSet
  3. using System;
  4. using System.Runtime.CompilerServices;
  5.  
  6. public unsafe DockSides Dock
  7. {
  8.    get
  9.    {
  10.       return (global::<Module>.CAdUiDockControlBar.IsFloating((global::CAdUiDockControlBar*)GetImpObj()) == 0) ? (DockSides.Left | DockSides.Top | DockSides.Right | DockSides.Bottom) : DockSides.None;
  11.    }
  12.    set
  13.    {
  14.       //IL_0029: Expected I, but got I8
  15.       System.Runtime.CompilerServices.Unsafe.SkipInit(out global::CRect cRect);
  16.       *(int*)(&cRect) = 0;
  17.       System.Runtime.CompilerServices.Unsafe.As<global::CRect, int>(ref System.Runtime.CompilerServices.Unsafe.AddByteOffset(ref cRect, 4)) = 0;
  18.       System.Runtime.CompilerServices.Unsafe.As<global::CRect, int>(ref System.Runtime.CompilerServices.Unsafe.AddByteOffset(ref cRect,) = 0;
  19.       System.Runtime.CompilerServices.Unsafe.As<global::CRect, int>(ref System.Runtime.CompilerServices.Unsafe.AddByteOffset(ref cRect, 12)) = 0;
  20.       global::<Module>.GetWindowRect((HWND__*)(*(ulong*)((long)(IntPtr)GetImpObj() + 64)), (global::tagRECT*)(&cRect));
  21.       if ((value & (DockSides.Left | DockSides.Top | DockSides.Right | DockSides.Bottom)) != 0)
  22.       {
  23.          uint num = 0u;
  24.          switch (value)
  25.          {
  26.          case DockSides.Bottom:
  27.             num = 59422u;
  28.             break;
  29.          case DockSides.Right:
  30.             num = 59421u;
  31.             break;
  32.          case DockSides.Top:
  33.             num = 59419u;
  34.             break;
  35.          case DockSides.Left:
  36.             num = 59420u;
  37.             break;
  38.          }
  39.          global::<Module>.CAdUiDockControlBar.DockControlBar((global::CAdUiDockControlBar*)GetImpObj(), num, (global::tagRECT*)(&cRect));
  40.       }
  41.       else
  42.       {
  43.          global::<Module>.Autodesk.AutoCAD.Windows.AcMgPaletteSet.FloatControlBar(GetImpObj());
  44.       }
  45.    }
  46. }
  47.  
В ObjectARX есть метод CAdUiDockControlBar::GetDockStyle, который позволяет узнать допустимые значения:

Value

Meaning

0

No flags - the control bar will not dock

CBRS_ALIGN_TOP

Allows docking at the top of the client area

CBRS_ALIGN_BOTTOM

Allows docking at the bottom of the client area

CBRS_ALIGN_LEFT

Allows docking on the left side of the client area

CBRS_ALIGN_RIGHT

Allows docking on the right side of the client area

CBRS_ALIGN_ANY

Allows docking on any side of the client area

CBRS_FLOAT_MULTI

Allows multiple control bars to be floated in a single mini-frame window
В .NET я такого не нашел.

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 2
  • Карма: 0
Спасибо за участие! Коллективными усилиями с помощью костылей удалось-таки определить местоположение панели и вернуть его при повторном открытии.
Код - C# [Выбрать]
  1.         private static float GetCurrentDpiScaleFactor()
  2.         {
  3.             using (var graphics = Graphics.FromHwnd(IntPtr.Zero))
  4.             {
  5.                 return graphics.DpiX / 96.0f;  // 96 DPI = 100% масштабирование
  6.             }
  7.         }
  8.  
  9.         [System.Runtime.InteropServices.DllImport("user32.dll")]
  10.         [return: System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)]
  11.         public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
  12.         public struct RECT
  13.         {
  14.             public int Left;
  15.             public int Top;
  16.             public int Right;
  17.             public int Bottom;
  18.         }
  19.  
  20.         public static System.Drawing.Point GetRealLocation(IntPtr handle)
  21.         {
  22.             return GetWindowRect(handle, out var rect) ? new System.Drawing.Point(rect.Left, rect.Top) : System.Drawing.Point.Empty;
  23.         }
  24.        
  25.         public static DockSides DetermineDockSide(PaletteSet palette)
  26.         {
  27.             GetWindowRect(Application.MainWindow.Handle, out var mainWinRect);
  28.             GetWindowRect(palette.Handle, out var paletteRect);
  29.             // Проверка координат для определения стороны
  30.             if (paletteRect.Left - mainWinRect.Left < 100)
  31.                 return DockSides.Left;
  32.             return DockSides.Right;
  33.         }