IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Builder 6.0
Fanat
сообщение 31.01.2008 17:41
Сообщение #1


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Хочу сделать следуюшее...чтобы по определенным клавишам двигалася напиример Button1,
а по другим Button2...написал примерно так


void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
bool &Handled)
{
// Memo1->Lines->Add(Msg.wParam);
const nStep = 1;
switch(Msg.wParam)
{
case 40: Button1->Top += nStep;
break;
case 38: Button1->Top -= nStep;
break;
case 37: Button1->Left -= nStep;
break;
case 39: Button1->Left += nStep;
break;

case 83: Button2->Top += nStep;
break;
case 87: Button2->Top -= nStep;
break;
case 65: Button2->Left -= nStep;
break;
case 68: Button2->Left += nStep;
break;

}



Но теперь пока одна кнопка движеться вторая не будет...как реализовать независимое движение?..
может как то через много поточность?..можно для каждой кнопки писать свой поток и в нём ждать нажатия определённой кнопки и его уже орабатывать...но как ето сделать?..

Сообщение отредактировано: Fanat - 31.01.2008 17:41
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 1.02.2008 14:45
Сообщение #2


Гость






Цитата
А как отловить нажатие двух кнопок сразу?..хочу добавить движение по диагоналям...
Ну, например, вот так:
const int dirLt = 0;
const int dirRg = 1;
const int dirUp = 2;
const int dirDn = 3;

// Делаем множество направлений
typedef Set<int, dirLt, dirDn> TDir;

class TMyThread : public TThread
{
private:
TButton *btn;
TDir FState;
protected:
void __fastcall Execute();
public:
__property TDir GetState = {read = FState, nodefault};
__fastcall bool SetState(TDir& state) {
FState = state;
if(state.Empty())
{
Suspend();
}
else
{
Resume();
}
return true;
}

__fastcall TMyThread(TButton *button, bool CreateSuspended):
TThread(CreateSuspended)
{
btn = button;
}
};

const int num_threads = 2;
TMyThread *thr[num_threads];


void __fastcall TMyThread::Execute()
{
const int nStep = 2;

do {

int dx = 0, dy = 0;
for(int dir = dirLt; dir <= dirDn; dir++) {
// если текущее направление присутствует во множестве
if(FState.Contains(dir)) {
// то высчитываем, куда двигаться...
switch(dir) {
case dirLt: dx = -nStep; break;
case dirRg: dx = +nStep; break;
case dirUp: dy = -nStep; break;
case dirDn: dy = +nStep; break;
}

}
}

btn->Left += dx; btn->Top += dy;
Sleep(5);
}
while(!Terminated);
}

// ...

int key_pressed(unsigned int key, int& dir)
{
unsigned codes[num_threads][4] = {
{37, 39, 38, 40}, {65, 68, 87, 83}
};

for(int i = 0; i < num_threads; i++) {
for(int j = 0; j < 4; j++) {
if(codes[i][j] == key) {
dir = j; return i;
}
}
}
return -1;
}


void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg, bool &Handled)
{
int thread_n, dir;

switch(Msg.message) {
case WM_KEYDOWN:
if((thread_n = key_pressed(Msg.wParam, dir)) >= 0) {
Handled = thr[thread_n]->SetState(
thr[thread_n]->GetState << dir // добавляем направление во множество
);
}
break;
case WM_KEYUP:
if((thread_n = key_pressed(Msg.wParam, dir)) >= 0) {
Handled = thr[thread_n]->SetState(
thr[thread_n]->GetState >> dir // "изымаем" направление ...
);
}
break;
}
}
"... И всего делов..." (С) "И.В. меняет профессию"
smile.gif
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Fanat   Builder 6.0   31.01.2008 17:41
volvo   Угу... Чтобы наконец убедиться, что весь GUI долже...   31.01.2008 19:32
Fanat   Да...так работает..=) Хотелось бы всё таки узнать...   31.01.2008 23:16
volvo   Ты действительно этого хочешь? Тогда посмотри прис...   1.02.2008 1:29
Fanat   Ты действительно этого хочешь? Тогда посмотри при...   1.02.2008 11:53
volvo   Поменял в Execute() условие выхода на ... } whi...   1.02.2008 12:24
Fanat   Поменял в Execute() условие выхода на ... } wh...   1.02.2008 12:34
volvo   Должны... Но их должна завершить система, а это тр...   1.02.2008 12:47
Fanat   Должны... Но их должна завершить система, а это т...   1.02.2008 13:10
volvo   Ну, например, вот так: const int dirLt = 0; const ...   1.02.2008 14:45
Fanat   А что значит строчка __property TDir GetState = ...   2.02.2008 3:01
volvo   Угу... Именно свойства. А что непонятно? Описываеш...   2.02.2008 4:22
Fanat   Угу... Именно свойства. А что непонятно? Описывае...   2.02.2008 13:27
volvo   Можно. Только тогда придется делать: Handled =...   2.02.2008 13:41
Fanat   Можно. Только тогда придется делать: Handled ...   2.02.2008 14:01


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.07.2025 10:05
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"