Создание TPageControl, плоского в Delphi 7

Когда мышь присоединена, можно предположить с довольно высокой скоростью (я бы сказал, практически 100%), что пользователь перемещает мышь по крайней мере на небольшое расстояние после того, как страница готова - без какого-либо щелчка. Механизм ниже обнаруживает это. В случае обнаружения я рассматриваю это как признак отсутствия поддержки касания или, если поддерживается, незначительной важности при использовании мыши. Предполагается, что сенсорное устройство не обнаружено.

РЕДАКТИРОВАТЬ Этот подход может не подходить для всех целей. Он может использоваться для управления функциональностью, которая активируется на основе взаимодействия с пользователем на загруженной странице, например, в программе просмотра изображений. Приведенный ниже код также оставит событие mousemove привязанным к устройствам без мыши, как сейчас. Другие подходы могут быть лучше.

Грубо говоря, это выглядит так (извините за jQuery, но похоже на чистый Javascript):

var mousedown, first, second = false;
var ticks = 10;
$(document).on('mousemove', (function(e) {
    if(UI.mousechecked) return;
    if(!first) {
        first = e.pageX;
        return;
        }
    if(!second && ticks-- === 0) {
        second = e.pageX;
        $(document).off('mousemove'); // or bind it to somewhat else
        }
    if(first  && second  && first !== second && !mousedown){
        // set whatever flags you want
        UI.hasmouse = true;
        UI.touch = false;
        UI.mousechecked = true;
    }

    return;
}));
$(document).one('mousedown', (function(e) {
    mousedown = true;
    return;
}));
$(document).one('mouseup', (function(e) {
    mousedown = false;
    return;
}));
8
задан Jim McKeeth 26 June 2009 в 21:44
поделиться

2 ответа

Когда вкладки нарисованы как кнопки, граница вокруг области отображения не рисуется, поэтому установите для свойства Стиль значение tsButtons или tsFlatButtons . (Для программистов, не использующих VCL, это эквивалентно включению стиля окна tcs_Buttons в элемент управления вкладками.)

Альтернативой является использование TNotebook . Он держит страницы, но совсем не рисует. Вам нужно будет предоставить вкладки самостоятельно, например, установив высоту элемента управления вкладкой, равную высоте вкладок, или используя TTabSet . ( TTabSet доступен в Delphi 2005; я не уверен насчет Delphi 7.)

Что касается кода, который вы нашли, было бы полезно, если бы вы указали, почему он не компилируется, или если вы дал ссылку на то, где вы это нашли, поскольку я полагаю, что ошибка компиляции была связана с тем, что она относится к полям или свойствам пользовательского класса, а не стандартного. Вот что вы можете попробовать вставить в свой собственный код, не создавая собственный элемент управления.

Создайте два новых объявления в своей форме следующим образом:

FOldTabProc: TWndMethod;
procedure TabWndProc(var Msg: TMessage);

В форме OnCreate обработчик событий, назначьте этот метод свойству WindowProc элемента управления страницы:

FOldTabProc := PageControl1.WindowProc;
PageControl1.WindowProc := TabWndProc;

Теперь реализуйте этот метод и обработайте сообщение tcm_AdjustRect :

procedure TForm1.TabWndProc(var Msg: TMessage);
begin
  FOldTabProc(Msg);
  if Msg.Msg = tcm_AdjustRect then begin
    case PageControl1.TabPosition of
      tpTop: begin
        PRect(Msg.LParam)^.Left := 0;
        PRect(Msg.LParam)^.Right := PageControl1.ClientWidth;
        Dec(PRect(Msg.LParam)^.Top, 4);
        PRect(Msg.LParam)^.Bottom := PageControl1.ClientHeight;
      end;
    end;
  end;
end;

Вы можете заполнить другое три случая, если они вам нужны. Tcm_AdjustRect - это идентификатор сообщения, объявленный в модуле CommCtrl . Если у вас нет этого сообщения в этом блоке, заявите об этом сами; его значение 4904.

Я подозреваю, что это не так. t остановить рисование границ элементом управления. Скорее, это приводит к тому, что содержащийся в нем TTabSheet становится немного больше и закрывает границы.

12
ответ дан 5 December 2019 в 11:26
поделиться

You could always use a commercial solution. I would strongly recommend Raize components, which support flat TPageControls with tabs. The component set is very easy to work with, and supports numerous visual enhancements which in my opinion give a better feel to any application.

screen shot of tTPageControl with flat borders
(source: raize.com)

2
ответ дан 5 December 2019 в 11:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: