Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
lips
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 429
1

Динамически создать 15 кнопок на форме и сделать общий обработчик OnClick

04.01.2014, 16:02. Просмотров 1645. Ответов 20
Метки нет (Все метки)

Здравствуйте, создаю 15 кнопок вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    HWND hWnd = this->Handle;
    long hThisInstance = GetWindowLong(hWnd, GWL_HINSTANCE);
    int a = 0;
    for (int i=0;i<=15;i++)
    {
        HWND One;
        One = CreateWindow (
         "BUTTON",
         "1",
         WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
         a+=30,
         25,
         30,
         30,
         hWnd,
         NULL,
         (HINSTANCE)hThisInstance,
         0);
   }
а могу теперь я общий обработчик клика для них написать?
и если да, то прошу подсказать как
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2014, 16:02
Ответы с готовыми решениями:

Написать для трех кнопок общий обработчик OnClick для вывода, скрытия/отображения и изменения цвета текста
На форме Form_Lb расположена пустая метка Lb_txt с текстом и три кнопки класса TButton с...

Общий обработчик события OnClick для некоторых CheckBox-ов
Есть у меня значит 33 чекбокса, есть попап-меню. Есть 2 обработчика: N5Click(клик по итему с...

Как динамически задать обработчик события OnClick для кнопки ?
На странице есть кнопка. Я на нее нажимаю - создаются еще 10 кнопок с именами в виде порядкового...

Обработчик динамически добавленных кнопок
Здравствуйте, помогите, пожалуйста. По нажатию на кнопку создаю новые кнопки и добавляю их на...

Обработчик динамически созданных кнопок
есть цикл, в котором создаются кнопки for (k=1;k&lt;20;k++){ Button newBtn=new...

20
zss
Модератор
Эксперт С++
8100 / 7237 / 4505
Регистрация: 18.12.2011
Сообщений: 19,142
Завершенные тесты: 1
04.01.2014, 16:18 2
Каждая из кнопок посылает сообщение WM_COMMAND,
но младшее слово от wparam
LOWORD(wparam)
содержит ID Нажатой кнопки.
Этот ID надо указать перед параметром hInstance
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int ID_BUTTON=1;
One = CreateWindow (
         "BUTTON",
         "1",
         WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
         a+=30,
         25,
         30,
         30,
         hWnd,
         (HMENU)ID_BUTTON,
         (HINSTANCE)hThisInstance,
         0);
1
kventin_zhuk
БНТУ ФИТР
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
04.01.2014, 16:20 3
lips,

C++
1
2
3
4
5
6
7
8
9
10
11
12
One = CreateWindow (
         "BUTTON",
         "1",
         WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
         a+=30,
         25,
         30,
         30,
         hWnd,
         NULL , // этот параметр задает ID объекта
         (HINSTANCE)hThisInstance,
         0);
Вот этот вот параметр используется дла задания ID кнопки. А вы туда NULL подаете.

Поставьте i+1

Оконной процедуре окна hwnd при возникновении события посылается сообщение WM_COMMAND. Младшее слово параметра wParam оконной процедуры содержит ID контрола, для которого пришло сообщение. Старшее, если память не изменяет, - само сообщение. Примерно это выглядит вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
switch (message)
    {
 
    case WM_LBUTTONDOWN:
        {
            MessageBox(hwnd, "Message box", "Message", MB_OK);
        }
        break;
    case WM_COMMAND:
        {
            switch(LOWORD(wParam))
            {
            case 1:
                {
                        // обработка сообщения дя кнопки с ID==1
                }
                break;
                                  }
 
        }
        break;
    }
1
lips
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 429
04.01.2014, 19:23  [ТС] 4
Спасибо, но не получается:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 LRESULT WINAPI MainWndProc(HWND hwnd, unsigned int message, WPARAM wParam, LPARAM lParam)
 {
    Form1->Label1->Caption = "111";
    switch (message)
    {
 
    case WM_LBUTTONDOWN:
        {
            MessageBox(hwnd, "Message box", "Message", MB_OK);
        }
        break;
    case WM_COMMAND:
        {
            switch(LOWORD(wParam))
            {
            case 1:
                {
                        Form1->Label1->Caption = "222";
                }
                break;
            }
 
        }
        break;
    }
 }
в функцию не заходит вообще

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    for (int i=0;i<=15;i++)
    {
        HWND One;
        One = CreateWindow (
         "BUTTON",
         "1",
         WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
         a+=30,
         25,
         30,
         30,
         hWnd,
         (HMENU)i+1,
         (HINSTANCE)hThisInstance,
         0);
   }
0
04.01.2014, 19:23
kventin_zhuk
БНТУ ФИТР
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
04.01.2014, 20:13 5
lips, форму как создаете? контролы появились вообще на форме?

Добавлено через 18 минут
давайте код целиком - гляну
1
lips
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 429
04.01.2014, 22:32  [ТС] 6
Цитата Сообщение от kventin_zhuk Посмотреть сообщение
lips, форму как создаете? контролы появились вообще на форме?

Добавлено через 18 минут
давайте код целиком - гляну
кнопки то появились
я в билдере пишу rad studio 10... проект vcl form application
но это и так весь код больше ничего нету
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    HWND hWnd = this->Handle;
    long hThisInstance = GetWindowLong(hWnd, GWL_HINSTANCE);
    int a = 0;
    for (int i=0;i<=15;i++)
    {
        HWND One;
        One = CreateWindow (
         "BUTTON",
         "1",
         WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
         a+=30,
         25,
         30,
         30,
         hWnd,
         (HMENU)i+1,
         (HINSTANCE)hThisInstance,
         0);
   }
}
//---------------------------------------------------------------------------
 LRESULT WINAPI MainWndProc(HWND hwnd, unsigned int message, WPARAM wParam, LPARAM lParam)
 {
    Form1->Label1->Caption = "111";
    switch (message)
    {
 
    case WM_LBUTTONDOWN:
        {
            MessageBox(hwnd, "Message box", "Message", MB_OK);
        }
        break;
    case WM_COMMAND:
        {
            switch(LOWORD(wParam))
            {
            case 1:
                {
                        Form1->Label1->Caption = "222";
                }
                break;
            }
 
        }
        break;
    }
 }
0
kventin_zhuk
БНТУ ФИТР
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
04.01.2014, 22:38 7
lips, С билдером не работаю .... А где вы и как связываете оконную процедуру MainWndProc с окном своим?
1
lips
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 429
04.01.2014, 22:41  [ТС] 8
Цитата Сообщение от kventin_zhuk Посмотреть сообщение
lips, С билдером не работаю .... А где вы и как связываете оконную процедуру MainWndProc с окном своим?
ни где, если честно я думал что её просто надо вписать и она заработает
0
kventin_zhuk
БНТУ ФИТР
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
04.01.2014, 22:48 9
lips, кнопки вы создать пытаетесь средствами winapi. Может стоит средствами билдера это сделать? Там есть соответствующие компоненты - и у каждого событие Click или onClick - не знаю как уж там точно
1
lips
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 429
04.01.2014, 22:53  [ТС] 10
Цитата Сообщение от kventin_zhuk Посмотреть сообщение
lips, кнопки вы создать пытаетесь средствами winapi. Может стоит средствами билдера это сделать? Там есть соответствующие компоненты - и у каждого событие Click или onClick - не знаю как уж там точно
ну мне надо чтобы они создавались динамически
0
kventin_zhuk
БНТУ ФИТР
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
04.01.2014, 23:05 11
lips, так а динамически нельзя их создать без средств API?

Добавлено через 5 минут
Вот так например:
C++
1
2
3
4
5
6
TButton *new_btn;
new_btn = new TButton (Form1);
new_btn->Parent = Panel1;
new_btn->Top = 5;
new_btn->Left = 5;
new_btn->Caption = "одна кнопа";
1
lips
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 429
04.01.2014, 23:05  [ТС] 12
Цитата Сообщение от kventin_zhuk Посмотреть сообщение
lips, так а динамически нельзя их создать без средств API?
можно
а обработчик тогда как сделать для всех сразу?
0
kventin_zhuk
БНТУ ФИТР
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
04.01.2014, 23:08 13
lips,
Задайте
C++
1
new_btn->OnClick;
1
lips
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 429
04.01.2014, 23:14  [ТС] 14
Цитата Сообщение от kventin_zhuk Посмотреть сообщение
lips,
Задайте
C++
1
new_btn->OnClick;
можно поподробней? пожалуйста
0
kventin_zhuk
БНТУ ФИТР
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
04.01.2014, 23:17 15
lips, Нет среды - показал бы на примере. Вот из того что нагуглил:
OnClick для дин. создаваемых объектов
1
lips
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 429
04.01.2014, 23:26  [ТС] 16
Цитата Сообщение от kventin_zhuk Посмотреть сообщение
lips, Нет среды - показал бы на примере. Вот из того что нагуглил:
OnClick для дин. создаваемых объектов
хмм...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
        TButton *new_btn;
    new_btn = new TButton (Form1);
    new_btn->Parent = Form1;
    new_btn->Top = 5;
    new_btn->Left = 5;
    new_btn->Caption = "одна кнопа";
    new_btn->OnClick=Form1->OnClick;
}
void __fastcall TForm1::OnClick(TObject *Sender)
{
    Form1->Label1->Caption = "123";
}
вот такая ошибка:
Код
[BCC32 Error] Unit1.cpp(83): E2316 '_fastcall TForm1::OnClick(TObject *)' is not a member of 'TForm1'
0
kventin_zhuk
БНТУ ФИТР
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
04.01.2014, 23:34 17
lips,

