Форум: "Начинающим";
Текущий архив: 2011.01.09;
Скачать: [xml.tar.bz2];
ВнизИспользование нестандартных форм. Скины для программы Найти похожие ветки
← →
v_a_belousov (2010-10-11 19:08) [0]Здравствуйте! Заранее извиняюсь, если данный вопрос уже поднимался! В интернете видел много вопросов на форумах типа "Как сделать скины как в winamp" и т.д. Хочу написать программу которая также будет использовать скины. В данный момент есть программа, которая использует стандартные компоненты delphi... то есть менять вид формы за счет использования сторонних компонентов не вариант... создание "формы по картинке" оказалось не актуально так как в местах где картинка все красиво, а там где компоненты delphi все довольно серо(на фоне картинки)... решил сделать скины в своем приложении следующим образом:
Написать свой редактор скинов, который создает скин файл(в нем находится картинка, по которой форма обрезается и которая накладывается на форму, указаны координаты объектов создаваемых динамически(TBevel) которые прозрачны и выполняют функции объектов которые есть на форме изначально(но при применении скина все объекты становятся невидимыми кроме TBevel)).
Планирую, что редактор скинов и сама программа будут использовать мою библиотеку dll в которой есть функции сохранения, загрузки и применения скинов.
Описал все как смог. Вопрос в том корректно ли делать скины таким образом? И если поймете каким образом я планирую использовать TBevel корректно ли использовать их таким образом? Или возможно посоветуете какой-то другой способ создания скинов для программы?
← →
Игорь Шевченко © (2010-10-11 19:50) [1]почему бы не посмотреть, как уже сделано до тебя (тыщи их, библиотек скинов)
← →
v_a_belousov (2010-10-11 20:21) [2]Смотрел! Вроде все не то было. Мне ведь нужно чтобы форма была сделана по картинке(обрезана в нужных местах и т.д.). Элементы определенным образом настроены были. Или к примеру при наведении на определенную часть изображения оно светилось(и это в зависимости от скина). Сейчас скачиваю ещё разные. Посмотрю может что подойдет. А может не то ищу...
← →
DiamondShark © (2010-10-13 10:39) [3]
> Или возможно посоветуете какой-то другой способ создания
> скинов для программы?
Самый лучший способ создания скинов для программы -- это использование системной схемы, установленной юзером.
Глюкоморгалки фтопку.
← →
antonn © (2010-10-13 13:33) [4]какая недалекость...
← →
QAZ (2010-10-13 14:06) [5]Удалено модератором
← →
v_a_belousov (2010-10-13 14:30) [6]Удалено модератором
← →
v_a_belousov (2010-10-17 13:40) [7]Написал процедуру перетаскивания формы без заголовка. Назначается динамически создаваемой форме следующий WindowProc
//перенос формы без заголовка
function MDragDrop(Handle: HWND; Msg, WParam, LParam: LongInt): LongInt; stdcall;
begin
//Проверим, был ли щелчок мыши над областью формы
if Msg=WM_NCHITTEST then
begin
//перенаправляем щелчок на заголовок
Result := CallWindowProc(OldMDragDrop, Handle, WM_NCLBUTTONDOWN, HTCAPTION, LParam); end
else begin
//не перенаправляем
Result := CallWindowProc(OldMDragDrop, Handle, Msg, WParam, LParam);
end;
end;
Форма переносится, но при щелчке мыши она немного прыгает в сторону. По идее проверка должна быть не на WM_NCHITTEST а на WM_LBUTTONDOWN но тогда событие никогда не наступает.
← →
v_a_belousov (2010-10-17 13:42) [8]Извиняюсь. Вместо WM_LBUTTONDOWN в коде написал WM_NCLBUTTONDOWN
← →
v_a_belousov (2010-10-17 13:43) [9]Теперь все переносится нормально.
← →
Юрий Зотов © (2010-10-17 15:19) [10]Это проще делается, в самой форме:
procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest);
begin
inherited;
if Msg.Result = HTCLIENT then
Msg.Result := HTCAPTION
end;
Только сдается мне, что Вы упорно продолжаете идти все тем же кривым путем проб и ошибок. Впрочем, это дело Ваше.
← →
v_a_belousov (2010-10-17 22:40) [11]
> Только сдается мне, что Вы упорно продолжаете идти все тем
> же кривым путем проб и ошибок. Впрочем, это дело Ваше.
Нет, исправляюсь.
> Это проще делается, в самой форме:
Форма создается динамически, поэтому и ставлю на WindowProc
------------------------------------------------------------------
И вот такой вопрос есть. Пишу класс TPRSBSkin. Пытаюсь создать в нем функцию добавляющую новый регион:
//добавляет новый регион
procedure TPRSBSkin.AddRegion(Region: TPRSBSRegion);
//переменные
var num: integer;
begin
//
num := Length(FSkinRegions);
//
SetLength(FSkinRegions, num+1);
//
FSkinRegions[num] := TPRSBSRegion.Create;
//
FSkinRegions[num].Name := Region.Name;
FSkinRegions[num].Region := Region.Region;
FSkinRegions[num].RegionType := Region.RegionType;
FSkinRegions[num].Control := Region.Control;
FSkinRegions[num].PutPoints(Region.Points);
end;
Но на SetLength(FSkinRegions, num+1); в run-time выдает ошибку EAccessViolation В чем причина не понимаю.
type // Описание типа регионов скина
TPRSBSRegions = array of TPRSBSRegion; // массив регионов
type // Класс TPRSBSkin
TPRSBSkin = class
protected
{ Protected declaration }
constructor Create;
private
{ Private declaration }
FSkinName: ShortString; // имя скина
FSkinRegions: TPRSBSRegions; // массив регионов
..........................................................................
Подскажите пожалуйста может надо как-то по другому задавать размер массива?
← →
sniknik © (2010-10-17 23:54) [12]> Нет, исправляюсь.
нет не исправляешься
>> Это проще делается, в самой форме:
> Форма создается динамически, поэтому и ставлю на WindowProc
что мешает создавать динамически форму своего типа, с уже описанным событием? раз уж приспичило динамически... (вообще то по идее это как раз таки и не нужно).
> EAccessViolation В чем причина не понимаю.
объекта нет.
> может надо как-то по другому задавать размер массива?
какая разница садиться в автобус в переднюю дверь или заднюю, или в окно, или даже прыгать на него с парашютом, если автобуса НЕТ?
← →
v_a_belousov (2010-10-18 00:23) [13]
> объекта нет.
Хорошо, но как его может не быть... или лучше спросить как сделать так чтобы он был?
← →
v_a_belousov (2010-10-18 00:54) [14]Проблему решил вот так
type // Описание типа регионов скина
TPRSBSRegions = class
public
TPRSBSRegions: array of TPRSBSRegion; // массив регионов
end;
Но хотел бы узнать почему не получается с
type // Описание типа регионов скина
TPRSBSRegions = array of TPRSBSRegion; // массив регионов
← →
v_a_belousov (2010-10-18 00:58) [15]А впрочем извиняюсь. Конструктор ведь был в protected у меня. Вот и вся причина.
← →
sniknik © (2010-10-18 00:59) [16]> Хорошо, но как его может не быть...
тебе видней, у тебя программа целиком, а не несвязанные кусочки в которых все по отдельности нормально, у тебя есть кнопки F7, F8, останова, окно просмотра переменных... нажимаешь кнопку и каждом шаге смотришь чего нет...
внезапно окажется что это не тот объект на который ты думаешь и выложил.
и да, массива в нормальном варианте не должно быть, каждый объект должен содержать собственные данные сам.
> Впрочем, это дело Ваше.
← →
v_a_belousov (2010-10-18 01:21) [17]
> у тебя есть кнопки F7, F8, останова, окно просмотра переменных.
> .. нажимаешь кнопку и каждом шаге смотришь чего нет...
> внезапно окажется что это не тот объект на который ты думаешь
> и выложил.
так всегда и делаю. сначала все проверяю, а если уж ничего на ум не приходит, то прошу помощи...
> массива в нормальном варианте не должно быть, каждый объект
> должен содержать собственные данные сам.
Спасибо.
> Впрочем, это дело Ваше.
Я так понимаю что правильнее все таки без массива...
← →
Германн © (2010-10-18 01:55) [18]
> В данный момент есть программа, которая использует стандартные
> компоненты delphi... то есть менять вид формы за счет использования
> сторонних компонентов не вариант
Долго старался сдерживать себя от высказываний по этому поводу.
Но теперь наверно уже пора.
Цитата из http://delphimaster.net/view/2-1286912340/
Во вторых библиотеку которую я сейчас делаю можно будет применять к любому проекту что тоже плюс.
Это уже было давно сделано, когда Микрософт и не помышлял о темах. Называлось это WindowBlinds. Это и сейчас живет и развивается http://www.stardock.com/products/windowblinds/
Уверен ли ты, что твои трудозатраты окупятся?
← →
v_a_belousov (2010-10-18 02:02) [19]
> Уверен ли ты, что твои трудозатраты окупятся?
Во всяком случае получу опыт. Пока я многих вещей не знаю и учусь чему то... а дальше видно будет.
← →
Германн © (2010-10-18 02:09) [20]
> v_a_belousov (18.10.10 02:02) [19]
Хороший ответ.
Действуй. ДМ всегда помогает желающим учиться.
← →
Юрий Зотов © (2010-10-18 03:12) [21]> v_a_belousov (17.10.10 22:40) [11]
> Форма создается динамически
Да хоть сто порций. Это ничего не меняет.
← →
Плохиш © (2010-10-18 16:27) [22]
> Форма создается динамически
А я всё-таки открою аФФтару секрет, в делфи все формы создаются динамически.
← →
v_a_belousov (2010-10-18 20:11) [23]
>
> А я всё-таки открою аФФтару секрет, в делфи все формы создаются
> динамически.
знаю) в Windows ведь нет понятия TForm это "примочка" delphi...
← →
v_a_belousov (2010-10-18 20:53) [24]P.S.
> в Windows ведь нет понятия TForm это "примочка" delphi..
> .
Это так... не по теме...
← →
Юрий Зотов © (2010-10-18 22:39) [25]
> v_a_belousov (18.10.10 20:11) [23]
Совсем не в этом дело.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.01.09;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.005 c