Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WinAPI, заливка замкнутых фигур, граф с цветными вершинами 
V
    Опции темы
KasMP
Дата 23.3.2009, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Есть граф. Мы вычисляем для каждой вершины подходящий ей цвет и потом хотим все это нарисовать.

У меня получилось все кроме непосредственно заливки окружностей, соответствующих вершинам.

Судя по всему, нам не обойтись без сплошных кистей:
Код
HBRUSH    brush;

Кисть, как и любой другой объект, надо создать:
Код
brush = CreateSolidBrush(RGB(0,255,0));

Ну а теперь осталось связать вместе
  • FillEllipse()
  • hdc - дескриптор контекста устройства
  • brush - кисть
  • vr - прямоугольник, в к-й будет вписываться эллипс
Я просмотрела много примеров - у них все очень просто и легко:
Код

FillEllipse(Brush, Rectangle);
FillEllipse(Brush, RectangleF);
FillEllipse(Brush, Int32, Int32, Int32, Int32);
FillEllipse(Brush, Single, Single, Single, Single);

Вот только у меня все начинается с очень странной ошибки
Цитата
'FillEllipse': identifier not found

и непонятно, как можно что-то рисовать, не получив hdc.

Почему у всех все работает, а у меня вечно какая-то глупая ошибка?

Добавлено через 3 минуты и 34 секунды
Граф:
Код

struct GRAPH {
    short    n;
    bool     **adj; // м-а смежности
    short    *color; // массив цветов вершин
};


Ф-я, рисующая существующий граф:
Код

void DrawGraph(GRAPH *graph, HWND hWnd)
{
    RECT     client;        // прямоугольник клиентской области
    POINT    center;        // точка центра клиентской области
    int      R,            // радиус окружности, на к-ой будут располагаться вершины
             size;        // сторона квадрата, в к-ю будет вписана окр-ть радиуса R с вершинами
    HDC      hdc;
        
    short t = graph->n;

    GetClientRect(hWnd, &client);
    hdc = GetDC(hWnd);

    center.x = (client.left + client.right)/2; // ищем центр
    center.y = (client.top + client.bottom)/2; // клиентской области
    R = min ( client.right - client.left, client.bottom - client.top ) / 3;
    size = 2*R;

    int     x0 = center.x - size/2,        // левый верхний угол прямоугольника, в к-ый
            y0 = center.y - size/2;        // будет вписана окр-ть радиуса R с вершинами
    
    //Ellipse(hdc, x0, y0, x0+size, y0+size); // ок-ть, на к-й будут вершины

    for (short i=0; i<t; i++)
        for (short j=0; j<=i; j++)
            if ( Edge(graph,i,j) )
            {
                MoveToEx(hdc, center.x + (int)R*cos(2*M_PI/t*i), center.y - (int)R*sin(2*M_PI/t*i), NULL);
                LineTo(hdc, center.x + (int)R*cos(2*M_PI/t*j), center.y - (int)R*sin(2*M_PI/t*j)); 
            }


    double    phi = 0,                    // угол текущей вершины
              delta = 2*M_PI / graph->n;    // угол, на к-й нужно передвинуться для перехода к след.сектору
    short     rv = 20;                    // радиус вершины
    RECT      vr;                            // прямоугольник, в к-й будем вписывать номер вершины
    int        x, y;                        // центр окружности текущей вершины
    wchar_t    s[3];                        // строка с номером текущей вершины

    HBRUSH    brush;
    brush = CreateSolidBrush(RGB(0,255,0));

    for (short i=0; i<t; i++) {
        x = center.x + (int)R*cos(phi);                // ищем абсциссу и ординату
        y = center.y - (int)R*sin(phi);                // центра окружности текущей вершины
        Ellipse(hdc, x-rv, y-rv, x+rv, y+rv);        // рисуем окружность текущей вершины


        switch (graph->color[i]) {
            case 1: 
                // yellow
                break;
            case 2:
                // blue
                break;
            case 3:
                // green
                break;
            case 4:
                // violet
                break;
        }

        // FillEllipse(hdc, x-rv, y-rv, x+rv, y+rv);


        _itow_s(i+1,s,10);        // переводим i+1 в строку в десятичной системе (будем выводить номер вершины)
        
        // ищем прямоугольник, в к-й впишем номер текущей вершины (пол-радиуса от центра окр-ти вершины)
        SetRect(&vr,x-rv/2,y-rv/2,x+rv/2,y+rv/2);
        
        DrawText(hdc, s, wcslen(s), &vr, DT_SINGLELINE | DT_VCENTER | DT_CENTER);
        
        phi += delta;    // переходим к следующей вершине
    }
}

