Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> не стандартное окно(форма), реализация внешнего вида 
:(
    Опции темы
Emura
Дата 25.5.2009, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 7.2.2009

Репутация: 1
Всего: 1



приветствую форумчан.

по прозрачным контролам есть несколько тем, по формам не узрел.
 
1) хочется сделать чтото вроде прямоугольника(естесственно), только с верхними закругленными краями. да так, чтобы ресайзить можно было.
2) по возможности сделать тень

подкиньте пожалуйста мыслей для решения задачи.

Добавлено через 5 минут и 11 секунд
итак, пока пришел к следующему.

за основу взять два окна. 
одно окно - собственно форма, второе - подложка(на ней рисуем тень).

буду пробовать.

пс. а вот как сделать закругления и ресайз пока не понял.
PM   Вверх
bugmenot
Дата 25.5.2009, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 3.7.2006

Репутация: 0
Всего: 1



Пер пиксельная прозрачность:
http://www.codeproject.com/KB/GDI/pxalphablend.aspx
--------------------
доска объявленийвсе о горных велосипедах 
PM MAIL   Вверх
DrHex
Дата 26.5.2009, 02:57 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 2.5.2009

Репутация: нет
Всего: нет



Посмотри в книги "С++ глазами хакера"
Там есть создание окна на основе картинки любой формы....
--------------------
google.com и это все.
PM MAIL   Вверх
Emura
Дата 26.5.2009, 03:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 7.2.2009

Репутация: 1
Всего: 1



bugmenot, DrHex, спасибо за инфу!

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

..наверное можно использовать эту штуку для окна-подложки, попробую..


DrHex,
ок, посмотрю книженцию.
PM   Вверх
Andrey44
Дата 26.5.2009, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Цитата(Emura @  25.5.2009,  23:18 Найти цитируемый пост)
по возможности сделать тень

В WNDCLASS структуре при создании ставь style = CS_DROPSHADOW
И будет тень от окна.


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
GremlinProg
Дата 26.5.2009, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Emura @  26.5.2009,  01:18 Найти цитируемый пост)
да так, чтобы ресайзить можно было.

тут, скорее всего, придется при изменении размеров всегда переустанавливать регион окна,
что-то вроде такого:
Код

case WM_SIZE:{
  RECT rw,box;
  HRGN hrgn;
  //
  hrgn = ::CreateRectRgn(0,0,0,0);
  ::GetWindowRgn(hwnd,hrgn);
  ::GetRgnBox(hrgn,&box);
  ::DeleteObject(hrgn);
  //
  ::GetWindowRect(hwnd,&rw);
  ::OffsetRect(&rw,-rw.left,-rw.top);
  //
  if( !::EqualRect(&box,&rw) ){
    hrgn = ::CreateRoundRectRgn(rw.left,rw.top,...);
    ::SetWindowRgn(hwnd,hrgn,TRUE);
  }
  break;
}

тут три операции:
1. получение габаритов текущего региона окна (box)
2. получение габаритов окна (rw)
3. если габариты не равны, переустановить регион

проверка прямоугольников включена для исключения рекурсии:
Цитата(SetWindowRgn @ MSDN)

When this function is called, the system sends the WM_WINDOWPOSCHANGING and WM_WINDOWPOSCHANGED messages to the window


Это сообщение отредактировал(а) GremlinProg - 26.5.2009, 13:06


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Emura
Дата 26.5.2009, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 7.2.2009

Репутация: 1
Всего: 1



CS_DROPSHADOW.. в принцыпе можно и так наверное.

вот так делаю сейчас форму прозрачной. bmp - 32bit картинка с альфой
Код


        POINT sPoint = { 100, 100 }; 
        SIZE sSize = { 200, 200 }; 
        POINT sSrc = { 0, 0 }; 

        BLENDFUNCTION bf= { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };

        HDC hdcMem    =CreateCompatibleDC( null ); 
        HGDIOBJ oldbmp    =SelectObject( hdcMem, bmp ); 

        UpdateLayeredWindow( hwnd, null, &sPoint, &sSize, hdcMem, &sSrc, 0, &bf, ULW_ALPHA );

        SelectObject(hdcMem, oldbmp);
        DeleteObject(bmp);
        DeleteDC(hdcMem);

как можно по этому делу нарисовать например просто текст не прозрачный и разместить контролы, чтобы они были видны?
или лучше использовать это только в виде подложки?

GremlinProg, сейчас попробую понять мысль. CreateRoundRectRgn не делает ли он закругления всем 4углам? 


вот общая идея, посмотрите плз
обратите внимание на сложную(проблемную) область, как реализовать пока не додумал.
user posted image




