Форум программистов, компьютерный форум CyberForum.ru

Указатель на буфер - C++

Восстановить пароль Регистрация
 
Auron
2 / 2 / 0
Регистрация: 11.05.2013
Сообщений: 99
24.05.2013, 02:19     Указатель на буфер #1
Доброго времени суток. Вопрос вот в чем есть моя функция drawLine:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void Windows::drawLine(int x1, int y1, int x2, int y2, char* bitmap, int bitmap_width, int bitmap_height)
{
    BITMAPINFO* bi = new BITMAPINFO;
 
    int* ptr = new int [bitmap_width * bitmap_height];
 
    bi->bmiHeader.biSize        = sizeof(BITMAPINFO);
    bi->bmiHeader.biWidth       = bitmap_width;
    bi->bmiHeader.biHeight      = -bitmap_height;
    bi->bmiHeader.biPlanes      = 1;
    bi->bmiHeader.biBitCount    = 32;
    bi->bmiHeader.biSizeImage   = 0;
    bi->bmiHeader.biCompression = BI_RGB;   
 
    for(int y = 0; y < bitmap_height; ++y)
    {
        for(int x = 0; x < bitmap_width; ++x)
        {
            ptr[y * bitmap_width + x] = 0xff0000ff;
        }
    }
    SetDIBitsToDevice(ps.hdc, 0, 0, bitmap_width, bitmap_height, 0, 0, 0, bitmap_height, ptr, bi, DIB_RGB_COLORS);
}
нужно передать в функцию MainWindowProc указатель на буфер ptr.

C++
1
2
3
4
5
6
7
8
9
10
11
12
LRESULT CALLBACK MainWindowProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    switch (msg)
    {
    case WM_PAINT:
        {
            BeginPaint(hWnd, &ps);
            _window.drawLine(50,100,100,150,ptr,800,600);
            EndPaint(hWnd, &ps);
        }
        break;
как это лучше сделать. компилятор ругается на ptr в строке _window.drawLine(50,100,100,150,ptr,800,600);подскажите. заранее спасибо)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2013, 02:19     Указатель на буфер
Посмотрите здесь:

C++ Функция принимает указатель на void и возвращает указатель на int
Указатель или ссылка на указатель. В чем разница? C++
Приведение любого двумерного массива к типу указатель на указатель C++
Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель C++
Функция, получающая указатель на обычную функцию, получает указатель на метод класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
quwy
Native x86
 Аватар для quwy
2735 / 1824 / 477
Регистрация: 13.02.2013
Сообщений: 6,113
24.05.2013, 02:34     Указатель на буфер #2
У вас ptr внутри MainWindowProc() никак не обьявлен. Предлагаете компилятору самому придумать адрес буфера изображения?
Auron
2 / 2 / 0
Регистрация: 11.05.2013
Сообщений: 99
24.05.2013, 02:35  [ТС]     Указатель на буфер #3
Цитата Сообщение от quwy Посмотреть сообщение
У вас ptr внутри MainWindowProc() никак не обьявлен. Предлагаете компилятору самому придумать адрес буфера изображения?
получается указатель лучше сделать глобальным? я понимаю что нигде не объявлен я спрашиваю совета как лучше поступить
quwy
Native x86
 Аватар для quwy
2735 / 1824 / 477
Регистрация: 13.02.2013
Сообщений: 6,113
24.05.2013, 02:36     Указатель на буфер #4
А передать можно через lParam или wParam, приведя перед этим к соответствующему типу. Эти параметры для того и существуют.

Добавлено через 38 секунд
Глобальные переменные -- последнее дело.

Сорри, пишу с планшета :-)
Auron
2 / 2 / 0
Регистрация: 11.05.2013
Сообщений: 99
24.05.2013, 02:49  [ТС]     Указатель на буфер #5
Цитата Сообщение от quwy Посмотреть сообщение
А передать можно через lParam или wParam, приведя перед этим к соответствующему типу. Эти параметры для того и существуют.

Добавлено через 38 секунд
Глобальные переменные -- последнее дело.

Сорри, пишу с планшета :-)
Ды ничего спасибо. Буду сейчас пробовать. Отпишусь по результатам)

Добавлено через 7 минут
странно не заработало
quwy
Native x86
 Аватар для quwy
2735 / 1824 / 477
Регистрация: 13.02.2013
Сообщений: 6,113
24.05.2013, 02:52     Указатель на буфер #6
Как пробовали? Как не работает?
Auron
2 / 2 / 0
Регистрация: 11.05.2013
Сообщений: 99
24.05.2013, 02:53  [ТС]     Указатель на буфер #7
Цитата Сообщение от quwy Посмотреть сообщение
Как пробовали? Как не работает?
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
void Windows::drawLine(int x1, int y1, int x2, int y2, char* bitmap, int bitmap_width, int bitmap_height)
{
    BITMAPINFO* bi = new BITMAPINFO;
    int* ptr = new int [bitmap_width * bitmap_height];
 
    bi->bmiHeader.biSize        = sizeof(BITMAPINFO);
    bi->bmiHeader.biWidth       = bitmap_width;
    bi->bmiHeader.biHeight      = -bitmap_height;
    bi->bmiHeader.biPlanes      = 1;
    bi->bmiHeader.biBitCount    = 32;
    bi->bmiHeader.biSizeImage   = 0;
    bi->bmiHeader.biCompression = BI_RGB;   
    for(int y = 0; y < bitmap_height; ++y)
    {
        for(int x = 0; x < bitmap_width; ++x)
        {
            ptr[y * bitmap_width + x] = 0xff0000ff;
        }
    }
    SetDIBitsToDevice(ps.hdc, 0, 0, bitmap_width, bitmap_height, 0, 0, 0, bitmap_height, ptr, bi, DIB_RGB_COLORS);
}
 
