Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 26.02.2018
Сообщений: 11
1

Как можно отразить загружаемое изображение по горизонтали/вертикали ?

21.07.2019, 09:47. Показов 3040. Ответов 8

Здравствуйте, хотел написать мини игру по типу марио, и логично что при движении в разные стороны персонаж должен и смотреть в разные стороны, сам персонаж загружен из битмапа, а рисется в окне через маску (MaskBlt()), но вот как реализовать отображение в разные стороны не знаю ) Помогите пожалуйста ) Вот код прорисовки, рисую в потоке :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    while (true) {
        int x = 0;
        StretchBlt(cwinDC, 0, 0, rWindow.right, rWindow.bottom + 80, fonDC, 0, 0, 1920, 1080, SRCCOPY);
 
        while (x <= rWindow.right) {
            StretchBlt(cwinDC, x, rWindow.bottom - bm.bmHeight *3,
                bm.bmWidth * 3, bm.bmHeight * 3, groundDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
            x += bm.bmWidth * 3;
        }
        
        MaskBlt(cwinDC, rWindow.left + xPl, (rWindow.bottom - bm.bmHeight*2) - (yPl-8), bmSteve.bmWidth, bmSteve.bmHeight, steveDC, 0, 0, bmpMask, 0, 0, 0xaacc0020);
        
        InvalidateRect(hWnd, &rWindow, FALSE);
        Sleep(60);
    }
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.07.2019, 09:47
Ответы с готовыми решениями:

Как скроллить изображение по вертикали и горизонтали?
Привет великие обитатели сего форума, нужна ваша помощь, проблема в следующем. есть форма на ней...

Отразить изображение по горизонтали
Ниже приведен код, выводящий изображение на экран. Задача: отразить изображение во горизонтали....

Imageview растянуть изображение по вертикали и обрезать по горизонтали
Здравствуйте, для фона бокового меню нужно поместить картинку, что б по вертикали растягивалась, а...

Как отразить картинку по горизонтали ?
Как в фотошопе эффект зеркальное отражение

8
2177 / 713 / 275
Регистрация: 10.02.2018
Сообщений: 1,674
21.07.2019, 11:10 2
Лучший ответ Сообщение было отмечено Kiriston как решение

Решение

Для отражения можно задавать отрицательную ширину и высоту конечного прямоугольника.
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
void OnPaint(HWND hWnd)
{
    PAINTSTRUCT ps;
    HDC dc = BeginPaint(hWnd, &ps);
 
    if (g_hBitmap)
    {
        BITMAP bm;
        GetObject(g_hBitmap, sizeof(bm), &bm);
 
        RECT client;
        GetClientRect(hWnd, &client);
 
        HDC mdc = CreateCompatibleDC(dc);
        HBITMAP mbm = (HBITMAP)SelectObject(mdc, g_hBitmap);
 
        // нормальный вывод
        //StretchBlt(dc, 0, 0, client.right, client.bottom, mdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
 
        // отражение по вертикали
        StretchBlt(dc, 0, client.bottom, client.right, -client.bottom, mdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
 
        // отражение по вертикали и горизонтали
        //StretchBlt(dc, client.right, client.bottom, -client.right, -client.bottom, mdc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
 
        SelectObject(mdc, mbm);
        DeleteDC(mdc);
    }
 
    EndPaint(hWnd, &ps);
}
1
1 / 1 / 0
Регистрация: 26.02.2018
Сообщений: 11
21.07.2019, 11:46  [ТС] 3
Попробовал указать отрицательные значения ширины и высоты но изображение просто не выводится, можете пожалуйста привести пример с функцией MaskBlt() ?

У меня получился такой вызов функции:
C++
1
MaskBlt(cwinDC, rWindow.left + xPl, (rWindow.bottom - bm.bmHeight * 2) - (yPl - 8), bmSteve.bmWidth, -bmSteve.bmHeight, steveDC, 0, 0, bmpMask, 0, 0, 0xaacc0020);
0
2177 / 713 / 275
Регистрация: 10.02.2018
Сообщений: 1,674
21.07.2019, 12:45 4
Похоже, что MaskBlt не поддерживает данного функционала.
1
1 / 1 / 0
Регистрация: 26.02.2018
Сообщений: 11
21.07.2019, 12:46  [ТС] 5
А другие способы есть?
0
2177 / 713 / 275
Регистрация: 10.02.2018
Сообщений: 1,674
21.07.2019, 13:45 6
Лучший ответ Сообщение было отмечено Kiriston как решение

Решение

Можно использовать разные картинки для разных направлений.
Второй комплект можно нарисовать или создать из первых повернув их программно с помощью Blt или напрямую оперируя битами.
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
HBITMAP CopyBitmap(HBITMAP hbm, bool reflexH, bool reflexV)
{
    HDC dc = GetDC(0);
 
    BITMAP bm;
    GetObject(hbm, sizeof(bm), &bm);
 
    HDC dc1 = CreateCompatibleDC(dc);
    HDC dc2 = CreateCompatibleDC(dc);
 
    HBITMAP old1 = (HBITMAP)SelectObject(dc1, hbm);
    HBITMAP hbm2 = CreateCompatibleBitmap(dc1, bm.bmWidth, bm.bmHeight);
    HBITMAP old2 = (HBITMAP)SelectObject(dc2, hbm2);
 
    int x = (reflexH) ? (bm.bmWidth - 1) : 0;
    int y = (reflexV) ? (bm.bmHeight - 1) : 0;
    int w = (reflexH) ? -bm.bmWidth : bm.bmWidth;
    int h = (reflexV) ? -bm.bmHeight : bm.bmHeight;
 
    StretchBlt(dc2, x, y, w, h, dc1, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
 
    SelectObject(dc2, old2);
    SelectObject(dc1, old1);
 
    DeleteDC(dc2);
    DeleteDC(dc1);
 
    ReleaseDC(0, dc);
 
    return hbm2;
}
1
1 / 1 / 0
Регистрация: 26.02.2018
Сообщений: 11
21.07.2019, 13:55  [ТС] 7
Спасибо ! Буду что то думать на этот счет )
Вот еще вопрос, почему при такой загрузке битмапа
C++
1
hSteve = (HBITMAP)LoadImage(NULL, L"Steve.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_LOADTRANSPARENT);
когда его рисую с помощью BitBlt фон у изображения не прозрачный т.е. LR_LOADTRANSPARENT не сработал ? Или есть какие то условия та корректной работы этого флага ?
0
2177 / 713 / 275
Регистрация: 10.02.2018
Сообщений: 1,674
21.07.2019, 14:14 8
Вроде как BitBlt не поддерживает работу с прозрачностью. Для этого есть специальные варианты функций TransparentBlt и AlphaBlend. Можно попробовать их.
1
1 / 1 / 0
Регистрация: 26.02.2018
Сообщений: 11
21.07.2019, 14:16  [ТС] 9
Спасибо за помощь и уделенное время )
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.07.2019, 14:16

Как отразить по горизонтали содержимое StringGrid?
Как отразить по горизонтали содержимое StringGrid при нажатии на соответствующую кнопку? при этом...

Как отразить картинку по горизонтали в Imagebox
Нужно картинку отразить как в adobe photoshop ? По горизонтали зеркальное отражение типо как сделать

Как отрисовывать меню по вертикали и горизонтали?
Имеется меню следующего вида function ShowTree($parent, $lvl) { global $link; ...

Как расположить 4 картинки по горизонтали и 2 по вертикали в 2 ряда
хотел бы узнать как сделать 4 картинки по горизонтале а 2 по вертикале короче в 2 ряда **** **** ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru