Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рисование на TPanel, HDC + TPanel 
:(
    Опции темы
EEEEEE
Дата 26.1.2009, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Добрый всем!


Проблемка в том, что форма содержит кнопку.
При нажатии на кнопку на Panel выводится средствами WinAPI различная графика( окружности, линии).
При перерисовке формы всё что было на Panel исчезает. Image не подойдёт.

Что необходимо добавить для сохранения информации, выведенной на Panel?

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


Опытный
**


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

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



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

Покажи код отрисовки

Это сообщение отредактировал(а) Comm - 26.1.2009, 23:30


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
EEEEEE
Дата 27.1.2009, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



На чистом WinAPI вся хитрость зашита в сообщениях WM_CREATE & WM_PAINT.
А здесь, явно чего-то нехватает? Вот только чего?

Начальную инициализацию можно "убрать" в коструктор формы или FormCreate. Отрисовка должна происходить по нажатию кнопки и в дальнейшем не затираться.
Код

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//
  HDC pDC = GetDC(Panel1->Handle);


  if(pDC != NULL)
    {
     POINT currpoint;

     currpoint.x = Panel1->Width;
     currpoint.y = Panel1->Height;

     RichEdit1->Lines->Add("Panel1->Width  = " + IntToStr(Panel1->Width));
     RichEdit1->Lines->Add("Panel1->Height = " + IntToStr(Panel1->Height));

     DPtoLP(pDC,&currpoint,1);
     SetWindowOrgEx( pDC, -currpoint.x/2, -currpoint.y/2, NULL);

     for(int i=10; i>= 0; i--)
        {
     Ellipse( pDC,    // handle to device context
              -20*i,    // x-coord. of bounding rectangle's upper-left corner
               20*i,    // y-coord. of bounding rectangle's upper-left corner
               20*i,    // x-coord. of bounding rectangle's lower-right corner
              -20*i    // y-coord. bounding rectangle's f lower-right corner
            );
        }

     ReleaseDC( Panel1->Handle, pDC);
    }
  else
      RichEdit1->Lines->Add("Problems with Graphics!");


  MessageBox(Application->Handle,"Work","Message",MB_OK);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
 Invalidate();
}


PM MAIL   Вверх
sergey_85
Дата 27.1.2009, 13:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

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



Тебе нужно отловить сообщение панели WM_PAINT, затем нарисовать сначала саму панель, а затем то, что ты хочешь.
Вот примерный код

Отрисовка
Код

//#include "Unit1.h"

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    Panel1->WindowProc = SubClassWndProc;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SubClassWndProc(Messages::TMessage &Message)
{
    if (Message.Msg == WM_PAINT)
    {
       //думаю эта строка немного корявая, но работает  :-D 
       Panel1->Dispatch( (void *)&Message);

       TCanvas *can = new TCanvas();
       can->Handle = ::GetDC(Panel1->Handle);
       can->LineTo(50,50);
    }
    else
    {
        Panel1->Dispatch( (void *)&Message);
    }
}



... и не забудь
Код

//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TPanel *Panel1;
private:    // User declarations
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);
    void __fastcall TForm1::SubClassWndProc(Messages::TMessage &Message);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;


Это сообщение отредактировал(а) sergey_85 - 27.1.2009, 13:38


--------------------
A good design always pays off.
PM MAIL   Вверх
Comm
Дата 27.1.2009, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Классный пример!  smile 


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
Comm
Дата 27.1.2009, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

if (Message.Msg == WM_PAINT)
    {
       //думаю эта строка немного корявая, но работает  :-D 
       Panel1->Dispatch( (void *)&Message);

       TCanvas *can = new TCanvas();
       can->Handle = ::GetDC(Panel1->Handle);
       can->LineTo(50,50);
       ReleaseDC(Panel1->Handle,can->Handle);
       delete  can;
       
    }

а красивее помоему так:
Код

if (Message.Msg == WM_PAINT)
    {
       //думаю эта строка немного корявая, но работает  :-D 
       Panel1->Dispatch( (void *)&Message);
       HDC HD=GetDC(Panel1->Handle);
       LineTo(HD, 50, 50);
       ReleaseDC(Panel1->Handle,HD);
       
    }




--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
Dem_max
Дата 27.1.2009, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



а почемубы на TPanel не положить PaintBox и в нем уже рисовать в методе OnPaint ?????????????


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Comm
Дата 27.1.2009, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Тоже вариант  smile 


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
EEEEEE
Дата 27.1.2009, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем спасибо!!!

Из-за чего хотелось бы "сесть" на Panel? Из-за того, что начало системы координат нужно перегнать в центр. X и Y изменяются от минуса до плюса. Карячится каждый раз с пересчётом не очень то.
PM MAIL   Вверх
sergey_85
Дата 27.1.2009, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

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



Comm,
Цитата

а красивее помоему так:Код

if (Message.Msg == WM_PAINT)
    {
       //думаю эта строка немного корявая, но работает  smile 
       Panel1->Dispatch( (void *)&Message);
       HDC HD=GetDC(Panel1->Handle);
       LineTo(HD, 50, 50);
       ReleaseDC(Panel1->Handle,HD);
       
   }


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


--------------------
A good design always pays off.
PM MAIL   Вверх
Comm
Дата 27.1.2009, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

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

Согласен,но я пытаюсь избегать где только можно оператора new =)) 


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
sergey_85
Дата 27.1.2009, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

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



Comm,
Цитата

Согласен,но я пытаюсь избегать где только можно оператора new =)) 

да не надо его бояться! без него, к примеру, vcl компоненты  НИКАК не создать (тот же TButton, к примеру)!!!
Просто например всегда делай так:

Код

TCanvas *myCanvas = 0;
  
try
{
    myCanvas = new TCanvas();
    //делаю что хочу ...
}
__finally
{
   if(myCanvas)
  {
     delete myCanvas;
     myCanvas =0;
  }
}



Это сообщение отредактировал(а) sergey_85 - 27.1.2009, 22:56


--------------------
A good design always pays off.
PM MAIL   Вверх
Comm
Дата 27.1.2009, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Это я знаю,я к тому что если можно обойтись без new то зачем нагружать программу( на выделение памяти ведь требуются ресурсы и время)


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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