Ошибка в управлении лентой?(вызывает отключение в Vista)
-
08-07-2019 - |
Вопрос
Я обнаружил, что когда я беру простую форму, содержащую только ленту и строку состояния, она отключается.Элемент управления, который вы видите над строкой состояния, позже был удален.Одно и то же отключение происходит независимо от наличия элемента управления.Позже я удалил строку состояния и поместил туда вместо нее элемент управления memo с тем же результатом.
без ленточной планки:
(источник: xrw.bc.ca)
с ленточной перекладиной:
(источник: xrw.bc.ca)
я проиллюстрировал это некоторыми рисунками в 2, 4 и 8 пикселях от края.
(источник: xrw.bc.ca)
(источник: xrw.bc.ca)
как говорит Крис Лайвли ниже, явно был допущен просчет с размерами.как я могу это исправить?
Спасибо вам за ваши комментарии!
Решение
Я неправильно понял проблему с моим предыдущим ответом.
У этой проблемы с просчетом есть обходной путь, с которым я смог быстро справиться.
Вы можете использовать собственный обработчик сообщений для WM_SYSCOMMAND с параметром w_Param SC_MAXIMIZE. Затем вы можете изменить размер своей формы, используя следующую информацию:
type
TForm1 = class(TForm)
// other stuff
procedure WMSyscommand(var Msg: TWMSYSCOMMAND); message WM_SYSCOMMAND;
procedure TForm1.WMSysCommand(var Msg: TWMSYSCOMMAND);
var
R: TRect;
begin
// Test for SC_MAXIMIZE. If found...
if Msg.CmdType = SC_MAXIMIZE then
begin
SystemParametersInfo(SPI_GETWORKAREA, 0, @R, 0);
Top := R.Top;
Left := R.Left;
Width := R.Right - R.Left;
Height := R.Bottom - R.Top;
Msg.Result := 0; // Message handled
end
else
DefaultHandler(Msg);
end;
Приведенный выше код (протестирован на Vista 32-bit Home Premium с включенным Aero / Glass) работает нормально.
Другие советы
Решение, предложенное Кеном Уайтом, имеет несколько проблем:
- Кнопка "Развернуть" остается активной, можно использовать маркеры изменения размера в развернутом окне
- Не удалось восстановить окно до прежнего размера.
Поэтому я предлагаю следующее:
// add to form object
procedure WMGetMinMaxInfo(var mmInfo : TWMGETMINMAXINFO); message WM_GETMINMAXINFO;
// implementation
procedure TfrmMain.WMGetMinMaxInfo(var mmInfo: TWMGETMINMAXINFO);
var
R: TRect;
begin
with mmInfo.MinMaxInfo^ do
begin
SystemParametersInfo(SPI_GETWORKAREA, 0, @R, 0);
ptMaxPosition.X := R.Left;
ptMaxPosition.Y := R.Top;
ptMaxSize.X := R.Right - R.Left;
ptMaxSize.Y := R.Bottom - R.Top-1;
end;
end;
Не идеально, так как я должен (по какой-то причине) настроить maxHeight на -1, чтобы обработчик по умолчанию не повторял самоутверждение и не перемещал окно в -8,-8,...Но у меня это работает.