очень красивый интерфейс, как такой сделать??
От: flax Беларусь  
Дата: 22.11.03 12:32
Оценка: 3 (1)
Klipfolio--мне когда-то говорили, что это сделано/можно сделать на Builder,
Каким образом, можно сделать такие мягкие переливы, итп ? + там неплохо реализованы скины и всякие перетаскивания. Супер --все можно тягать, и даже текст можно тягать внутри крошечной области + курсоры разные


С какой стороны к этому подходить ?

Может знаете, какой-нибудь способ или возможно знаете, где найти сорцы этого, или любого другого проекта, с похожей графикой. Кстати, Klipfolio вроде как идет в том числе под MPL, т.е, кажется, что сорцы должны быть open.
Заранее спасибо
Re: очень красивый интерфейс, как такой сделать??
От: kavlad Россия http://www.wavesoft.ru
Дата: 24.11.03 06:33
Оценка: 1 (1)
Здравствуйте, flax, Вы писали:

F>Klipfolio--мне когда-то говорили, что это сделано/можно сделать на Builder,

F>Каким образом, можно сделать такие мягкие переливы, итп ? + там неплохо реализованы скины и всякие перетаскивания. Супер --все можно тягать, и даже текст можно тягать внутри крошечной области + курсоры разные

Спроси здесь . Правда они пока только планируют
Калабухов А.В.
Re[2]: очень красивый интерфейс, как такой сделать??
От: flax Беларусь  
Дата: 24.11.03 08:05
Оценка:
K>Спроси здесь . Правда они пока только планируют

Спасибо, но мне нужна не функциональность (работа с веб-сервисами + xml), а лишь аналогичный(стиль) внешний вид. Мне кажется,что существуют приложения с другой функциональностью, но аналогично красивые. Как это сделать? Куда копать???
Re[3]: очень красивый интерфейс, как такой сделать??
От: Hacker_Delphi Россия  
Дата: 24.11.03 09:07
Оценка:
Здравствуйте, flax, Вы писали:

F>Куда копать???

WM_NC*
... << RSDN@Home 1.1.2 beta 1 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[4]: Это мышки, а надо дезайн
От: flax Беларусь  
Дата: 24.11.03 09:14
Оценка:
Здравствуйте, Hacker_Delphi, Вы писали:

F>>Куда копать???

H_D>WM_NC*

Это про перехват событий в неклиентской области формы (в заголовке окна итп)

Thanks, но как сделать такой дизайн? Согласитесь, он _сильно_ отличается, от стандартных
Re[5]: Это мышки, а надо дезайн
От: PepperLover  
Дата: 24.11.03 10:52
Оценка:
F>Thanks, но как сделать такой дизайн? Согласитесь, он _сильно_ отличается, от стандартных

А в чем проблема-то?
Рисуешь градиенты и всякие прибамбасины в Photoshope
сохраняешь в *.bmp, а потом выводишь в background'e
Re[6]: Хм, наверное ты прав
От: flax Беларусь  
Дата: 24.11.03 11:17
Оценка:
Здравствуйте, PepperLover, Вы писали:

PL>А в чем проблема-то?

PL>Рисуешь градиенты и всякие прибамбасины в Photoshope
PL>сохраняешь в *.bmp, а потом выводишь в background'e

а линейки прокрутки и другие элементы как ? Или все рисованое?? Так как это оно не расспадается, когда это все двигаешь, дергаешь, сужаешь ?
Re[7]: Не знаете?
От: flax Беларусь  
Дата: 25.11.03 07:28
Оценка:
F>а линейки прокрутки и другие элементы как ? Или все рисованое?? Так как это оно не расспадается, когда это все двигаешь, дергаешь, сужаешь ?
Re[7]: Хм, наверное ты прав
От: Sinclair Россия https://github.com/evilguest/
Дата: 25.11.03 08:38
Оценка: 3 (1) +1
Здравствуйте, flax, Вы писали:
F>а линейки прокрутки и другие элементы как ? Или все рисованое?? Так как это оно не расспадается, когда это все двигаешь, дергаешь, сужаешь ?
А где там линейки прокрутки? Все скины имеют одинаковые размеры; часть бэкграундов тайлится, часть скейлится. Модная фишка — смена hue, фактически это означает что у них нет одной из HSV компонент в картинках (либо какая-то одна выбрана для смены, а все остальные остаются на месте).
Вообще, теория скинов в том, что если тебе нужен неравномерный скейл, то вместе с картинкой задаются 4 числа. Эти числа режут прямоугольник картинки на 9 областей:
+---+---------+-----+
| 1 |      2  | 3   |
+---+---------+-----+
| 4 |    5    |  6  |
|   |         |     |
+---+---------+-----+
| 7 |    8    |   9 |
+---+---------+-----+