Добавьте перед реализацией конструктора:
C++
1
2
3
4
void __fastcall MyOnClick(TObject *Sender)
{
    Form1->Label1->Caption = "123";
}
а в нем:

C++
1
new_btn->OnClick=MyOnClick;
1
lips
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 429
04.01.2014, 23:43  [ТС] 18
kventin_zhuk, это в .h файле?
не понял что куда добавить
0
lips
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 429
05.01.2014, 00:03  [ТС] 19
ну чтобы создать кнопку динамически я разобрался
C++
1
2
3
4
5
6
7
    TButton *new_btn;
    new_btn = new TButton (Form1);
    new_btn->Parent = Form1;
    new_btn->Top = 5;
    new_btn->Left = 5;
    new_btn->Caption = "моя кнопка";
    new_btn->OnClick=MyOnClick;
а обработчик клика для неё сделать у меня не получается
0
kventin_zhuk
БНТУ ФИТР
215 / 155 / 42
Регистрация: 26.12.2012
Сообщений: 382
05.01.2014, 00:16 20
lips, думаю в cpp это. Ну там где и было в общем

Добавлено через 3 минуты
Функцию MyOnClick перед вот этим вставьте:
C++
1
2
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
А в нутри этого строчку

C++
1
new_btn->OnClick=Form1->OnClick;
заменить на
C++
1
new_btn->OnClick=MyOnClick;
Добавлено через 28 минут
Решение:

В заголовочный файл добавить:
C++
1
2
3
4
5
6
7
8
9
10
class TForm1 : public TForm
{
__published: // IDE-managed Components
 TImage *Image1;
 TLabel *Label1;
private: // User declarations
public:  // User declarations
 __fastcall TForm1(TComponent* Owner);
 void __fastcall MyOnClick(TObject *Sender); // метод
};
и сам метод будет
C++
1
2
3
4
void __fastcall TForm1::MyOnClick(TObject *Sender)
{
    Form1->Label1->Caption = "123";
}
И при создании кнопки:

C++
1
new_btn->OnClick=Form1->OnMyClick;
2
05.01.2014, 00:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2014, 00:16

Обработчик событий динамически созданных кнопок
Уважаемые форумчане, помогите студентам! У нас есть функция, которая создает количество кнопок,...

Общий обработчик для кнопок с одним классом
Есть код: var btn = document.getElementsByClassName('button'); btn.onclick = function() { ...

Создать массив кнопок, для каждой кнопок будет одинаковый обработчик
Всем привет! Нужна помощь в реализации такой задачи. Нужно создать массив кнопок, для каждой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru