Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > отрисовка в дух окнах


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

Код

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;



 

Автор: kosta 13.7.2006, 15:21
спасиба за помощь =) я уже нашел ошибку, просто надо было явно прописать в FormShow вызов FormResize 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)