Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
2 / 2 / 1
Регистрация: 11.05.2013
Сообщений: 99
1

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

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

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Вопрос вот в чем есть моя функция 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.05.2013, 02:19
Ответы с готовыми решениями:

указатель на буфер
помогите реализовать вот этот псевдокод http://s007.***********/i301/1011/33/b394f17effd1.jpg А...

Есть указатель на массив имён файлов. Считать в буфер содержимое первых и последних строк всех файлов
Есть указатель на массив имён файлов. Считать в буфер содержимое первых и последних строк всех...

Как получить ссылку на указатель или указатель на указатель в массиве?
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения...

А почему нельзя передавать в ф-ю добавления элемента в стек один указатель? Почему нужен именно указатель на указатель?
Вот код ф-ии добавления элемента в стек: void push1(Node **top, int d) { // top...

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

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

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

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

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

Добавлено через 7 минут
странно не заработало
0
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,424
24.05.2013, 02:52 6
Как пробовали? Как не работает?
0
2 / 2 / 1
Регистрация: 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
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,424
24.05.2013, 03:06 8
Написано вроде все правильно, вы уверены, что указатель передается при отсылке оконного собщения WM_PAINT? Или вы так обрабатываете стандартное уведомление от системы? :-)
0
2 / 2 / 1
Регистрация: 11.05.2013
Сообщений: 99
24.05.2013, 03:08  [ТС] 9
Цитата Сообщение от quwy Посмотреть сообщение
Написано вроде все правильно, вы уверены, что указатель передается при отсылке оконного собщения?
не совсем. смысл этого кода он должен заполнить весь экран пикселями определенного цвета. Учусь сам отрисовывать фон окна.
0
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,424
24.05.2013, 03:24 10
Тогда все не так. Вам в обработчик первым параметром передается дескриптор окна, вот по нему определяйте DC и рисуйте. И гляньте на msdn документацию по WM_PAINT.
0
2 / 2 / 1
Регистрация: 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
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,424
24.05.2013, 03:34 12
Ну с планшета я вам это не наишу :-)
Поищите алгоритм рисования линии, этого добра навалом.
0
24.05.2013, 03:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.05.2013, 03:34
Помогаю со студенческими работами здесь

Записать символ в буфер клавиатуры, проверить буфер на наличие в нём символов, и вывести данный символ
Доброго дня всем. Прошу помочь немного с несложной задачей, на использование прерывания INT 16h....

Указатель типа void. Использование косвенного связывания через универсальный указатель
Необходимо использовать косвенного связывания через универсальный указатель, примерный вид: struct...

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

Сохранить адрес из указателя в другой указатель, а потом первый указатель удалить
Добрый день всем. Возмём простейший пример: #include &lt;iostream&gt; using namespace std; int...


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

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