Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1287047598
mfender
2010-10-14 13:13
2011.01.09
Запустить внешнюю программу и определить, что...


2-1286783963
Dennis I. Komarov
2010-10-11 11:59
2011.01.09
ReadDirectoryChangesW


4-1243692161
Nikfel
2009-05-30 18:02
2011.01.09
Замена ресурсов из файлов?


3-1250675499
salexn
2009-08-19 13:51
2011.01.09
DCOMConnection и проверка его существования


6-1233258365
LOLUIII/E
2009-01-29 22:46
2011.01.09
Сокеты вопрос!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский