14 / 14 / 4
Регистрация: 08.11.2010
Сообщений: 172
1

Не рисует

03.04.2012, 22:01. Показов 958. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
// --- Обязательный включаемый файл
#include <windows.h>
#include <math.h>
#define PI 3.14156
void ugol(HDC hDC,int x1,int y1,int x2,int y2,int x3,int y3,int n);
void star(HDC hDC,struct STAR str);
void ugol(HDC hDC,int x1,int y1,int x2,int y2,int x3,int y3,int n)
    {
        int n1=n+1; double a; int xx1,yy1,xx2,yy2;
        for(int i=1; i<=n1; i++)
        {
            a=(i-1.)/n;
            xx1= x1+(x2-x1)*a; yy1= y1+(y2-y1)*a;
            xx2= x2+(x3-x2)*a; yy2= y2+(y3-y2)*a;
            MoveToEx(hDC,xx1,yy1, (LPPOINT) NULL); 
            LineTo(hDC,xx2,yy2); 
        }
    }
 
struct STAR
    {
        unsigned N; // количество фрагментов (вид изображения)
        int x,y; // координаты центра звезды (местоположение)
        unsigned r;         // радиус звезды (размер)
        COLORREF color;     // цвет линии (цвет изображения)
    };
void star(HDC hDC,struct STAR str)
    {
        int rc=str.r/3; // радиус центра звезды
        double a1,a2,a3,d=2.*PI/(str.N*2);
        HPEN hPen = CreatePen(PS_SOLID, 3,str.color);
        HPEN hOldPen = (HPEN)SelectObject (hDC, hPen);
        for(int i=1; i<=str.N; i++) 
        // рисуем очередной фрагмент звезды ( 1<=i<=N)
        {
            // определение значений углов
            a1=2*PI*(i-1)/str.N; a2=a1+d; a3=a1-d;
 
            // вывод угла, заштрихованного отрезками
            ugol(hDC,str.x,str.y,str.x+str.r*sin(a1),str.y+str.r*cos(a1),str.x+rc*sin(a2),str.y+rc*cos(a2),25);
            ugol(hDC,str.x,str.y,str.x+str.r*sin(a1),str.y+str.r*cos(a1),str.x+rc*sin(a3),str.y+rc*cos(a3),25);
        }
        DeleteObject (hPen);
        SelectObject(hDC, hOldPen);
    }
 
// --- Описание функции главного окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
 
// --- Глобальные переменные
HINSTANCE hInst;        // Дескриптор экземпляра приложения
char ClassName[]="Window";      // Название класса окна
char AppTitle[]="Application Win32";    // Заголовок главного окна
 
// --- Функция WinMain
int WINAPI WinMain( HINSTANCE hInstance,
    // Дескриптор экземпляра приложения
    HINSTANCE hPrevInstance, // В Win32 всегда равен NULL
    LPSTR lpCmdLine, 
    // Указатель на командную строку. Он // позволяет
    // приложению получать данные из командной строки.
    int nCmdShow
    // Определяет, как приложение первоначально 
    // отображается на дисплее: пиктограммой
    // (nCmdShow = SW_SHOWMINNOACTIVE) 
    // или в виде открытого окна                   //(nCmdShow = SW_SHOWNORMAL).
    )
{
    WNDCLASS wc;    // Структура для информации о классе окна
    HWND hWnd;  // Дескриптор главного окна приложения
    MSG msg;    // Структура для хранения сообщения
// Сохраняем дескриптор экземпляра приложения в глобальной
// переменной, чтобы при необходимости воспользоваться им в
// функции окна.
    hInst=hInstance;
 
    // --- Проверяем, было ли приложение запущено ранее.
    // Воспользуемся функцией FindWindow, которая позволяет
    // найти окно верхнего 
    // уровня по имени класса или по заголовку окна:
    // HWND FindWindow(LPCTSTR lpClassName,
    // LPCTSTRlpWindowName);
    // Через параметр lpClassName передается указатель на
    // текстовую строку, в которую необходимо записать имя
    // класса искомого окна. На базе одного и того же класса 
    // можно создать несколько окон. Если необходимо найти 
    // окно с заданным заголовком, то имя заголовка следует
    // передать через параметр lpWindowName. Если же подойдет 
    // любое окно, то параметр lpWindowName может иметь
    // значение NULL.
    if((hWnd=FindWindow(ClassName, NULL))!=NULL)
    {
    // Пользователь может не помнить, какие приложения уже
    // запущены, а какие нет. Когда он запускает приложение, 
    // то ожидает, что на экране появится его главное окно.
    // Поэтому, если приложение было запущено ранее,
    // целесообразно активизировать и выдвинуть на передний
    // план его главное окно. Это именно то, к чему приготовился
    // пользователь.
        if(IsIconic(hWnd)) ShowWindow(hWnd, SW_RESTORE);
        SetForegroundWindow(hWnd);
 
    // Найдена работающая копия - работа новой копии
    // прекращается.
        return FALSE;
    }
 
    // --- Работающая копия не найдена - функция WinMain
    // приступает к инициализации. Заполнение структуры
    // WNDCLASS для регистрации класса окна.
    memset(&wc, 0, sizeof(wc));
    wc.lpszClassName=ClassName;     // Имя класса окон
    wc.lpfnWndProc=(WNDPROC)WndProc;    
    // Адрес оконной функции
    wc.style=CS_HREDRAW|CS_VREDRAW; // Стиль класса 
    wc.hInstance=hInstance;     // Экземпляр приложения
    wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    // Пиктограмма для окон
    wc.hCursor=LoadCursor(NULL,IDC_ARROW);  
    // Курсор мыши для окон
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);   
    // Кисть для окон
    wc.lpszMenuName=NULL;           // Ресурс меню окон
    wc.cbClsExtra=0;            // Дополнительная память
    wc.cbWndExtra=0;            // Дополнительная память
    // Pегистрация класса окна.
    RegisterClass(&wc);
 
    // Создаем главное окно приложения.
    hWnd=CreateWindow(
        ClassName,          // Имя класса окон
        AppTitle,           // Заголовок окна 
        WS_OVERLAPPEDWINDOW,        // Стиль окна
        CW_USEDEFAULT,          // X-координаты 
        CW_USEDEFAULT,          // Y-координаты 
        CW_USEDEFAULT,          // Ширина окна
        CW_USEDEFAULT,          // Высота окна
        NULL,           // Дескриптор окна-родителя
        NULL,           // Дескриптор меню окна
        hInst,      // Дескриптор экземпляра приложения
        NULL);      // Дополнительная информация
    if(!hWnd) 
    {
        // Окно не создано, выдаем предупреждение.
        MessageBox(NULL,
        "Create: error",AppTitle,MB_OK|MB_ICONSTOP);
        return FALSE;
    }
 
    // Отображаем окно.
    ShowWindow(hWnd, nCmdShow);
 
    // Обновляем содержимое клиентской области окна.
    UpdateWindow(hWnd);
 
    // Запускаем цикл обработки очереди сообщений.
    // Функция GetMessage получает сообщение из очереди, 
    // выдает false при выборке из очереди сообщения WM_QUIT
    while(GetMessage(&msg, NULL, 0, 0))
    {
        // Преобразование некоторых сообщений, 
        // полученных с помощью клавиатуры
        TranslateMessage(&msg);
        // Отправляем сообщение оконной процедуре
        DispatchMessage(&msg);
    }
 
    return msg.wParam;
}
 
// --- Функция окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    STAR str;
    switch(msg)
    {
    // Необходимо обновить содержимое клиентской области окна.
        case WM_PAINT: 
        {
            HDC hDC;
            PAINTSTRUCT ps;
            hDC=BeginPaint(hWnd,&ps);   
            // Получить контекст окна
            // Нарисовать текст
            RECT r; GetClientRect(hWnd,&r);
            int w=r.right-r.left;           
            int h=r.bottom-r.top;
            str.N=(rand()/15+5);
            str.r=(rand()/200+20);
            str.x=str.r-w;
            str.y=str.r-h;
            str.color=RGB(rand()%255,rand()%255,rand()%255);
            star(hDC, str);
            EndPaint(hWnd,&ps); 
            // Освободить контекст окна
        }; break;
        case WM_DESTROY:
        {
        // Если данная функция является оконной функцией
        // главного окна, то следует в очередь сообщений
        // приложения послать сообщение WM_QUIT 
            PostQuitMessage(0);
        }; break;
 
        // Необработанные сообщения передаем в стандартную
        // функцию обработки сообщений по умолчанию.
    default: return DefWindowProc(hWnd, msg, wParam, lParam);
    }
    return 0l;
}
Мне кажется не заходит в ф-ию ugol, в чём проблема?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.04.2012, 22:01
Ответы с готовыми решениями:

Не рисует прямоугольник
Всем привет, есть проблема которая уже достала, почему не рисуется прямоугольник? case...

Функция, которая рисует ромб
функция которая рисует ромб, кто может поясните ее (не могу разобраться) void Romb::draw() {...

Не рисует круг при клике
case WM_LBUTTONDOWN: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); // TODO:...

Рисует поверх
Компонент ShellListView Хочу выделить необходимые мне элементы. Код void __fastcall...

4
Brainsbreaker
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
03.04.2012, 23:32 2
У тебя рисуется за пределами окна, строки 190, 191.
0
14 / 14 / 4
Регистрация: 08.11.2010
Сообщений: 172
04.04.2012, 08:18  [ТС] 3
спасибо
и ещё вопрос, почему после первого обновления, вместо звезды, вырисовывается круг?
если заменить 188 строку на константу, то всё норм
0
Brainsbreaker
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
04.04.2012, 09:57 4
Вот, что там по очереди генерируется: 7 - звезда, как положено, 1053, 385, 37 - внешне уже круг, 2164, ну и т.д. Отсюда и выводы.
0
14 / 14 / 4
Регистрация: 08.11.2010
Сообщений: 172
04.04.2012, 19:48  [ТС] 5
так а что не так?
я прост не поймы как исправить
0
04.04.2012, 19:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.04.2012, 19:48
Помогаю со студенческими работами здесь

не рисует прямоугольник
cScene.h #ifndef CSCENE_H #define CSCENE_H #include &lt;QtGui&gt; class cScene:public...

Не рисует линию
Здравствуйте! Очень долго гуглил, не на шел решения проблемы. Мне кажется я с логической точки...

Не рисует (LineTo)
int x1 = StrToInt(Edit1-&gt;Text); int y1 = StrToInt(Edit1-&gt;Text); int x2 =...

QPainter не рисует
Доброго времени суток. Возникла проблема при работе с QPainter. Почему-то не могу заставить его...

Не рисует линии
Как с помощью memDC нарисовать линии? Функция работает через dc. Попробовал переделать для...

QPainter не рисует QRect
вот взял пример отсюда -&gt; http://doc.qt.io/qt-5/qtopengl-2dpainting-example.html и начал...


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

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

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