Числа — это соответстующие расстояния разрезов от краев битмапа. Теперь, когда тебе надо закрасить прямоугольник другого размера, ты делаешь вот что:
1. Области 1, 3, 7 и 9 рисуются по углам в натуральную величину
2. Области 2 и 8 сжимаются/растягиваются по горизонтали так, чтобы занять все отведенное место
3. Области 4 и 6 сжимаются/растягиваются по вертикали так, чтобы занять все отведенное место
4. Область 5 сжимается/растягивается по обоим координатам.
Именно так устроены скины в винде XP, благодаря чему уголки окон остаются правильной формы независимо от размера.
... << RSDN@Home 1.1 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[8]: перекраска элементов управления
От: flax Беларусь  
Дата: 25.11.03 09:09
Оценка:
Здравствуйте, Sinclair, Вы писали:

S> Модная фишка — смена hue, фактически это означает что у них нет одной из HSV компонент в картинках (либо какая-то одна выбрана для смены, а все остальные остаются на месте).


Можно подробнее, если не очень сложно??


S>Вообще, теория скинов .....

Спасибо, огромное, про картинки и схему дошло очень хорошо.


S> где там линейки прокрутки?


1. А как они поменяли картинки на кнопках --свернуть, закрыть, итп. Просто вставили свою картинки + события? А стандрартные куда? Или есть невидимая форма?

2. А как обычно перекрашиваются скроллбары ? Например в IE, итп ?

3. Там еще прикол такой, что если "взял" текст внутри, до его можешь таскать, даже если курсор вышел далеко за область видимости данного окна, текст все равно перемещается ? Это каким таким макаром


Сорри, за столь элементарные вопросы
Re[9]: Вот скриншот, чтобы было более понятно
От: flax Беларусь  
Дата: 25.11.03 09:13
Оценка:
Вот скриншот, все прилипает отлипает, тест двигается, скины меняются :)
Re[9]: перекраска элементов управления
От: Sinclair Россия https://github.com/evilguest/
Дата: 25.11.03 10:11
Оценка:
Здравствуйте, flax, Вы писали:

F>Можно подробнее, если не очень сложно??

Ну, нативным представлением для экранных битмапов является RGB. Но он неудобен для человека. Более удобное представление цветового пространства — HSV, или Hue/Saturation/Volume (Оттенок/насыщенность/яркость). Если взять картинку, в которой у всех точек Hue одинаковый, а отличается только S и V, то она будет выглядеть как "черно-белая", только раскрашенная в тот оттенок, который Hue. Меняя этот Hue получишь ту же картинку, но тонированную в другой оттенок.
Вот они это и делают. Либо они согласовнно меняют Hue у всех точек, либо имеют один специально выделенный Hue (например, 0), который и заменяют на тот, который ты укажешь.
F>1. А как они поменяли картинки на кнопках --свернуть, закрыть, итп. Просто вставили свою картинки + события? А стандрартные куда? Или есть невидимая форма?
Они не меняли. Они просто полностью рисуют окно сами. Не обязательно давать винде рисовать что-то в твоем окне (даже в т.н. неклиентской области — т.е. заголовке и границе).
F>2. А как обычно перекрашиваются скроллбары ? Например в IE, итп ?
Тут я не очень понял. В IE просто можно задавать цвет отдельных элементов скроллбара. В XP скроллбар рассматривается как сочетание кучи элементов (стрелки, thumb, фон и т.п.), каждый из которых скинуется независимо по схеме, которую я тебе уже описал.
F>3. Там еще прикол такой, что если "взял" текст внутри, до его можешь таскать, даже если курсор вышел далеко за область видимости данного окна, текст все равно перемещается ? Это каким таким макаром
Ну, само перемещение текста суть операция примитивная — выводим его со смещением и все.
А вот перетаскивание работает так: обычно в винде все мышиные события уходят в то окно, которое под курсором. Но при операциях перетаскивания окно может потребовать с помощью функции SetMouseCapture перенаправлять все сообщения мыши себе, независимо от координат. Чтобы такое окно не могло украсть чужие сообщения, такой режим доживает ровно до отпускания кнопки мыши. Так работает resize окон и drag/drop.
... << RSDN@Home 1.1 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[10]: Вот скриншот, чтобы было более понятно
От: Schumann  
Дата: 25.11.03 14:01
Оценка:
Достаточно интересная тема, правда фиг где можно найти по ней информацию. Всякий либо молчит либо информация уж сильно разрозненная. Вроду почитав посты — вроде бы и понятно что-то. И всёже: Скины скинами, а как тогда простое, ну например скрулбоксы и т.д. Короче все элементарные контролы. Как наложить на них этот скин. Можно подробнее. Просто этим не занимался — но вот приперло: надо.
Re[5]: Это мышки, а надо дезайн
От: Hacker_Delphi Россия  
Дата: 25.11.03 15:16
Оценка:
Здравствуйте, flax, Вы писали:

