C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Фокус элемента  (Прочитано 1023 раз)
DimaKor
Участник


Сказали спасибо: +1/-0
Offline

Сообщений: 22


Фокус элемента
« : 14 Июль 2015, 14:16:33 »

Есть пустая форма, на форме единственный элемент - панель, на которой рисуется 3D график, который вращается по нажатию кнопок. Все работает.

Как только добавляю на форму Edit, вращение по кнопкам перестает работать полностью, кнопки только перемещают курсор в Edit окне. Попробовал поставить Название панели->SetFocus() после заполнения Edit контрола, курсор оттуда пропал, но вращаться ничего не начало. Программу взял из примеров Rad Studio и немного переделал

Код:
//---------------------------------------------------------------------------
#include
#pragma hdrstop

#include "GlSkel.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormMain *FormMain;

//---------------------------------------------------------------------------
__fastcall TFormMain::TFormMain(TComponent* Owner)
: TForm(Owner)
{
Application->OnIdle = IdleLoop;
size = 50.0f;
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::IdleLoop(TObject*, bool& done)
{
done = false;
RenderGLScene();
SwapBuffers(hdc);
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::FormCreate(TObject *Sender)
{
hdc = GetDC(DrawPanel->Handle);
SetPixelFormatDescriptor();
hrc = wglCreateContext(hdc);
if(hrc == NULL)
ShowMessage(":-)~ hrc == NULL");
if(wglMakeCurrent(hdc, hrc) == false)
ShowMessage("Could not MakeCurrent");
w = ClientWidth;
h = ClientHeight;

glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);

glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glColor3f(0.0f, 0.0f, 0.0f);
glPointSize(2.0f);
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::SetPixelFormatDescriptor()
{
PIXELFORMATDESCRIPTOR pfd = {
    sizeof(PIXELFORMATDESCRIPTOR),
        1,
        PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
        PFD_TYPE_RGBA,
        24,
        0,0,0,0,0,0,
        0,0,
        0,0,0,0,0,
        32,
0,
        0,
        PFD_MAIN_PLANE,
        0,
        0,0,
    };
    PixelFormat = ChoosePixelFormat(hdc, &pfd);
    SetPixelFormat(hdc, PixelFormat, &pfd);
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::FormResize(TObject *Sender)
{

GLfloat nRange = 100.0;

    w = ClientWidth;
    h = ClientHeight;
   
    if(h == 0)
    h = 1;

    glViewport(0, 0, w, h);


    glMatrixMode(GL_PROJECTION);
glLoadIdentity();

/*
if (w glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange);
else
glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);
*/
    //For perspective correction
    //GLfloat aspect = (GLfloat)w/(GLfloat)h;
//gluPerspective(30.0f, aspect, 1.0, 50.0);

gluPerspective(
/*fovy:*/30,
/*aspect:*/static_cast(w) / static_cast(h),
/*zNear:*/1,
/*zFar:*/1000);

gluLookAt(
/*eyeX:*/-100, /*eyeY:*/-100, /*eyeZ:*/100,
/*centerX:*/0, /*centerY:*/0, /*centerZ:*/35,
/*upX:*/0, /*upY:*/0, /*upZ:*/1);


    glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::RenderGLScene()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    DrawObjects();
    glFlush();
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::DrawObjects()
{
  glBegin(GL_POINTS);

  SphereCalc();

for(int i=0; i {
glVertex3f(ptrArray[i].x,ptrArray[i].y,ptrArray[i].z);
}
  glEnd();

// coordinate system
  glBegin(GL_LINES);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(100.0f, 0.0f, 0.0f);

glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 100.0f, 0.0f);

glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 100.0f);
  glEnd();
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::FormPaint(TObject *Sender)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glFlush();
DrawObjects();
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::FormDestroy(TObject *Sender)
{
    wglMakeCurrent(NULL, NULL);
wglDeleteContext(hrc);
delete [] ptrArray;
}
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void __fastcall TFormMain::FormKeyDown(TObject *Sender, WORD &Key,
  TShiftState Shift)
{
if(Key == VK_UP)
glRotatef(-5, 1.0, 0.0, 0.0);
if(Key == VK_DOWN)
glRotatef(5, 1.0, 0.0, 0.0);
if(Key == VK_LEFT)
glRotatef(-5, 0.0, 1.0, 0.0);
if(Key == VK_RIGHT)
glRotatef(5, 0.0, 1.0, 0.0);
}

//---------------------------------------------------------------------------
void __fastcall TFormMain::SphereCalc()
{
R = 50;
pointsNum = 1000;
int pt = (int)sqrt(pointsNum);

ptrArray = new xyzPoints[pointsNum];
int m = 0;

for (int i = 0; i {
   fi = i*M_PI/(2*pt);

   for (int k = 0; k    {
tet = k*M_PI/(2*pt);
ptrArray[m].x = R*cos(fi)*sin(tet);
ptrArray[m].y = R*sin(fi)*sin(tet);
ptrArray[m].z = R*cos(tet);
m++;
   }
}
   tablo->Text = IntToStr(m);
   DrawPanel->SetFocus();
}
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Фокус элемента
« Ответ #1 : 14 Июль 2015, 14:30:35 »

У формы KeyPreview в true поставь.
Записан
DimaKor
Участник


Сказали спасибо: +1/-0
Offline

Сообщений: 22


« Ответ #2 : 14 Июль 2015, 14:33:25 »

Спасибо, помогло. Никогда даже не слышал про это свойство
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.055 секунд. Запросов: 19.