Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/32: Рейтинг темы: голосов - 32, средняя оценка - 4.81
22 / 7 / 2
Регистрация: 22.04.2010
Сообщений: 105
1

Графические примитивы

18.10.2010, 19:57. Показов 6284. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Изучаю WinApi по книге "Азбука программирования win32 Api". Код программы для рисования графических примитивов:
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <windows.h>
#include <ctime>
LRESULT CALLBACK DCDemoWndProc(HWND,UINT,UINT,LONG);
int randomize()
{
    srand(time(0));
    return 0;
}
 
int random(int N)
{
    return rand()%(N+1);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{
    HWND hWnd;
    WNDCLASS WndClass;
    MSG Msg;
    char szClassName[]="GraphDemo";
 
    WndClass.style=CS_HREDRAW|CS_VREDRAW;
    WndClass.lpfnWndProc=DCDemoWndProc;
    WndClass.cbClsExtra=0;
    WndClass.cbWndExtra=0;
    WndClass.hInstance=hInstance;
    WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    WndClass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
    WndClass.lpszMenuName="MyMenu";
    WndClass.lpszClassName=szClassName;
 
    if(!RegisterClass(&WndClass))
    {
        return 0;
    }
 
    hWnd=CreateWindow(szClassName,"Program #2",
        WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
        CW_USEDEFAULT,CW_USEDEFAULT,
        CW_USEDEFAULT,NULL,NULL,
        hInstance,NULL);
 
    if(!hWnd)
    {
        return 0;
    }
    
    ShowWindow(hWnd,nCmdShow);
    UpdateWindow(hWnd);
 
    while(GetMessage(&Msg,NULL,0,0))
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}
 
LRESULT CALLBACK GraphDemoWndProc(HWND hWnd, UINT Message, UINT wParam, LONG lParam)
{
    HDC hDC, hCompatibleDC;
    PAINTSTRUCT PaintStruct;
    RECT Rect;
    HBITMAP hCompatibleBitmap, hOldBitmap;
    HPEN hOldPen;
    static HPEN Pens[5];
    HBRUSH hOldBrush;
    static HBRUSH Brushes[5];
    int i;
 
    switch(Message)
    {
        case WM_PAINT:
            randomize();
            for(i=0;i<5;i++)
            {
                Pens[i]=(CreatePen(i,1,RGB(random(255),random(255),random(255))));
                Brushes[i]=(CreateHatchBrush(i,RGB(random(255),random(255),random(255))));
            }
            GetClientRect(hWnd,&Rect);
            hDC=BeginPaint(hWnd,&PaintStruct);
            hCompatibleBitmap=CreateCompatibleBitmap(hDC,Rect.right,Rect.bottom);
            hOldBitmap=SelectObject(hCompatibleDC,hCompatibleBitmap);
            PatBlt(hCompatibleDC,0,0,Rect.right,Rect.bottom,PATCOPY);
        //Drawing of pixels
            for(i=0;i<10000;i++)
                SetPixel(hCompatibleDC,random(Rect.right),random(Rect.bottom),RGB(random(255),random(255),random(255)));
        //Drawing of lines
            for(i=0;i<10;i++)
            {
                hOldPen=SelectObject(hCompatibleDC,Pens[random(4)]);
                MoveToEx(hCompatibleDC,random(Rect.right),random(Rect.bottom),NULL);
                LineTo(hCompatibleDC,random(Rect.right),random(Rect.bottom));
                SelectObject(hCompatibleDC,hOldPen);
            }
            BitBlt(hDC,PaintStruct.rcPaint.left,PaintStruct.rcPaint.top,
                PaintStruct.rcPaint.right,
                PaintStruct.rcPaint.bottom,
                hCompatibleDC,
                PaintStruct.rcPaint.left,
                PaintStruct.rcPaint.top,
                SRCCOPY);
            for(i=0;i<5;i++)
            {
                DeleteObject(Pens[i]);
                DeleteObject(Brushes[i]);
            }
            SelectObject(hCompatibleDC,hOldBitmap);
            DeleteObject(hCompatibleBitmap);
            DeleteDC(hCompatibleDC);
            EndPaint(hWnd,&PaintStruct);
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }
    return DefWindowProc(hWnd,Message,wParam,lParam);
}
Ругается на
C++
1
2
hOldBitmap=SelectObject(hCompatibleDC,hCompatibleBitmap);
 error C2440: =: невозможно преобразовать 'HGDIOBJ' в 'HBITMAP'
и на
C++
1
2
hOldPen=SelectObject(hCompatibleDC,Pens[random(4)]);
error C2440: =: невозможно преобразовать 'HGDIOBJ' в 'HPEN'
в чем проблема?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.10.2010, 19:57
Ответы с готовыми решениями:

Вывести графические примитивы
Как вывести графических примитивов (прямоугольники, эллипсы, дуги и т.п.) с использованием...

Графические возможности
Приветствую, я до сегодня только консольным приложением довольствовался, пока язык изучал. ...

Графические примитивы в С++
Добрый день! Хотел бы спросить вашего совета - в программе необходимо нарисовать простенькие...

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

6
4 / 4 / 1
Регистрация: 17.01.2010
Сообщений: 41
18.10.2010, 19:59 2
C++
1
2
hOldBitmap=(HBITMAP)SelectObject(hCompatibleDC,hCompatibleBitmap);
hOldPen=(HPEN)SelectObject(hCompatibleDC,Pens[random(4)]);
Не нравятся типы приведите их к одинаковым
1
22 / 7 / 2
Регистрация: 22.04.2010
Сообщений: 105
18.10.2010, 22:45  [ТС] 3
Ну в общем нашел ошибки, исправил
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <windows.h>
#include <ctime>
LRESULT CALLBACK GraphDemoWndProc(HWND,UINT,UINT,LONG);
int randomize()
{
    srand(time(0));
    return 0;
}
 
int random(int N)
{
    return rand()%(N+1);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{
    HWND hWnd;
    WNDCLASS WndClass;
    MSG Msg;
    char szClassName[]="GraphDemo";
 
    WndClass.style=CS_HREDRAW|CS_VREDRAW;
    WndClass.lpfnWndProc=GraphDemoWndProc;
    WndClass.cbClsExtra=0;
    WndClass.cbWndExtra=0;
    WndClass.hInstance=hInstance;
    WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    WndClass.lpszMenuName="MyMenu";
    WndClass.lpszClassName=szClassName;
 
    if(!RegisterClass(&WndClass))
    {
        return 0;
    }
 
    hWnd=CreateWindow(szClassName,"Program #2",
        WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
        CW_USEDEFAULT,CW_USEDEFAULT,
        CW_USEDEFAULT,NULL,NULL,
        hInstance,NULL);
 
    if(!hWnd)
    {
        return 0;
    }
    
    ShowWindow(hWnd,nCmdShow);
    UpdateWindow(hWnd);
 
    while(GetMessage(&Msg,NULL,0,0))
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}
 
LRESULT CALLBACK GraphDemoWndProc(HWND hWnd, UINT Message, UINT wParam, LONG lParam)
{
    HDC hDC, hCompatibleDC;
    PAINTSTRUCT PaintStruct;
    RECT Rect;
    HBITMAP hCompatibleBitmap, hOldBitmap;
    HPEN hOldPen;
    static HPEN Pens[5];
    HBRUSH hOldBrush;
    static HBRUSH Brushes[5];
    int i;
 
    switch(Message)
    {
        case WM_PAINT:
            randomize();
            for(i=0;i<5;i++)
            {
                Pens[i]=(CreatePen(i,1,RGB(random(255),random(255),random(255))));
                Brushes[i]=(CreateHatchBrush(i,RGB(random(255),random(255),random(255))));
            }
            GetClientRect(hWnd,&Rect);
            hDC=BeginPaint(hWnd,&PaintStruct);
            hCompatibleDC=CreateCompatibleDC(hDC);
            hCompatibleBitmap=CreateCompatibleBitmap(hDC,Rect.right,Rect.bottom);
            hOldBitmap=(HBITMAP)SelectObject(hDC,hCompatibleBitmap);
            PatBlt(hCompatibleDC,0,0,Rect.right,Rect.bottom,PATCOPY);
        //Drawing of pixels
            for(i=0;i<10000;i++)
                SetPixel(hCompatibleDC,random(Rect.right),random(Rect.bottom),RGB(random(255),random(255),random(255)));
        //Drawing of lines
            for(i=0;i<10;i++)
            {
                hOldPen=(HPEN)SelectObject(hCompatibleDC,Pens[random(4)]);
                MoveToEx(hCompatibleDC,random(Rect.right),random(Rect.bottom),NULL);
                LineTo(hCompatibleDC,random(Rect.right),random(Rect.bottom));
                SelectObject(hCompatibleDC,hOldPen);
            }
            BitBlt(hDC,PaintStruct.rcPaint.left,PaintStruct.rcPaint.top,
                PaintStruct.rcPaint.right,
                PaintStruct.rcPaint.bottom,
                hCompatibleDC,
                PaintStruct.rcPaint.left,
                PaintStruct.rcPaint.top,
                SRCCOPY);
            for(i=0;i<5;i++)
            {
                DeleteObject(Pens[i]);
                DeleteObject(Brushes[i]);
            }
            SelectObject(hCompatibleDC,hOldBitmap);
            DeleteObject(hCompatibleBitmap);
            DeleteDC(hCompatibleDC);
            EndPaint(hWnd,&PaintStruct);
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }
    return DefWindowProc(hWnd,Message,wParam,lParam);
}
Но она ниче не рисует)))

Добавлено через 2 часа 5 минут
рисует, только если в функциях SetPixel, MoveToEx, LineTo вместо hCompatibleDC писать hDC

Добавлено через 22 минуты
Т.е. функция BitBlt не копирует контекст из памяти...
0
1 / 1 / 0
Регистрация: 11.09.2011
Сообщений: 3
11.09.2011, 15:45 4
Что должна делать эта программа? У меня просто окно белое после компиляции??
подскажите, что не так делаю..
есть ли у кого код для того, чтоб сделать аналог пейнта. можнарисовать стирать и выбирать цвет?
0
935 / 760 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
15.09.2011, 02:01 5
Цитата Сообщение от dreamminister Посмотреть сообщение
есть ли у кого код для того, чтоб сделать аналог пейнта. можнарисовать стирать и выбирать цвет?
Вот по-твоей просьбе накидал не большой демо-растровый редактор, внизу скриншот проги и созданной в нём картинке.
Миниатюры
Графические примитивы  
Вложения
Тип файла: rar xAtomPaint.rar (226.1 Кб, 271 просмотров)
3
1 / 1 / 0
Регистрация: 11.09.2011
Сообщений: 3
16.09.2011, 10:19 6
Большое спасибо!
1
98 / 101 / 30
Регистрация: 21.10.2012
Сообщений: 320
24.12.2012, 14:28 7
Вот рабочий вариант, то что не работало у ТС. Пригодится кому-нибудь.

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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <windows.h>
#include <tchar.h>
#include <time.h>
 
LRESULT CALLBACK GraphDemoWndProc(HWND, UINT, UINT, LONG);
 
int random(int n)
{
    return rand() % (n + 1);
}
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{
    HWND     hWnd;
    WNDCLASS WndClass;
    MSG      Msg;
 
    LPCWSTR className = _TEXT("GraphDemo");
 
    WndClass.style         = CS_HREDRAW | CS_VREDRAW;
    WndClass.lpfnWndProc   = GraphDemoWndProc;
    WndClass.cbClsExtra    = 0;
    WndClass.cbWndExtra    = 0;
    WndClass.hInstance     = hInstance;
    WndClass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    WndClass.hCursor       = LoadCursor(NULL, IDC_ARROW);
    WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    WndClass.lpszMenuName  = NULL;
    WndClass.lpszClassName = className;
 
    if (!RegisterClass(&WndClass))
    {
        MessageBox(NULL, _TEXT("Cannot register class"), _TEXT("Error"), MB_OK);
        return 0;
    }
 
    hWnd = CreateWindow(className, _TEXT("Graph Demo"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
 
    if (!hWnd)
    {
        MessageBox(NULL, _TEXT("Cannot create window"), _TEXT("Error"), MB_OK);
        return 0;
    }
 
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
 
    while (GetMessage(&Msg, NULL, 0, 0))
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
 
    return Msg.wParam;
}
 
LRESULT CALLBACK GraphDemoWndProc(HWND hWnd, UINT Message, UINT wParam, LONG lParam)
{
    HDC           hDC;
    HDC           hCompatibleDC;
    PAINTSTRUCT   PaintStruct;
    RECT          Rect;
    HBITMAP       hCompatibleBitmap;
    HBITMAP       hOldBitmap;
    HPEN          hOldPen;
    static HPEN   Pens[5];
    HBRUSH        hOldBrush;
    static HBRUSH Brushes[6];
 
    switch (Message)
    {
        case WM_PAINT:
        {
            srand(static_cast<unsigned>(time(NULL)));
 
            for (int i = 0; i <= 4; ++i)
            {
                Pens[i] = (CreatePen(i, 1, RGB(random(255), random(255), random(255))));
                Brushes[i] = (CreateHatchBrush(i, RGB(random(255), random(255), random(255))));
            }
 
            GetClientRect(hWnd, &Rect);
            hDC = BeginPaint(hWnd, &PaintStruct);
            hCompatibleDC = CreateCompatibleDC(hDC);
            GetClientRect(hWnd, &Rect);
            hCompatibleBitmap = CreateCompatibleBitmap(hDC, Rect.right, Rect.bottom);
            hOldBitmap = (HBITMAP)SelectObject(hCompatibleDC, hCompatibleBitmap);
            PatBlt(hCompatibleDC, 0, 0, Rect.right, Rect.bottom, PATCOPY);
 
            for (int i = 0; i <= 9999; ++i)
            {
                SetPixel(hCompatibleDC, random(Rect.right), random(Rect.bottom), RGB(random(255), random(255), random(255)));
            }
 
            for (int i = 0; i <= 9; ++i)
            {
                hOldPen = (HPEN)SelectObject(hCompatibleDC, Pens[random(4)]);
                MoveToEx(hCompatibleDC, random(Rect.right), random(Rect.bottom), NULL);
                LineTo(hCompatibleDC, random(Rect.right), random(Rect.bottom));
                SelectObject(hCompatibleDC, hOldPen);
            }
 
            for (int i = 0; i <= 5; ++i)
            {
                hOldBrush = (HBRUSH)SelectObject(hCompatibleDC, Brushes[random(4)]);
                Rectangle(hCompatibleDC, random(Rect.right), random(Rect.bottom), random(Rect.right), random(Rect.bottom));
                Ellipse(hCompatibleDC, random(Rect.right), random(Rect.bottom), random(Rect.right), random(Rect.bottom));
                SelectObject(hCompatibleDC, hOldBrush);
            }
 
            BitBlt(hDC, PaintStruct.rcPaint.left, PaintStruct.rcPaint.top, PaintStruct.rcPaint.right, PaintStruct.rcPaint.bottom, hCompatibleDC, PaintStruct.rcPaint.left, PaintStruct.rcPaint.top, SRCCOPY);
 
            for (int i = 0; i <= 4; ++i)
            {
                DeleteObject(Pens[i]);
                DeleteObject(Brushes[i]);
            }
 
            SelectObject(hCompatibleDC, hOldBitmap);
            DeleteObject(hCompatibleBitmap);
            DeleteDC(hCompatibleDC);
            EndPaint(hWnd, &PaintStruct);
            return 0;
        }
        case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;
        }
    }
 
    return DefWindowProc(hWnd, Message, wParam, lParam);
}
3
24.12.2012, 14:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.12.2012, 14:28
Помогаю со студенческими работами здесь

Графические примитивы (кнопки)
Я понимаю, что мой вопрос глупый, но в самоучителе по Билдеру такого не нашла Если мне необходимо,...

графические примитивы в С++ Builder
Здравствуйте, уважаемые программисты! Хотел спросить у вас совета. у меня возник вопрос в...

Создать графические примитивы в C++
Помогите , срочно нужна программа в которой графические примитивы(круг,квадрат, линия)...

Работа в графическом режиме. Графические примитивы, движение объектов.
В соответствии с возникающими ассоциациями от словесного описания картины, нарисовать ее...

Создать программу, которая способна генерировать геометрические примитивы
Четвёртая: Создать программу, которая способна генерировать (или создать на основе введённых...

Графические библиотеки
Посоветуйте какую-нибудь простенькую графическую библиотеку с минимальным набором функций:...


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

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