F>>>Куда копать???

H_D>>WM_NC*

F>Это про перехват событий в неклиентской области формы (в заголовке окна итп)


F>Thanks, но как сделать такой дизайн? Согласитесь, он _сильно_ отличается, от стандартных

Ага, точно... именно перехват событий...
WM_NCPAINT — перерисовка бордюрчика/меню и прочих
WM_NCACTIVATE — активация... она НЕ вызовет WM_NCPAINT, но перерисует форму....
WM_NCMOUSEMOVE — мышь... сама прорисовывает кнопочки на окне... и многое другое...
короче, как ни крути — все равно придется ловить эти сообщения... для начала — попробуй просто нарисоваться как winamp...
... << RSDN@Home 1.1.2 beta 1 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[6]: Это мышки, а надо дезайн
От: Schumann  
Дата: 26.11.03 07:03
Оценка:
Здравствуйте, Hacker_Delphi, Вы писали:

H_D>Ага, точно... именно перехват событий...

H_D>WM_NCPAINT — перерисовка бордюрчика/меню и прочих
H_D>WM_NCACTIVATE — активация... она НЕ вызовет WM_NCPAINT, но перерисует форму....
H_D>WM_NCMOUSEMOVE — мышь... сама прорисовывает кнопочки на окне... и многое другое...
H_D>короче, как ни крути — все равно придется ловить эти сообщения... для начала — попробуй просто нарисоваться как winamp...

Блин!... хоть бы примерчик простенький, как енто самому нарисовать (написать),чтоб работало??
Re[7]: Это мышки, а надо дезайн
От: flax Беларусь  
Дата: 26.11.03 07:23
Оценка:
Здравствуйте, Schumann, Вы писали:

S>Блин!... хоть бы примерчик простенький, как енто самому нарисовать (написать),чтоб работало??


