-
Задача: написать визуальный компонент (), видимую область которого можно прокручивать его собственными скроллбарами.
Пояснения: компонент наследуется от TCustomControl'a, обладает свойством Align.
Вопрос: Что нужно сделать, чтобы у компонента появились виндузовские скроллбары? Есть мнение, что это свойство наследуется от WinControl'a, но не открыто...и что копать к тому же надо в сторону WinApi...
Очень хочется или подробного комментария, или не менее полезную ссылку. Заранее большое спасибо всем отклинувшимся.
-
> копать к тому же надо в сторону WinApi...
эт правильно. Нужно в CreateParams добавить два стилевых флага: WM_HSCROLL и WM_VSCROLL.
-
> Нужно в CreateParams добавить два стилевых флага
Это как-то так? procedure TMyComponent.CreateParams(var Params: TCreateParams);
begin
Params.Style := WM_HSCROLL;
end; Ругается, что параметр задан не верно... Не подскажите синтаксис установки параметров?
-
Эх... Никада не делал этого раньше... Я про CreateParams только слышал. Ваще мой тебе совет переходи на АПИ. А с этим погоди ща разберёмся.
-
Удалено модератором
-
> Тфу ёшкинсвет, не WM_, а WS_ !!!!!!!!!!! Прости великодушно. > ..
Круто! Заработало! Но чуточку не так, как я ожидал... Теперь мой компонент - отдельное окно... летает себе... но скролл появился!
И чего это он выпал из контейнера...
Отделение произошло из-за чего? Что не так с Controls'ами?
-
Разобрался! Вернул на место. Люди, не повторяйте моих ошибок! Свойство Params.Style задается в предке, не стоит его полностью изменять, если в этом нет нужды.
Полная картина выглядит так:
procedure TMyComponent.CreateParams(var Params: TCreateParams); begin inherited; Params.Style := Params.Style + WS_HSCROLL + WS_VSCROLL; end;
Dib@zol © - отдельное спасибо!
-
Дело вот в этом. Изини, тож забыл :) Params.Style := Params.Style + WM_HSCROLL;
-
> Люди, не повторяйте моих ошибок!
Уже повторили :) Надо ж блин, как совпало ;)
-
А вариант с WinApi как бы выглядел?
-
var ScrollHWND:HWND; WP : Pointer;
...
ScrollHWND:=CreateWindow(0, 'STATIC', '', WS_VISIBLE or WS_CHILD or WS_HSCROLL or WS_VSCROLL, 1, 1, 300, 300, Parent, 0, HInstance, nil); longInt(WP):=SetWindowLong(ScrollHWND, GWL_WNDPROC, LongInt(@NewWndProc));
Где Parent - хендл родительского окна. NewWndProc нужно?
-
> NewWndProc нужно?
Да!
-
function NewWndProc(hWnd : HWND; Msg, WParam, LParam : LongInt) : LongInt; stdcall; begin Result:=0; case Msg of
WM_COMMAND: begin // Здесь принимаются сообщения от дочерних контролов end;
WM_CTLCOLOR*: begin // Ответственные за перерисовку (WM_CTLCOLORSTATIC, WM_CTLCOLOREDIT итп) end;
// Да мало ли чего ещё сюда можно напихать! :) Эти - просто примеры.
else Result:=CallWindowProc(WP, hWnd, Msg, WParam, LParam); end; end;
-
Огромный Тенкс!!!!
Я думаю, что тема прикрыта, но не закрыта...
-
> EG (20.07.07 20:32) [13]
Ну, раз тема не закрыта, то предложу еще одно решение - взять стандартный TScrollBox.
:о)
-
> Юрий Зотов © (21.07.07 11:57) [14]
> Задача: написать визуальный компонент
-
> [15] Dib@zol © (21.07.07 12:17) > > > Юрий Зотов © (21.07.07 11:57) [14] > > > Задача: написать визуальный компонент
Зачем его писать, если он уже написан? :)
> EG Чем твоя задача отличается от [14]? Хотя может.... тогда уже наследуйся от него(TScrollBox)...или его предка (скролингвиндов)... имхо. Зачем с нуля "велик" делать?
-
> Dib@zol © (21.07.07 12:17) [15]
Довольно часто ЗАДАЧА возникает лишь по причине незнания того, что она уже давно ЗАДАЧЕЙ вовсе не является. :о)
-
Удалено модератором
-
> Dib@zol © (21.07.07 14:05) [18]
Один человек спросил у другого, где можно купить сигарет. Тот ответил, что их можно купить в магазине, который находится в 5 километрах.
А другой человек сказал, что такой же магазин находится за углом, в 50 метрах. И тогда первый человек возразил: "Ну так или иначе, я поццказал".
И ведь действительно подсказал. Но лучше бы он этого не делал.
|