PM MAIL   Вверх
Alexeis
Дата 23.3.2009, 23:27 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Это похоже на GDI+ . Тогда явно не хватает.
Код

#include <gdiplus.h>

и 
Код

#pragma comment(lib, "gdiplus.lib")


Но это метод класса Graphics .

Если же нужно использовать GDI, то функция называется Ellipse. Она тоже заливает фигуру.

Добавлено через 3 минуты и 23 секунды
Вот тут можно почитать http://msdn.microsoft.com/en-us/library/dd162510(VS.85).aspx

Добавлено через 7 минут и 39 секунд
А вот еще такое чтобы кисть заработала нужно ее выбрать для конетекста функцией 
SelectObject



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
mes
Дата 23.3.2009, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



и для вопросов по WinAPI есть соответствующая тема, там больше шансов на ответ smile


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 23.3.2009, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(Alexeis @  23.3.2009,  23:27 Найти цитируемый пост)
Если же нужно использовать GDI

Да, нужно smile .
Цитата(Alexeis @  23.3.2009,  23:27 Найти цитируемый пост)
функция называется Ellipse. Она тоже заливает фигуру.

Т.е. надо поменять текущую кисть smile ... Очевидно, она уже создана... А как до нее добраться smile ?

Добавлено через 1 минуту и 27 секунд
Цитата(mes @  23.3.2009,  23:35 Найти цитируемый пост)
и для вопросов по WinAPI есть соответствующая тема, там больше шансов на ответ

Я смотрела тот раздел... Там намного более глубокие и сложные вопросы, чем мои.
PM MAIL   Вверх
Alexeis
Дата 23.3.2009, 23:47 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Цитата(KasMP @  23.3.2009,  22:38 Найти цитируемый пост)
 ... Очевидно, она уже создана... А как до нее добраться

  Функция SelectObject меняет у контекста вспомогательные объекты. Кисти, карандаши и т.д.
1) параметр контекст на котором рисуем.
2) дескриптор новой кисти.
3) результат дескриптор старой кисти.

Добавлено через 3 минуты и 46 секунд
P.S. старую кисть нужно сохранить, и потом по выходу вернуть на место, свою кисть уничтожить.

По окончанию текущего кадра все что использовалось следует удалить или освободить. Разве что битмапы не стоит удалять (если используются).

Рисовать можно не везде и не всегда. Правильно рисовать, по получению сообщения WM_PAINT.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
KasMP
Дата 24.3.2009, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Alexeis, благодаря твоим ответам я поняла, в каком направлении искать, и нашла smile . Спасибо  smile smile.
Цитата(Alexeis @  23.3.2009,  23:47 Найти цитируемый пост)
Рисовать можно не везде и не всегда. Правильно рисовать, по получению сообщения WM_PAINT. 

Да, я это понимаю. DrawGraph() вызывается в WM_PAINT smile .

Добавлено через 3 минуты и 23 секунды
То, что мне полностью помогло:

Цитата(Ю.Щупак @  "Win32 API. Эффективная разработка приложений.")

user posted image

PM MAIL   Вверх
GremlinProg
Дата 24.3.2009, 17:27 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Ю.Щупак @  "Win32 API. Эффективная разработка приложений.")

После окончания работы с предопределенным объектом, его не нужно удалять при помощи функции DeleteObject

это не совсем верно, поскольку новые API, которые осуществяют поддержку с темами XP, определяют GDI объекты в ран-тайме 
в зависимости от выбранной конфигурации (в расширении VS), так что при возврате таких функций могут присутствовать как предопределенные объекты, так и заказные, так что, если частичная или полная интеграция двух API: GDI и VisualStyles таки произойдет, то все программы, которые это не учитывают, будут генерировать утечки GDI-ресурсов