Да, пример бы совсем не помешал...Может подкините ссылку?
Re[8]: Это мышки, а надо дезайн
От: Schumann  
Дата: 26.11.03 09:21
Оценка:
Програмка SkinStudio http://www.skinstudio.net/
Re[9]: Это мышки, а надо дезайн
От: Schumann  
Дата: 26.11.03 09:26
Оценка:
Програмка SkinStudio. Она более или менее дает представление о том как рисуются скины. На сайте stardock.com много еще есть всяких приблуд которые делают прибамбасы. Но это все к винде, возможно и к программе своей можно порисовать скин. Тока вот, как потом это художественное творчество применить на деле (все енто дело программируя)???
Re[10]: Ну наверное нет знатоков!
От: Schumann  
Дата: 26.11.03 20:37
Оценка:
Наверное нет знатоков! Либо кто знает — тот упорно молчит! ((((
Re[11]: Вот скриншот, чтобы было более понятно
От: Sinclair Россия https://github.com/evilguest/
Дата: 27.11.03 04:21
Оценка:
Здравствуйте, Schumann, Вы писали:

S>Достаточно интересная тема, правда фиг где можно найти по ней информацию. Всякий либо молчит либо информация уж сильно разрозненная. Вроду почитав посты — вроде бы и понятно что-то. И всёже: Скины скинами, а как тогда простое, ну например скрулбоксы и т.д. Короче все элементарные контролы. Как наложить на них этот скин. Можно подробнее. Просто этим не занимался — но вот приперло: надо.

Блин, все же уже написано! Читай выше и задавай конкретные вопросы.
... << RSDN@Home 1.1 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[12]: Вот скриншот, чтобы было более понятно
От: Schumann  
Дата: 27.11.03 08:27
Оценка:
Здравствуйте, Sinclair, Вы писали:
S>Блин, все же уже написано! Читай выше и задавай конкретные вопросы.

Дык если тема не знакомая — то нифига и не понятно! Вот и прошу примерчик: как енто все сделать
Re[13]: Вот скриншот, чтобы было более понятно
От: Sinclair Россия https://github.com/evilguest/
Дата: 27.11.03 08:41
Оценка:
Здравствуйте, Schumann, Вы писали:
S>Дык если тема не знакомая — то нифига и не понятно! Вот и прошу примерчик: как енто все сделать
Ты бы еще спросил "как писать игры для PC". Примера тут ни у кого видать нету.
Задай конкретный вопрос, на который можно ответить. Вон flax задает конкретные вопросы. А тебе что непонятно?
... << RSDN@Home 1.1 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[14]: Вот скриншот, чтобы было более понятно
От: jkris Беларусь  
Дата: 07.12.03 10:56
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Задай конкретный вопрос, на который можно ответить. Вон flax задает конкретные вопросы. А тебе что непонятно?


а можно в неклиентской области менять Canvas, или ручками все прорисовывать?
Re[15]: Вот скриншот, чтобы было более понятно
От: Sinclair Россия https://github.com/evilguest/
Дата: 07.12.03 11:26
Оценка:
Здравствуйте, jkris, Вы писали:
J>а можно в неклиентской области менять Canvas, или ручками все прорисовывать?
Э-э, пардон, на что менять?
У вас в целом есть два выхода по отношению к неклиентской области (впрочем, как и к клиентской): либо полагаться на поведение оконной процедуры, предоставленной вам выбранным классом окна, либо перехватывать WM_NCPAINT и делать с ним все, что захочется (как с шоколадом Виспа).
... << RSDN@Home 1.1.0 stable >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[14]: Вот скриншот, чтобы было более понятно
От: jkris Беларусь  
Дата: 07.12.03 11:32
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Задай конкретный вопрос, на который можно ответить. Вон flax задает конкретные вопросы. А тебе что непонятно?



и еще — в чем лучше писать подобные приложения, просто на WinApi, либо в билдере, учитывая, что в требуемом приложении нужно будет очень много и часто работать с алгоритмами и визуальным представлением информации — картинками, матрицами и прочая?

как менять Hue(может плохо искал, но не нашел)? Или перерисовывать все окна, поменяв Hue у бэкграундов?
MaskBlt?

у KlipFolio высота заголовка окошек меньше стандартной. Как менять его размер? (перерисовать часть?)

Они оставляли заголовок (у главной части формы — не окошек, а там, где кнопочки закрыть/свернуть) и просто его перерисовали, либо они задавали стиль формы без границы и заголовка и сами все рисовали + обрабатывали события?

Остальные окошки — это отдельные формы, так?

(извиняюсь, если задаю глупые вопросы — для меня подобная тема нова и я только разбираюсь)
Re[16]: Вот скриншот, чтобы было более понятно
От: jkris Беларусь  
Дата: 07.12.03 11:35
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, jkris, Вы писали:

J>>а можно в неклиентской области менять Canvas, или ручками все прорисовывать?
S>Э-э, пардон, на что менять?

Не канвас, а битмат, растягивая его как нужно при перерисовке(StretchBlt), меняя когда надо цвет(MaskBlt?).


S>У вас в целом есть два выхода по отношению к неклиентской области (впрочем, как и к клиентской): либо полагаться на поведение оконной процедуры, предоставленной вам выбранным классом окна, либо перехватывать WM_NCPAINT и делать с ним все, что захочется (как с шоколадом Виспа).


А что можно с ним сделать?

Как менять размер заголовка, например? Перерисовать не всю область не катит, она, как понял из опытов, все равно остается — просто не перерисовывается.
Re[16]: Вот скриншот, чтобы было более понятно
От: Hacker_Delphi Россия  
Дата: 07.12.03 11:44
Оценка: 2 (1)
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, jkris, Вы писали:

J>>а можно в неклиентской области менять Canvas, или ручками все прорисовывать?
S>Э-э, пардон, на что менять?
Если я правильно понял вопрос — спрашивается, можно ли использовать Canvas для неклиентской области.. отвечаю, да:
procedure TSkinnedForm.WMNCPaint(var Msg: TWMNCPaint);
var
    Canvas: TCanvas;
    ADC: HDC;
begin
    Canvas := TCanvas.Create();
    try
        ADC := GetWindowDC(Handle);
        Canvas.Handle := ADC;
        // тут работаем с Canvas.... 
        // В Canvas - ВСЯ форма, включая рамку и заголовок.
        // Начало координат - не помню... но вроде бы в верхнем левом 
        // углу НЕКЛИЕНТСКОЙ части окна
    finally
        Canvas.Handle := 0;
        ReleaseDC(Handle, ADC);
    end;
end;
... << RSDN@Home 1.1.2 beta 1 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[15]: Вот скриншот, чтобы было более понятно
От: Sinclair Россия https://github.com/evilguest/
Дата: 07.12.03 12:11
Оценка:
Здравствуйте, jkris, Вы писали:
J>как менять Hue(может плохо искал, но не нашел)? Или перерисовывать все окна, поменяв Hue у бэкграундов?
J>MaskBlt?
Не подойдет. Надо вручную пройтись по всем пикселам битмэпа и пересчитать значение цвета: RGB->HSV->H'SV->RGB. Естественно это делается один раз, при инициализации приложения (или смене настроек)
J>у KlipFolio высота заголовка окошек меньше стандартной. Как менять его размер? (перерисовать часть?)
Есть такая мессага WM_NCCALCSIZE, если не ошибаюсь. Ее обработчик и определяет, какая часть окна клиентская, а какая нет.
Стоит отметить, что ничем сверхестественным неклиентская область от клиентской не отличается. Она была сделана для того, чтобы программист мог управлять внутренностями окна, отдавая стандартную часть поведения на откуп микрософту. Это позволило изменить список кнопок в заголовке при переходе Win3.1->Win95 и сделать градинетную заливку вместо монотонной в Win98. Если тебе не нужна похожесть на стандарт, то можно запросто сделать размер клиентской области совпадающим со всем окном и рисовать все там.
J>Они оставляли заголовок (у главной части формы — не окошек, а там, где кнопочки закрыть/свернуть) и просто его перерисовали, либо они задавали стиль формы без границы и заголовка и сами все рисовали + обрабатывали события?
А черт его знает. В принципе, можно докопаться, но щачем? От этого зависят тольео мелкие детали реализации.
J>Остальные окошки — это отдельные формы, так?
Скорее всего да. Это как правило проще, чем делать одно окно сложной формы (хотя и в этом есть некоторые преимущества).
J>(извиняюсь, если задаю глупые вопросы — для меня подобная тема нова и я только разбираюсь)
Да ничего, разбирайся на здоровье
... << RSDN@Home 1.1.0 stable >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[17]: Вот скриншот, чтобы было более понятно
От: jkris Беларусь  
Дата: 07.12.03 12:33
Оценка:
Здравствуйте, Hacker_Delphi, Вы писали:

H_D>Если я правильно понял вопрос — спрашивается, можно ли использовать Canvas для неклиентской области.. отвечаю, да:

H_D>[pascal]
H_D>procedure TSkinnedForm.WMNCPaint(var Msg: TWMNCPaint);

О, спасибо.

а в Builder'e это будет как например вот здесь http://www.codenet.ru/progr/bcb/wmhook.php ? или проще?
Re[16]: Вот скриншот, чтобы было более понятно
От: jkris Беларусь  
Дата: 07.12.03 12:48
Оценка:
Здравствуйте, Sinclair, Вы писали:

J>>как менять Hue(может плохо искал, но не нашел)? Или перерисовывать все окна, поменяв Hue у бэкграундов?

J>>MaskBlt?
S>Не подойдет. Надо вручную пройтись по всем пикселам битмэпа и пересчитать значение цвета: RGB->HSV->H'SV->RGB. Естественно это делается один раз, при инициализации приложения (или смене настроек)

COLORADJUSTMENT ?

пересчитывать в HSV как?

J>>у KlipFolio высота заголовка окошек меньше стандартной. Как менять его размер? (перерисовать часть?)

S>Есть такая мессага WM_NCCALCSIZE, если не ошибаюсь. Ее обработчик и определяет, какая часть окна клиентская, а какая нет.

смотрю, пока не понял, как этим пользоваться

S> ... Если тебе не нужна похожесть на стандарт, то можно запросто сделать размер клиентской области совпадающим со всем окном и рисовать все там.


И обрабатывать события изменения размеров окна, его перемещения и т.п.?

J>>Они оставляли заголовок (у главной части формы — не окошек, а там, где кнопочки закрыть/свернуть) и просто его перерисовали, либо они задавали стиль формы без границы и заголовка и сами все рисовали + обрабатывали события?

S>А черт его знает. В принципе, можно докопаться, но щачем? От этого зависят тольео мелкие детали реализации.

Если не оставлять заголовок и т.п. нужно обрабатывать нажатия кнопки мыши на области, которая обозначает заголовок и перемещения мыши вслед за этим — например. Не очень много, но писанина. Так?
Ну и смена курсора мыши когда мы перемещаем этот курсор к правой нижней области окна.

J>>(извиняюсь, если задаю глупые вопросы — для меня подобная тема нова и я только разбираюсь)

S>Да ничего, разбирайся на здоровье

Спасибо
Re[17]: Вот скриншот, чтобы было более понятно
От: DPP Россия  
Дата: 07.12.03 15:39
Оценка:
на счет вот этого кода..

H_D>Если я правильно понял вопрос — спрашивается, можно ли использовать Canvas для неклиентской области.. отвечаю, да:

H_D>procedure TSkinnedForm.WMNCPaint(var Msg: TWMNCPaint);
H_D>var
H_D>    Canvas: TCanvas;
H_D>    ADC: HDC;
H_D>begin
H_D>    Canvas := TCanvas.Create();
H_D>    try
H_D>        ADC := GetWindowDC(Handle);
H_D>        Canvas.Handle := ADC;
H_D>        // тут работаем с Canvas.... 
H_D>        // В Canvas - ВСЯ форма, включая рамку и заголовок.
H_D>        // Начало координат - не помню... но вроде бы в верхнем левом 
H_D>        // углу НЕКЛИЕНТСКОЙ части окна
H_D>    finally
H_D>        Canvas.Handle := 0;
H_D>        ReleaseDC(Handle, ADC);
H_D>    end;
H_D>end;
H_D>


или то же на С++
void __fastcall TEditForm::FormPaint(TObject *Sender)
{
    TCanvas *Canvas=new(TCanvas);
    HDC ADC;

    ADC = GetWindowDC(Handle);
    Canvas->Handle = ADC;
    // тут работаем с Canvas.... 
    // В Canvas - ВСЯ форма, включая рамку и заголовок.
    // Начало координат - не помню... но вроде бы в верхнем левом 
    // углу НЕКЛИЕНТСКОЙ части окна

    Canvas->Draw(Width - Image1->Picture->Bitmap->Width, 0, Image1->Picture->Bitmap);
    // пытаюсь вывести картинку в правом верхнем углу формы
    // на форме также есть MainMenu и ControlBar (это важно!)

    Canvas->Handle = 0;
    ReleaseDC(Handle, ADC);
}


ну и что получается? во первых эта картинка "пропускает" клики. во вторых, жутко "моргает" при изменении размеров (может и пропасть). А если сделать все приложение из кусочков картинок??

И еще — вопрос. Есть ли возможность заблокировать отрисовку формы виндами, до тех пор, пока я полностью не отрисую форму (или не выполню какие-либо другие действия (например по нажатии кнопки состояние других компонент изменяется несколько раз) ?

PS: Вообще-то хочетца что-то вроде логотипа нарисовать поверх MainMenu и ControlBar и пр., и чтобы по клику на них оно не "проваливолось" под них, а остовалось все так же поверх.
Re[18]: Вот скриншот, чтобы было более понятно
От: Hacker_Delphi Россия  
Дата: 07.12.03 17:04
Оценка:
Здравствуйте, DPP, Вы писали:

DPP>ну и что получается? во первых эта картинка "пропускает" клики. во вторых, жутко "моргает" при изменении размеров (может и пропасть). А если сделать все приложение из кусочков картинок??


DPP>И еще — вопрос. Есть ли возможность заблокировать отрисовку формы виндами, до тех пор, пока я полностью не отрисую форму (или не выполню какие-либо другие действия (например по нажатии кнопки состояние других компонент изменяется несколько раз) ?


DPP>PS: Вообще-то хочетца что-то вроде логотипа нарисовать поверх MainMenu и ControlBar и пр., и чтобы по клику на них оно не "проваливолось" под них, а остовалось все так же поверх.

Ну еще надо обрабатывать WM_NCACTIVATE, WM_NCMOUSEXXX и прочие WM_NCXXX — просто винда вместо вызова WM_NCPAINT при всяких событиях типа наведения мыши на кнопку в заголовке окна просто заново ее рисует — это надо перехватить, т.е. при проведении мышт надо отдавать обработку предку, а затем — перерисовыать ту часть, над которой мышь "проехала"... для этого еще и придется сохранять координаты мыши и таймеры — короче куча бодяги всякой...
Hint: для того, чтобы винда не рисовала всяких "лишних" кнопок — нужно при отлове сообщения WM_SETSTYLE (ыроде еще было WM_SETEXSTYLE) сохранять флаги, касающиеся заголовка и прочих "вкусностей" типа рамки у себя, а в предка отдавать без рамок.
потом — в WM_NCCALCSIZE считать клиентскую область.
а в WM_NCPAINT/WM_NCACTIVATE/WM_NCMOUSEXXX обрабатывать саму отрисовку, в том числе — и меню...
дальше — сам
... << RSDN@Home 1.1.2 beta 1 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[17]: Вот скриншот, чтобы было более понятно
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 08.12.03 01:50
Оценка:
Здравствуй, jkris!

j> Как менять размер заголовка, например? Перерисовать не всю область

j> не катит, она, как понял из опытов, все равно остается — просто не
j> перерисовывается.

Менять динамически? Размер заголовка запрашивается только при создании
окна.
Поэтому, если вам хочется делать заголовок меняющимся, то вам нужно
создать окно без заголовка. Рисовать его самим как вам хочется и
обрабатывая WM_NCHITTEST говорить системе, что такая-то область — это
у нас заголовок.

--
Всего хорошего, Слава. (http://slava.users.otts.ru)
-= Пусть вон тот желтый кубик будет, для наглядности, синим шариком.
=-
Posted via RSDN NNTP Server 1.8 beta
Re[17]: Вот скриншот, чтобы было более понятно
От: Sinclair Россия https://github.com/evilguest/
Дата: 11.12.03 13:29
Оценка:
Здравствуйте, jkris, Вы писали:
J>>>как менять Hue(может плохо искал, но не нашел)? Или перерисовывать все окна, поменяв Hue у бэкграундов?
J>>>MaskBlt?
S>>Не подойдет. Надо вручную пройтись по всем пикселам битмэпа и пересчитать значение цвета: RGB->HSV->H'SV->RGB. Естественно это делается один раз, при инициализации приложения (или смене настроек)

J>COLORADJUSTMENT ?

Никакого отношения.
J>пересчитывать в HSV как?
Поищи на RSDN по фразе "RGB to HSL". Был кусок кода.
S>>Есть такая мессага WM_NCCALCSIZE, если не ошибаюсь. Ее обработчик и определяет, какая часть окна клиентская, а какая нет.
J>смотрю, пока не понял, как этим пользоваться
А чего тут не понять? Тебе дали данные — ты в ответ сообщил, где тебе нужно иметь клиентскую зону. Все остальное считается неклиентской зоной.
S>> ... Если тебе не нужна похожесть на стандарт, то можно запросто сделать размер клиентской области совпадающим со всем окном и рисовать все там.
J>И обрабатывать события изменения размеров окна, его перемещения и т.п.?
J>Если не оставлять заголовок и т.п. нужно обрабатывать нажатия кнопки мыши на области, которая обозначает заголовок и перемещения мыши вслед за этим — например. Не очень много, но писанина. Так?
Не обязательно. Достаточно обрабатывать WM_NCHITTEST. (Имея, конечно, ненулевую неклиентскую зону)
... << RSDN@Home 1.1.0 stable >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[18]: Вот скриншот, чтобы было более понятно
От: Hacker_Delphi Россия  
Дата: 21.12.03 15:22
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

S>Не обязательно. Достаточно обрабатывать WM_NCHITTEST. (Имея, конечно, ненулевую неклиентскую зону)

Выделеное является полной ерундой...
вот такой код будет работать (есть форма, в которой лежит bvlCaption: TBevel с Align = alTop и у которой нет Border'а):
procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest);
begin
  inherited;
  if Msg.Result = HTCLIENT then
  begin
    if PtInRect(Bevel1.BoundsRect, ScreenToClient(Point(Msg.XPos, Msg.YPos))) then
      Msg.Result := HTCAPTION;
  end;
end;

Ремарки:
1. Нужен именно TBevel или другой non-Windowed Control, иначе обработка просто не дойдет до нас.
2. аккуратнее с расположением в этой области других подобных контролов (типа Speed Button) — для них не будет генерироваться мышиных сообщений... никаких.
... << RSDN@Home 1.1.2 beta 2 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[18]: Вот скриншот, чтобы было более понятно
От: tim_ Россия  
Дата: 22.12.03 10:46
Оценка:
Здравствуйте, DPP, Вы писали:

DPP>...во вторых, жутко "моргает" при изменении размеров (может и пропасть). А если сделать все приложение из кусочков картинок??


А вы достаточно хорошо изучили механизм прорисовки окон в Windows? Надеюсь, не забыли, что помимо событий WM_PAINT, WM_NCPAINT происходит и WM_ERASEBACKGRND при котором окно обычно закрашивает себя определенным цветом. Проблема мелькания заключается в том, что сообщения стирания фона окна и его прорисовки отображают результат прямо на экране (а не, например, в буфере), поэтому при масштабировании окна у вас сначала закрашивается фон цветом окна, а уже затем вы получаете возможность прорисовки самого изображения. Выход, например, такой: проглатывать (игнорировать) все сообщения WM_ERASEBACKGRND, а стирать изображение (если это необходимо) в обработчиках WM_PAINT и WM_NCPAINT.
Re[17]: Вот скриншот, чтобы было более понятно
От: Denis_TST Россия www.transsys.ru
Дата: 07.01.04 23:30
Оценка: 30 (2)
Здравствуйте, jkris, Вы писали:

J>пересчитывать в HSV как?

а еще в Delphi7 есть модуль GraphUtil , там есть такие функции


function GetHighLightColor(const Color: TColor; Luminance: Integer = 19): TColor;
function GetShadowColor(const Color: TColor; Luminance: Integer = -50): TColor;
procedure DrawCheck(ACanvas: TCanvas; Location: TPoint; Size: Integer;
  Shadow: Boolean = True);
procedure DrawChevron(ACanvas: TCanvas; Direction: TScrollDirection;
  Location: TPoint; Size: Integer);
procedure DrawArrow(ACanvas: TCanvas; Direction: TScrollDirection;
  Location: TPoint; Size: Integer);
    
procedure ColorRGBToHLS(clrRGB: COLORREF; var Hue, Luminance, Saturation: Word);
function ColorHLSToRGB(Hue, Luminance, Saturation: Word): TColorRef;


function ColorAdjustLuma(clrRGB: TColor; n: Integer; fScale: BOOL): TColor;
... << RSDN@Home 1.1.0 stable >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.