Поиск:

Ответ в темуСоздание новой темы Создание опроса
> отрисовка в дух окнах, опенГЛ 
V
    Опции темы
kosta
Дата 13.7.2006, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



вот какая ситуация: я писал прогу в котором был модуль для отрисовки некоторых объектов на форме с помощью ОпенГЛ. Потом мне притащили програмулину, которая в своем окошке с помощью ОпенГЛ тож отрисовывает некоторые объекты. Програмулину та состояла вего из одного модуля, подключил ее все ок, вызываеца теперь по нажатию кнопки на форме где я рисую. Но вот какая проблем возникла, после первого нажатия на кнопку открывается и все отрисовывается нормально, потом закрываю окошко и када опять нажимаю чтобы окошко окрылось, то оно открывается но рисунок не прорисовывает. Хотя все строки кода проходит и вроде как должно рисовать но панелька остается черной. Подскажите с чем может быть дело плз. ниже код опенгл который используется в этой формочке:

Код

type
  TfrmEMain = class(TForm)

. . .

  private
        procedure SetDCPixelFormat (dc : HDC);
        procedure pDrawDisks(Planes: Array of TDisks);
        procedure pDrawParticles(Particles: Array of TParticle);
    { Private declarations }

  protected
        procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;

  public
    { Public declarations }
        dc : HDC;
        hrc : HGLRC;
        qObj : GLUquadricObj ;
  end;

. . . 


procedure TfrmEMain.SetDCPixelFormat (dc : HDC);
var
    nPixelFormat: Integer;
    pfd: TPixelFormatDescriptor;
begin
    FillChar(pfd, SizeOf(pfd), 0);

    pfd.dwFlags    :=    PFD_DRAW_TO_WINDOW or
                    PFD_SUPPORT_OPENGL or
                    PFD_DOUBLEBUFFER;

    nPixelFormat:= ChoosePixelFormat(DC, @pfd);
    SetPixelFormat(DC, nPixelFormat, @pfd);
end;

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

procedure TfrmEMain.FormResize(Sender: TObject);
begin
    glViewport(0, 0, pnlField.Width, pnlField.Height);    
    glMatrixMode(GL_PROJECTION);  
    glLoadIdentity;  
    gluPerspective(45.0, pnlField.Width / pnlField.Height, 1.0, 10000.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity;
    glTranslatef (0.0, 0.0, -8.0);
    InvalidateRect(pnlField.Handle, nil, False);

end;

//=============================================================
procedure TfrmEMain.WMPaint(var Msg: TWMPaint);
var
    ps        : TPaintStruct;
    i, j, k    : Cardinal;
    BufVector: TVector;
    BufQ    : Extended;
begin
    BeginPaint(Handle, ps);
        glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // î÷èñòêà áóôåðà öâåòà

        glLoadIdentity;

        glTranslatef (tX/50, -tY/50, tZ/100);

        glRotatef (rX, 0.0, 1.0, 0.0);
        glRotatef (rY, 1.0, 0.0, 0.0);


 . . . отрисовка объектов . . . 


        SwapBuffers(dc);            
    EndPaint(Handle, ps);
end;



//==================================================================
 

procedure TfrmEMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    
  gluDeleteQuadric (qObj);
  wglDeleteContext (hrc);
    ReleaseDC (pnlField.Handle, dc);
    DeleteDC (dc);

 
end;

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

procedure TfrmEMain.FormShow(Sender: TObject);
begin
    Randomize;

    dc    := GetDC(pnlField.Handle);
    SetDCPixelFormat(dc);
    hrc    := wglCreateContext(dc);
    wglMakeCurrent(dc, hrc);

    tX := 0;
    tY := 0;
    tZ := -2000;

    glClearColor (0.0, 0.0, 0.0, 0.0);                                                            
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_COLOR_MATERIAL);

    qObj := gluNewQuadric;

    WMPaint(msg);

  btnFillSpaceClick(sender);

end;



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


Шустрый
*


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

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



спасиба за помощь =) я уже нашел ошибку, просто надо было явно прописать в FormShow вызов FormResize 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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