Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
41 / 40 / 23
Регистрация: 10.03.2012
Сообщений: 374
1

Закраска фона

07.04.2013, 01:28. Показов 1338. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Подскажите, куда вставить функцию SetBkMode (hdc, TRANSPARENT);, чтобы фон шара был прозрачным, а не белым?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    static HBITMAP hBitmap;
    static int cxClient, cyClient, xCenter, yCenter, cxTotal, cyTotal, cxRadius, cyRadius, cxMove, cyMove, xPixel, yPixel;
    HBRUSH hBrush;
    HDC hdc, hdcMem;
    int iScale;
 
    switch(iMsg)
    {
        case WM_CREATE: hdc = GetDC(hwnd);
                        xPixel = GetDeviceCaps(hdc, ASPECTX);
                        yPixel = GetDeviceCaps(hdc, ASPECTY);
                        ReleaseDC(hwnd, hdc);
                    return 0;
        case WM_SIZE: xCenter =(cxClient = LOWORD(lParam)) / 2;
                      yCenter =(cyClient = HIWORD(lParam)) / 2;
                      iScale = min(cxClient * xPixel, cyClient * yPixel) / 16;
                      cxRadius = iScale / xPixel;
                      cyRadius = iScale / yPixel;
                      cxMove = max(1, cxRadius / 2);
                      cyMove = max(1, cyRadius / 2);
                      cxTotal = 2 *(cxRadius + cxMove);
                      cyTotal = 2 *(cyRadius + cyMove);
                      if(hBitmap)
                            DeleteObject(hBitmap);
                      hdc = GetDC(hwnd);
                      hdcMem = CreateCompatibleDC(hdc);
                      hBitmap = CreateCompatibleBitmap(hdc, cxTotal, cyTotal);
                      SetBkMode (hdc, TRANSPARENT);
                      ReleaseDC(hwnd, hdc);
                      SelectObject(hdcMem, hBitmap);
                      Rectangle (hdcMem, -1, -1, cxTotal + 1, cyTotal + 1);
                      hBrush = CreateSolidBrush (RGB (150, 75, 0));
                      SelectObject(hdcMem, hBrush);
                      Ellipse (hdcMem, cxMove, cyMove, cxTotal - cxMove, cyTotal - cyMove);
                      DeleteDC(hdcMem);
                      DeleteObject(hBrush);
                    return 0;
        case WM_TIMER: if(!hBitmap)
                            break;
                       hdc = GetDC(hwnd);
                       hBrush = CreateSolidBrush (RGB (100, 100, 100)); 
                       SelectObject (hdc, hBrush);
                       Rectangle (hdc, 0, 0, 300, 300);
                       hdcMem = CreateCompatibleDC(hdc);
                       SelectObject(hdcMem, hBitmap);
                       SetBkMode (hdc, TRANSPARENT);
                       BitBlt(hdc, xCenter - cxTotal / 2, yCenter - cyTotal / 2, cxTotal, cyTotal, hdcMem, 0, 0, SRCCOPY);
                       ReleaseDC(hwnd, hdc);
                       DeleteDC(hdcMem);
                       xCenter += cxMove;
                       yCenter += cyMove;
                       if((xCenter + cxRadius >= cxClient) || (xCenter - cxRadius <= 0))
                            cxMove = -cxMove;
                       if((yCenter + cyRadius >= cyClient) || (yCenter - cyRadius <= 0))
                            cyMove = -cyMove;
                    return 0;
        case WM_DESTROY: if(hBitmap)
                            DeleteObject(hBitmap);
                         KillTimer(hwnd, 1);
                         PostQuitMessage(0);
                    return 0;
    }
 
    return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.04.2013, 01:28
Ответы с готовыми решениями:

Итерационная закраска эллипсов, утечка памяти
Добрый вечер. Есть программа для динамического моделирования частиц. В процессе отрисовки...

Создание и закраска Дочерних окон (Шахматная доска)
Суть задачи: Создать из дочерних окон доску закрашенную в шахматном порядке,при нажатий на...

Закраска фона в TabSheet
Доброго времени суток. Ребята подскажите как убрать отсюда закраску?

Формирование фона Sidebar'a графическим файлом и изменение размера фона
Фон сайд баров сформирован повторяющейся линий (графика в png). Как можно так подвигать этот...

5
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
07.04.2013, 03:20 2
Цитата Сообщение от RocBoy-D Посмотреть сообщение
куда вставить функцию SetBkMode (hdc, TRANSPARENT);, чтобы фон шара был прозрачным
не куда , она тебе не поможет

Добавлено через 5 минут
MSDN -
The SetBkMode function sets the background mix mode of the specified device context. The background mix mode is used with text, hatched brushes, and pen styles that are not solid lines.
1
41 / 40 / 23
Регистрация: 10.03.2012
Сообщений: 374
07.04.2013, 10:55  [ТС] 3
Игорь с++, а как тогда решить эту проблему? Может можно изменить цвет ограничивающего эллипс прямоугольника?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32836 / 21173 / 8148
Регистрация: 22.10.2011
Сообщений: 36,432
Записей в блоге: 8
07.04.2013, 11:34 4
Цитата Сообщение от RocBoy-D Посмотреть сообщение
а как тогда решить эту проблему?
Использовать TransparentBlt вместо твоего BitBlt по таймеру:
C++
1
2
TransparentBlt(hdc, xCenter - cxTotal / 2, yCenter - cyTotal / 2, 
   cxTotal, cyTotal, hdcMem, 0, 0, cxTotal, cyTotal, RGB(255, 255, 255));
Миниатюры
Закраска фона  
1
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
19.04.2014, 04:55 5
UI, Подскажите пожалуйста как мне выйти из положения с такой вот проблемой.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
case WM_PAINT: {
            PAINTSTRUCT ps;
            HDC hMemDc;
            HBITMAP hMemBmp;
 
            InvalidateRect(hWnd, NULL, FALSE);
            hdc = BeginPaint(hWnd, &ps);
 
 
            hMemDc = CreateCompatibleDC(hdc);
            hMemBmp =
            CreateCompatibleBitmap(hdc,HWND_PARENT_WIDTH, HWND_PARENT_HEIGTH);
 
            SelectObject(hMemDc, hMemBmp);
 
            vis::drawTextOnWindow(hMemDc);
            vis::darwSortBkground(hMemDc);
 
            /*TransparentBlt(hdc, 0, 0, HWND_PARENT_WIDTH,
                           HWND_PARENT_HEIGTH, hMemDc, 0, 0, HWND_PARENT_WIDTH,
                           HWND_PARENT_HEIGTH, RGB(255, 255, 255) );*/
            BitBlt(hdc, 0, 0, HWND_PARENT_WIDTH, HWND_PARENT_HEIGTH, hMemDc,
                   0, 0, SRCCOPY);
 
            DeleteDC(hMemDc);
            DeleteObject(hMemBmp);
            EndPaint(hWnd, &ps);
            break;
        }
Миниатюры
Закраска фона  
0
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
19.04.2014, 06:11 6
Пока что вышел из положения таким образом. Не уверен что это верное решение.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
case WM_PAINT: {
            PAINTSTRUCT ps;
            HDC hMemDc;
            HBITMAP hMemBmp;
            HPEN hPen = CreatePen(PS_SOLID, 2, RGB(110, 210, 152));
 
            InvalidateRect(hWnd, NULL, FALSE);
            hdc = BeginPaint(hWnd, &ps);
 
 
            hMemDc = CreateCompatibleDC(hdc);
            hMemBmp =
            CreateCompatibleBitmap(hdc,HWND_PARENT_WIDTH, HWND_PARENT_HEIGTH);
 
            SelectObject(hMemDc, hMemBmp);
            SelectObject(hMemDc, hPen);
 
            //vis::darwSortBkground(hMemDc);
 
            BitBlt(hdc, INSERT_SORT_X, INSERT_SORT_Y, SORT_WIND_WIDTH,
                   SORT_WIND_HEIGTH, hMemDc,
                   INSERT_SORT_X, INSERT_SORT_Y, SRCCOPY);
            BitBlt(hdc, MERGE_SORT_X, MERGE_SORT_Y, SORT_WIND_WIDTH,
                   SORT_WIND_HEIGTH, hMemDc,
                   MERGE_SORT_X, MERGE_SORT_Y, SRCCOPY);
            BitBlt(hdc, RADIX_SORT_X, RADIX_SORT_Y, SORT_WIND_WIDTH,
                   SORT_WIND_HEIGTH, hMemDc,
                   RADIX_SORT_X, RADIX_SORT_Y, SRCCOPY);
            BitBlt(hdc, SHELL_SORT_X, SHELL_SORT_Y, SORT_WIND_WIDTH,
                   SORT_WIND_HEIGTH, hMemDc,
                   SHELL_SORT_X, SHELL_SORT_Y, SRCCOPY);
 
            vis::drawTextOnWindow(hdc);
 
            DeleteDC(hMemDc);
            DeleteObject(hMemBmp);
            DeleteObject(hPen);
            EndPaint(hWnd, &ps);
            break;
        }
0
19.04.2014, 06:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.04.2014, 06:11
Помогаю со студенческими работами здесь

Закраска в C#
Помогите плиз!!!! Как нарисовать прямоугольник по заданным координатам. Координаты вводяться в...

Почему изменение фона затрагивает не только изменение фона поля ввода?
Почему изменение фона через BackColor затрагивает не только изменение фона поля ввода в...

закраска фигуры
помогите! на Image находится 7 треугольников. Нужно чтобы при нажатии мыши в любой части 1-го из...

Последовательная закраска
Подскажите, как в open gl сделать последовательную закраску прямоугольников? Есть программа,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru