Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ПРоблема с отрисовкой графики GDI+, при вызове функций из разных обработчико 
V
    Опции темы
=Женек=
Дата 30.10.2009, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Господа, начал я вопрос в предыдущей теме, но поскольку одна проблема переросла в другую, сосздаю новую тему.
Задача:
Создать на TForm1 изображение TImage, TButton.
ПРограмма должна рисовать дугу при активации формы и при нажатии на кнопку (естественно в разных местах). И обращаться к процедуре рисования нужно как непосредственно так и через свою собственную процедуру.
Вот код:
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop


#include "test.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "AdvSmoothPanel"
#pragma resource "*.dfm"


#define STRICT
#include <windows.h>
#include <algorithm>
using std::min;
using std::max;

#include <gdiplus.h>
using namespace Gdiplus;
#pragma comment(lib, "gdiplus.lib")

ULONG_PTR  gdiplusToken;

TForm1 *Form1;
Gdiplus::Graphics *_m_pGraphics;
Gdiplus::Pen *_m_ppen;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
 Gdiplus::GdiplusStartupInput gdiplusStartupInput;
  _m_pGraphics = new  Gdiplus::Graphics(Form1->Image1->Canvas->Handle);
  _m_ppen = new Pen(Gdiplus::Color(255,255,180,180));

}
//---------------------------------------------------------------------------
void PutArc(int Track, int StartAngle, int EndAngle)
{
   _m_ppen->SetWidth(8);
   _m_pGraphics->DrawArc(_m_ppen, 400-Track*10+5, 400-Track*10+5, Track*20-10, Track*20-10, StartAngle, EndAngle);
}

//---------------------------------------------------------------------------
void __fastcall TForm1::FormActivate(TObject *Sender)
{


_m_pGraphics->DrawEllipse(_m_ppen, 40, 40, 40, 40);
PutArc(7,0,360);

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
_m_pGraphics->DrawEllipse(_m_ppen, 40, 40, 40, 40);
PutArc(7,0,60);
}
//---------------------------------------------------------------------------




По совету уважаемого Alca я глобализовал графические переменные, дабы не передавать их из функции в функцию.
Как работает код? В том виде в котором я привел - не рисует нигде - только появляется белая канва.

Если же перенести фрагмент
Код

 Gdiplus::GdiplusStartupInput gdiplusStartupInput;
  _m_pGraphics = new  Gdiplus::Graphics(Form1->Image1->Canvas->Handle);
  _m_ppen = new Pen(Gdiplus::Color(255,255,180,180));



Из  Fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner) { ...  в обработчик FormCreate, то отрисовывает только те команды, которые в нем же  и вызываются, все что в обработчике ButtonClick - не отрисовывается. Я ставил маячок в void PutArc - маячок срабатывает , то есть PutArc при нажатии на кнопку вызывается и команды в ней выполняются. ТОлько рисунка нет.

И еще один маленький нюанс я использую визуальные компоненты TMS Software, которые активно используют GDI+.  Если вы заметили у меня есть строка #pragma link "AdvSmoothPanel"
Так вот если я убираю эту строку и все компоненты с формы, или же создаю проект заново не помещаю туда ничего кроме Image и Button, то код вообще не работает - ловлю "Access violation at address 00401c96... Read of address 0000008".


Что делать и кто виноват?

Добавлено через 5 минут и 23 секунды
Вот хидер
Код

//---------------------------------------------------------------------------

#ifndef testH
#define testH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include "AdvSmoothPanel.hpp"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TButton *Button1;
    TImage *Image1;
    void __fastcall FormActivate(TObject *Sender);
    void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


PM MAIL   Вверх
SVN74
Дата 30.10.2009, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(=Женек= @  30.10.2009,  17:05 Найти цитируемый пост)
Создать на TForm1 изображение TImage, TButton.
ПРограмма должна рисовать дугу при активации формы и при нажатии на кнопку (естественно в разных местах).

А почему Вы используете GDI+ ?
Может просто использовать TCanvas или GDI 
Builder не совсем любит GDI+  ...


PM MAIL WWW   Вверх
=Женек=
Дата 30.10.2009, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Мне нужно сглаживание линий в TCanvas это есть?
PM MAIL   Вверх
=Женек=
Дата 1.11.2009, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Неужели никто не рисовал на GDI+ ничего сложнее одной линии?
PM MAIL   Вверх
=Женек=
Дата 1.11.2009, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Проблему решил, оказывается нужно добавлять Image->Invalidate(); и создавать новый _m_pgraphics каждый раз.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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