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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Полупрозрачность окна 
V
    Опции темы
ZC1989
Дата 28.6.2009, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

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



название конечно не отражает все сути, но попробую объяснить что нужно, я окно с рисованым мною фоном и он подразумеваетплавные переходы и полупрозрачные облости. а стандартный альфаканал не даёт такой возможности, получается шум и на краях.
какой есть выход? 

это то что получается у меня http://pic.ipicture.ru/uploads/090628/4FZbzDC6OY.jpg


а вот код:
Код

class        Sticker{

public:
    HBITMAP            hwBmp;
    HDC                    hdcTemp,    bpHDC;
    PAINTSTRUCT    sentinel;
    BITMAP                bm;
    COLORREF            filtercolor;            /*color to filter out*/
    HRGN                temp,    final;
    int                        left,    startpos,    row;


    void    init(HWND hMainDialog, HINSTANCE hInst, LPCSTR IMAG_A){
        bpHDC        =    BeginPaint(hMainDialog, &sentinel);
        
        final            = CreateRectRgn(0,0,0,0);                /*final must be initialized before being combined*/
        hdcTemp    = CreateCompatibleDC(bpHDC);
        hwBmp        = LoadBitmap(hInst, IMAG_A);

        SelectObject(hdcTemp, static_cast<HGDIOBJ>(hwBmp));
        GetObject(static_cast<HGDIOBJ>(hwBmp), sizeof(bm), &bm);

        filtercolor        = GetPixel(hdcTemp, 0,0);
        row        = 0;
        left        = 0;

        for(row; row <= bm.bmHeight-1; row++)
        {
            while(left < bm.bmWidth-1)
            {
                while((GetPixel(hdcTemp, left, row) == filtercolor) && left < bm.bmWidth)
                    left++;

                if(left != bm.bmWidth)
                {    
                    startpos = left;
                    while((GetPixel(hdcTemp, left, row) != filtercolor) && (left < bm.bmWidth))
                        left++;

                    temp = CreateRectRgn(startpos, row, left, row+1);
                    CombineRgn(final, final, temp, RGN_XOR);
                }
            }
            left = 0;
        }

        DeleteObject(reinterpret_cast<HGDIOBJ>(temp));
        DeleteDC(bpHDC);
        DeleteDC(hdcTemp);
        SetWindowRgn(hMainDialog, final, TRUE);
        DeleteObject(reinterpret_cast<HGDIOBJ>(final));

    }

    void    paint(HWND hMainDialog, HINSTANCE hInst, LPCSTR IMAG)
    {
        bpHDC        =    BeginPaint(hMainDialog, &sentinel);
        hdcTemp    = CreateCompatibleDC(bpHDC);                /*load and bitblt image to our hdc*/
        hwBmp        = LoadBitmap(hInst, IMAG);

        SelectObject(hdcTemp, static_cast<HGDIOBJ>(hwBmp));
        GetObject(static_cast<HGDIOBJ>(hwBmp), sizeof(bm), &bm);

        BitBlt(bpHDC, 0/*-3*/, 0/*-22*/, bm.bmWidth, bm.bmHeight, hdcTemp, 0, 0, SRCCOPY);
        DeleteDC(bpHDC);                /*delete uneeded objects to free up memory*/
        DeleteDC(hdcTemp);
        EndPaint(hMainDialog, &sentinel);
    }



};


Это сообщение отредактировал(а) ZC1989 - 28.6.2009, 16:49


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
GremlinProg
Дата 29.6.2009, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ZC1989 @  28.6.2009,  17:58 Найти цитируемый пост)
это то что получается у меня http://pic.ipicture.ru/uploads/090628/4FZbzDC6OY.jpg

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

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

есть другой вариант - использовать несколько слоев растров, т.е. тень - на первом слое, объект - второй слой, тогда можно устанавливать разные степени прозрачности на каждом слое


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

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



а привязка к фону...это я так понимаю манипуляция с "скриншотом" рабочего стола, правильно? то есть берём картинку, с полупрозрачностью на неё отрисовываем нужную картинку..правильно понимаю? но как такое сделать? чтото не соображу до конца


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
ZC1989
Дата 1.7.2009, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

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



ребят, неужели никто не может подсказать как правильно это всё последовательно сделать? код я сам попробую раскопать, просто хотя бы концепцию...


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
GremlinProg
Дата 1.7.2009, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ZC1989 @  29.6.2009,  20:02 Найти цитируемый пост)
а привязка к фону...это я так понимаю манипуляция с "скриншотом" рабочего стола, правильно?

нет, это не манипуляции со скриншотами
объясняю по другому, формула прозрачности:
Код

<прозрачный цвет> = alpha * <цвет фона> + ( 1.0 - alpha ) * <цвет фигуры>;

<прозрачный цвет> - это цвет пиксела, который получается при полутоновых наслойках
<цвет фона> - это цвет изображения, которое просвечивает сквозь нашу фигуру
<цвет фигуры> - это цвет фигуры, которой нужно придать прозрачность 
alpha - коэффициент прозрачности (от 0.0 до 1.0)

при образовании падающих теней от объектов, используется эта же формула, т.е. в их формировании участвуют три компоненты:
<прозрачный цвет>
<цвет фона>
<цвет фигуры>
когда ты вырезаешь <цвет фона>, и меняешь его на какой-либо другой, то ты нарушаешь этот закон, отсюда и появляются шумы на краях

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

или ты ждешь какое-то еще решение?


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

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



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


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0810 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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