C++Builder
Начало
Форум
Помощь
Войти
Регистрация
C++Builder
>
Forum
>
Вопросы программирования
>
Общие вопросы программирования в C++Builder
>
Фокус элемента
Страниц: [
1
]
Вниз
Печать
Автор
Тема: Фокус элемента (Прочитано 1014 раз)
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
Re: Фокус элемента
«
Ответ #2 :
14 Июль 2015, 14:33:25 »
Спасибо, помогло. Никогда даже не слышал про это свойство
Записан
Страниц: [
1
]
Вверх
Печать
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Вопросы программирования
-----------------------------
=> Общие вопросы программирования в C++Builder
=> Программирование с FMX
=> Работа с базами данных в C++Builder
=> Windows API
=> Технологии COM/DCOM, ActiveX
=> Аспекты и идеология профессиональной разработки ПО
=> Компьютерное железо и системное администрирование
=> студенческий городок
-----------------------------
Обсуждение материалов на сайте
-----------------------------
=> Обсуждений статей на сайте
=> Обсуждение материалов из файлового архива
=> Компоненты сторонних разработчиков к С++Builder
-----------------------------
Работа сайта и новости
-----------------------------
=> Ищу/предлагаю работу
=> Новости из мира программирования
=> Новости - события календаря
=> Голосования
=> Компьютерный юмор и приколы
=> Работа сайта
=> Флейм
-----------------------------
FAQ - частозадаваемые вопросы/ответы
-----------------------------
=> FAQ, общие вопросы, посвящённые C++Builder
=> FAQ, вопросы по базам данных
=> FAQ, вопросы по компонентам
Загружается...