LRESULT CALLBACK MainWindowProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    switch (msg)
    {
    case WM_PAINT:
        {
            BeginPaint(hWnd, &ps);
            _window.drawLine(50,100,100,150,(char*)wParam,800,600);
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_KEYDOWN:
        {
            if (wParam == VK_ESCAPE)
            {
                DestroyWindow(hWnd);
                PostQuitMessage(0);
            }
            if (wParam == VK_UP)
            {
                MessageBoxEx(hWnd, "Нажата клавиша UP", "Test Window", MB_OK, 0);
            }
        }
        break;      
    }
    return DefWindowProc(hWnd, msg, wParam, lParam);
}
quwy
Native x86
 Аватар для quwy
2735 / 1824 / 477
Регистрация: 13.02.2013
Сообщений: 6,113
24.05.2013, 03:06     Указатель на буфер #8
Написано вроде все правильно, вы уверены, что указатель передается при отсылке оконного собщения WM_PAINT? Или вы так обрабатываете стандартное уведомление от системы? :-)
Auron
2 / 2 / 0
Регистрация: 11.05.2013
Сообщений: 99
24.05.2013, 03:08  [ТС]     Указатель на буфер #9
Цитата Сообщение от quwy Посмотреть сообщение
Написано вроде все правильно, вы уверены, что указатель передается при отсылке оконного собщения?
не совсем. смысл этого кода он должен заполнить весь экран пикселями определенного цвета. Учусь сам отрисовывать фон окна.
quwy
Native x86
 Аватар для quwy
2735 / 1824 / 477
Регистрация: 13.02.2013
Сообщений: 6,113
24.05.2013, 03:24     Указатель на буфер #10
Тогда все не так. Вам в обработчик первым параметром передается дескриптор окна, вот по нему определяйте DC и рисуйте. И гляньте на msdn документацию по WM_PAINT.
Auron
2 / 2 / 0
Регистрация: 11.05.2013
Сообщений: 99
24.05.2013, 03:27  [ТС]     Указатель на буфер #11
Цитата Сообщение от quwy Посмотреть сообщение
Написано вроде все правильно, вы уверены, что указатель передается при отсылке оконного собщения WM_PAINT? Или вы так обрабатываете стандартное уведомление от системы? :-)
Спасибо я решил так:
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
68
69
void Windows::drawLine(int x1, int y1, int x2, int y2, int* bitmap, int bitmap_width, int bitmap_height)
{
    int width = 800;
    int height = 600;
 
    int* ptr = new int [width * height];
 
    for (int i = 0; i < width; ++i)
    {
        ptr[i] = 0xff00ff;
    }
    
 
}
 
LRESULT CALLBACK MainWindowProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    BITMAPINFO* bi = new BITMAPINFO;
 
    int width = 800;
    int height = 600;
 
    int* ptr = new int [width * height];
 
    bi->bmiHeader.biSize        = sizeof(BITMAPINFO);
    bi->bmiHeader.biWidth       = width;
    bi->bmiHeader.biHeight      = -height;
    bi->bmiHeader.biPlanes      = 1;
    bi->bmiHeader.biBitCount    = 32;
    bi->bmiHeader.biSizeImage   = 0;
    bi->bmiHeader.biCompression = BI_RGB;   
 
    for(int y = 0; y < height; ++y)
    {
        for(int x = 0; x < width; ++x)
        {
            ptr[y * width + x] = 0xff0000ff;
        }
    }
 
    _window.drawLine(10, 50, 100, 150, ptr, width, height);
 
    switch (msg)
    {
    case WM_PAINT:
        {
            BeginPaint(hWnd, &ps);
            SetDIBitsToDevice(ps.hdc, 0, 0, width, height, 0, 0, 0, height, ptr, bi, DIB_RGB_COLORS);
            EndPaint(hWnd, &ps);
        }
        break;
 
    case WM_KEYDOWN:
        {
            if (wParam == VK_ESCAPE)
            {
                DestroyWindow(hWnd);
                PostQuitMessage(0);
            }
            if (wParam == VK_UP)
            {
                MessageBoxEx(hWnd, "Нажата клавиша UP", "Test Window", MB_OK, 0);
            }
        }
        break;      
    }
    return DefWindowProc(hWnd, msg, wParam, lParam);
}
Последняя просьба помогите с рисовкой линии по точкам функцией drawLine. этот цикл если я его использую в MainWindowProc работает рисуется линия, а как правильно перенести этот цикл в drawLine
C++
1
2
3
4
for (int i = 0; i < width; ++i)
    {
        ptr[i] = 0xff00ff;
    }
чтобы при можно было указывать начальные и конечные координаты точек для отрисовки линии.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.05.2013, 03:34     Указатель на буфер
Еще ссылки по теме:

Расскажите, как здесь работает указатель на указатель? C++
Почему указатель на указатель объявляется как float **A; C++
C++ Как правильно удалять выделенную память под указатель на указатель?

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

Или воспользуйтесь поиском по форуму:
quwy
Native x86
 Аватар для quwy
2735 / 1824 / 477
Регистрация: 13.02.2013
Сообщений: 6,113
24.05.2013, 03:34     Указатель на буфер #12
Ну с планшета я вам это не наишу :-)
Поищите алгоритм рисования линии, этого добра навалом.
Yandex
Объявления
24.05.2013, 03:34     Указатель на буфер
Ответ Создать тему
Опции темы

Текущее время: 17:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru