Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Auron
2 / 2 / 0
Регистрация: 11.05.2013
Сообщений: 99
#1

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

24.05.2013, 02:19. Просмотров 831. Ответов 11
Метки нет (Все метки)

Доброго времени суток. Вопрос вот в чем есть моя функция 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);подскажите. заранее спасибо)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2013, 02:19
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Указатель на буфер (C++):

Как получить ссылку на указатель или указатель на указатель в массиве? - C++
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

Функция, получающая указатель на обычную функцию, получает указатель на метод класса - C++
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть функция( f ), которая принимает указатель на функцию и...

Функция, принимающая указатель и число байт и выделяющая память под указатель - C++
Здравствуйте. Задача легкая, но почему-то завис Нужно написать функцию, принимающую указатель и число байт и выделяющую память под...

Как правильно удалять выделенную память под указатель на указатель? - C++
есть код #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; using namespace std; void sort_1(const...

Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель - C++
Всем привет, встретил в книге такой пример добавления узла в дерево: typedef struct tree { int data; tree *left, *right,...

Зачем нужен указатель на указатель при работе с однонаправленным списком? - C++
День добрый. Столкнулся с непониманием этой темы. В частности, совершенно непонятен алгоритм инициализации такого вот списка. Например:...

11
quwy
Native x86
3332 / 2179 / 597
Регистрация: 13.02.2013
Сообщений: 7,239
24.05.2013, 02:34 #2
У вас ptr внутри MainWindowProc() никак не обьявлен. Предлагаете компилятору самому придумать адрес буфера изображения?
0
Auron
2 / 2 / 0
Регистрация: 11.05.2013
Сообщений: 99
24.05.2013, 02:35  [ТС] #3
Цитата Сообщение от quwy Посмотреть сообщение
У вас ptr внутри MainWindowProc() никак не обьявлен. Предлагаете компилятору самому придумать адрес буфера изображения?
получается указатель лучше сделать глобальным? я понимаю что нигде не объявлен я спрашиваю совета как лучше поступить
0
quwy
Native x86
3332 / 2179 / 597
Регистрация: 13.02.2013
Сообщений: 7,239
24.05.2013, 02:36 #4
А передать можно через lParam или wParam, приведя перед этим к соответствующему типу. Эти параметры для того и существуют.

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

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

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

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

Добавлено через 7 минут
странно не заработало
0
quwy
Native x86
3332 / 2179 / 597
Регистрация: 13.02.2013
Сообщений: 7,239
24.05.2013, 02:52 #6
Как пробовали? Как не работает?
0
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);
}
0
quwy
Native x86
3332 / 2179 / 597
Регистрация: 13.02.2013
Сообщений: 7,239
24.05.2013, 03:06 #8
Написано вроде все правильно, вы уверены, что указатель передается при отсылке оконного собщения WM_PAINT? Или вы так обрабатываете стандартное уведомление от системы? :-)
0
Auron
2 / 2 / 0
Регистрация: 11.05.2013
Сообщений: 99
24.05.2013, 03:08  [ТС] #9
Цитата Сообщение от quwy Посмотреть сообщение
Написано вроде все правильно, вы уверены, что указатель передается при отсылке оконного собщения?
не совсем. смысл этого кода он должен заполнить весь экран пикселями определенного цвета. Учусь сам отрисовывать фон окна.
0
quwy
Native x86
3332 / 2179 / 597
Регистрация: 13.02.2013
Сообщений: 7,239
24.05.2013, 03:24 #10
Тогда все не так. Вам в обработчик первым параметром передается дескриптор окна, вот по нему определяйте DC и рисуйте. И гляньте на msdn документацию по WM_PAINT.
0
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;
    }
чтобы при можно было указывать начальные и конечные координаты точек для отрисовки линии.
0
quwy
Native x86
3332 / 2179 / 597
Регистрация: 13.02.2013
Сообщений: 7,239
24.05.2013, 03:34 #12
Ну с планшета я вам это не наишу :-)
Поищите алгоритм рисования линии, этого добра навалом.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.05.2013, 03:34
Привет! Вот еще темы с ответами:

Приведение любого двумерного массива к типу указатель на указатель - C++
Допустим, есть несколько массивов int arr1; int arr2; int arr3; Какое преобразование нужно сделать, чтобы подобные присвоения...

Функция принимает указатель на void и возвращает указатель на int - C++
Запишите прототип функции, которая принимает указатель на void и возвращает указатель на int.

Объяснить работу функции, возвращающей указатель на указатель на char - C++
Добрый день! Сможете объяснить что означает запись char **InputFile(int &amp;strings);? Почему именно двойное **? Буду очень благодарна...

Передача умного указателя в функцию принимающую указатель на указатель - C++
Итак имеется функция со следующим параметром: HRESULT __stdcall Function(SomeClass **param); В случае, когда создаём обычный...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru