Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.01.09;
Скачать: CL | DM;

Вниз

Использование нестандартных форм. Скины для программы   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.011 c
15-1285160295
yurikon
2010-09-22 16:58
2011.01.09
Проблема с перенесенными ветками


3-1251053802
Maks Zyuzin
2009-08-23 22:56
2011.01.09
IBDataSet и сбрасывание значений параметров


15-1285446560
Юрий
2010-09-26 00:29
2011.01.09
С днем рождения ! 26 сентября 2010 воскресенье


15-1285184688
NailMan
2010-09-22 23:44
2011.01.09
А вот собрался показать себя таки на "модельном МАКСе"


2-1287052049
b86
2010-10-14 14:27
2011.01.09
Завести процедуру даблклик