хотя майкрософт пока на это и не особенно акцентируется, но внимание, таки обращает:
Цитата(GetStockObject @ MSDN)

It is not necessary (but it is not harmful) to delete stock objects by calling DeleteObject.



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
KasMP
Дата 28.3.2009, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



GremlinProg, спасибо большое smile .

Добавлено через 5 минут и 9 секунд
Вобщем внутри DrawGraph() у меня появилось примерно такое:

Код

    HBRUSH     brush;
    HGDIOBJ    previous;
    
    for (short i=0; i<t; i++) {
        
        ...

        switch (graph->color[i]) {
            case 1: 
                // yellow
                brush = CreateSolidBrush(RGB(255,255,0));
                break;
            case 2:
                // blue
                brush = CreateSolidBrush(RGB(0,0,255));
                break;
            case 3:
                // green
                brush = CreateSolidBrush(RGB(0,255,0));
                break;
            case 4:v
                // pink
                brush = CreateSolidBrush(RGB(255,0,255));
                break;
        }

        previous = SelectObject(hdc,brush);
        Ellipse(hdc, x-rv, y-rv, x+rv, y+rv);        // рисуем окружность текущей вершины нужной кистью
        SelectObject(hdc,previous);
        
        ...

    }
    DeleteObject(brush);

Вроде бы все правильно. Да smile ?
PM MAIL   Вверх
KasMP
Дата 28.3.2009, 21:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Мне нравится smile  smile !! Красота smile !

user posted image user posted image

Это сообщение отредактировал(а) KasMP - 28.3.2009, 21:55
PM MAIL   Вверх
bitt
Дата 4.4.2009, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 4.4.2009

Репутация: нет
Всего: нет



а исходник этой программы может выложить кто нибудь ?
PM MAIL   Вверх
KasMP
Дата 1.5.2009, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Ребят, я наивно верю, что у кого-то из вас есть желание взять мой полный проект на WinAPI (ищущий для графа 4-раскраску и рисующий ее), поковыряться в нем и покритиковать его smile .
Желающим пришлю на мыло smile  smile .
PM MAIL   Вверх
Alexeis
Дата 5.5.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Цитата(KasMP @  1.5.2009,  08:54 Найти цитируемый пост)
Желающим пришлю на мыло 

  Можно тут приатачить к посту. Тогда им смогут полюбоваться намного больше народу smile .


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
KasMP
Дата 7.5.2009, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Alexeis, вот именно, что тогда многие только картинки посмотрят, а непосредственно вникать мало кто захочет smile .
А если человек уже напишет сюда о своем желании, то тогда он точно настроен smile smile  !!
PM MAIL   Вверх
KasMP
Дата 4.7.2009, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



GremlinProg, твое сообщение smile наконец-то, после долгого затишья smile, вызвало резонанс smile (который может вылиться в резонансище smile  smile ) !!
Цитата(GremlinProg @  24.3.2009,  17:27 Найти цитируемый пост)

Цитата(Ю.Щупак @  "Win32 API. Эффективная разработка приложений.")

После окончания работы с предопределенным объектом, его не нужно удалять при помощи функции DeleteObject

это не совсем верно, поскольку новые API, которые осуществяют поддержку с темами XP, определяют GDI объекты в ран-тайме 
в зависимости от выбранной конфигурации (в расширении VS), так что при возврате таких функций могут присутствовать как предопределенные объекты, так и заказные, так что, если частичная или полная интеграция двух API: GDI и VisualStyles таки произойдет, то все программы, которые это не учитывают, будут генерировать утечки GDI-ресурсов

хотя майкрософт пока на это и не особенно акцентируется, но внимание, таки обращает:
Цитата(GetStockObject @ MSDN)

It is not necessary (but it is not harmful) to delete stock objects by calling DeleteObject.

Пожалуйста, скажи еще несколько ключевых слов, связанных с этой проблемой, чтобы было проще искать smile .
PM MAIL   Вверх
Forsaken
Дата 5.7.2009, 20:41 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 30.12.2008

Репутация: нет
Всего: 3



KasMP, 
А он ведь Вам все уже рассказал. Проблема ясна,  и рекомендация по решению есть. И слов много для поиска smile
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0740 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.