Это сообщение отредактировал(а) Emura - 26.5.2009, 13:29
PM   Вверх
Emura
Дата 28.5.2009, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 7.2.2009

Репутация: 1
Всего: 1



уважаемые, возникла небольшая проблемка. рисую форму на основе WS_POPUP. 

проблема вот в чем: 
при SW_MAXIMIZE окно разворачивается на полный экран, что совершенно не требуется. как бы обойти эту особенность стиля WS_POPUP ?

собственно надо както контролировать это дело. когда надо фуллскрин - делаем, не надо - просто максимизируем.

Это сообщение отредактировал(а) Emura - 28.5.2009, 00:24
PM   Вверх
Andrey44
Дата 28.5.2009, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Цитата(Emura @  28.5.2009,  00:21 Найти цитируемый пост)
при SW_MAXIMIZE

Может имелось ввиду WS_MAXIMIZE ?
Для разворачивания или восстановления окна можно посылать окну сообщение
WM_SYSCOMMAND with parameters:
if wParam SC_MAXIMIZE then maximizes the window.
if wParam SC_RESTORE then restores the window to its normal position and size.



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
GremlinProg
Дата 28.5.2009, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Emura @  26.5.2009,  15:19 Найти цитируемый пост)
CreateRoundRectRgn не делает ли он закругления всем 4углам? 

делает
Цитата(Emura @  28.5.2009,  02:21 Найти цитируемый пост)
при SW_MAXIMIZE окно разворачивается на полный экран, что совершенно не требуется. как бы обойти эту особенность стиля WS_POPUP ?

да, есть такое, тут в нормальном режиме должен стоять заголовок (WS_CAPTION),
а для максимизации окна нужно использовать ShowWindow, а не стиль WS_MAXIMIZE:
Код

::ShowWindow(hwnd,SW_SHOWMAXIMIZED);

перед максимизацией (в режиме фуллскрина), выключай заголовок:
Код

styles &= ~WS_CAPTION

при восстановлении (в режиме фуллскрина) - включай его обратно:
Код

styles |= WS_CAPTION



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Emura
Дата 28.5.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 7.2.2009

Репутация: 1
Всего: 1



Цитата

Может имелось ввиду WS_MAXIMIZE ?

Цитата

а для максимизации окна нужно использовать ShowWindow, а не стиль WS_MAXIMIZE:

Andrey44, GremlinProg, не правильно объяснил. имеется ввиду именно SW_MAXIMIZE - флаг при ShowWindow.

Цитата

перед максимизацией (в режиме фуллскрина), выключай заголовок:
при восстановлении (в режиме фуллскрина) - включай его обратно:

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


GremlinProg, с регионами разобрался. но они не дают сглаженных краев, к сожалению..

Это сообщение отредактировал(а) Emura - 28.5.2009, 14:18
PM   Вверх
GremlinProg
Дата 28.5.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Emura @  28.5.2009,  16:06 Найти цитируемый пост)
именно SW_MAXIMIZE - флаг при ShowWindow.

) тогда все нормально
Цитата(Emura @  28.5.2009,  16:06 Найти цитируемый пост)
от и загвоздка в том что заголовок то я не использую. рисую его сам на WS_POPUP.

тогда пожалуй так просто не получится, т.к. перекрытое окно без заголовка быть не может (сначала хотел предложить снимать стиль WS_POPUP на выходе из фуллскрина)

перехватывай WM_SYSCOMMAND в момент (0xFFF0 & wParam) == SC_MAXIMIZE
и перекрывай стандартныую обработку как-нибудь так:
Код

RECT wrk;
::SystemParametersInfo(SPI_GETWORKAREA,NULL,&wrk,NULL);
::SetWindowPos(...wrk.left,wrk.top,wrk.right - wrk.left,...);
//
winpl.length = sizeof(winpl);
::GetWindowPlacement(hwnd,&winpl);
winpl.showCmd = SW_MAXIMIZE;
::SetWindowPlacement(hwnd,&winpl);
//
return 0;


Цитата(Emura @  28.5.2009,  16:06 Найти цитируемый пост)
еще проблема из таскбара минимизировать, максимизировать и меню вызвать по правой клавиши мыше не получается. это тоже связано с   WS_POPUP ?  

нет, это системное меню, за его показ отвечает стиль WS_SYSMENU

Цитата(Emura @  28.5.2009,  16:06 Найти цитируемый пост)
с регионами разобрался. но они не дают сглаженных краев, к сожалению..

ну так регион - это только форма, а содержанием ты ее сам должен наполнить


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Emura
Дата 4.6.2009, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 7.2.2009

Репутация: 1
Всего: 1



GremlinProg, спасибо. буду разбираться.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0560 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.