Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
place status here
 Аватар для gunslinger
3185 / 2219 / 640
Регистрация: 20.07.2013
Сообщений: 5,999

MessageDlgPos: 1) изменение названий кнопок и 2) размещение в центре вызвавшей формы

23.10.2013, 23:30. Показов 3252. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
1) Немного переделал код из темы Действие по нажатию кнопки на MessageBox:
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
class MessageButtonsAndTitle
{
  public:
    String  yes,
            no,
            title;
};
 
MessageButtonsAndTitle BtnsNTtl;
HHOOK hook;
 
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
        HWND hwnd;
        HWND hwndButton;
 
        if(nCode < 0)
                return CallNextHookEx(hook, nCode, wParam, lParam);
 
        switch(nCode)
        {
            case HCBT_ACTIVATE:
                hwnd = (HWND)wParam;
                hwndButton = GetDlgItem(hwnd, mrYes);
                SetWindowText(hwndButton, BtnsNTtl.yes.c_str());
 
                hwndButton = GetDlgItem(hwnd, mrNo);
                SetWindowText(hwndButton, BtnsNTtl.no.c_str());
 
                hwnd = FindWindow("#32770", "Warning");
                SetWindowText(hwnd, BtnsNTtl.title.c_str());
 
                break;
        }
 
        return CallNextHookEx(hook, nCode, wParam, lParam);
}
 
int MessageDlgPos(const String message, TMsgDlgType DlgType, TMsgDlgButtons Buttons, int x, int y, TMsgDlgBtn DefaultButton)
{
    int messageRes;
    hook = SetWindowsHookEx(
                WH_CBT,
                (HOOKPROC)HookProc,
                NULL,
                GetCurrentThreadId()
                );
    messageRes = MessageDlgPos(message.c_str(), DlgType, Buttons, 0, x, y, DefaultButton);
    UnhookWindowsHookEx(hook);
    return messageRes;
}
Однако после
C++
1
2
3
4
5
6
    BtnsNTtl.yes = "Да";
    BtnsNTtl.no = "Нет";
    BtnsNTtl.title = "Предупреждение";
    MessageDlgPos("Вы действительно хотите разбанить\nвсех игроков из своего бан-листа?\n(Yes = Да, No = Нет)\n\n\
Отменить действие будет невозможно!", mtWarning, TMsgDlgButtons()<< mbYes << mbNo, Form1->Left+(Form1->Width-366)/2,\
 Form1->Top+(Form1->Height-174)/2, mbNo);
изменяется лишь заголовок диалогового окна, текст кнопок остается без изменений.
GetDlgItem(hwnd, mrYes) и GetDlgItem(hwnd, mrNo) не определяют хэндлы кнопок (возвращают 0).

2) Второй вопрос менее важен, но все же интересно, можно ли обойтись без "извращений" вида
Form1->Left+(Form1->Width-366)/2 и Form1->Top+(Form1->Height-174)/2
при указании координат диалогового окна (то есть без явного использования его размеров в виде чисел)?

P.S.: предлагать а)написать свой аналог MessageDlgPos или б)"задействовать" вместо него дополнительную форму
не нужно. Пока вроде всё.
Миниатюры
MessageDlgPos: 1) изменение названий кнопок и 2) размещение в центре вызвавшей формы  
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.10.2013, 23:30
Ответы с готовыми решениями:

Размещение формы в центре
Всем привет, как разместить форму в центре экрана ?

Изменение кнопок родительской формы
Добрый день! Подскажите пожалуйста, пытаюсь через форму изменить видимость кнопок в родительской форме с помощью кода: Form1 frm = new...

Изменение размеров кнопок при изменении самой формы
Когда я увеличиваю форму, то размер кнопок увеличивается неимоверно и они накладываются друг на друга, как сделать чтобы они оставались...

6
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33192 / 21488 / 8233
Регистрация: 22.10.2011
Сообщений: 36,872
Записей в блоге: 12
24.10.2013, 00:36
Лучший ответ Сообщение было отмечено как решение

Решение

Неужели морочиться с хуками проще, чем:
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
int MessageDlgPos(const String message, TMsgDlgType DlgType,
  TMsgDlgButtons Buttons, String const *Captions, TMsgDlgBtn DefaultButton)
{
    TForm *aMsgDlg = CreateMessageDialog(message, DlgType, Buttons, DefaultButton);
    aMsgDlg->Caption = Captions[0];
    int captionIndex = 1;
    for(int i = 0; i < aMsgDlg->ComponentCount; i++)
    {
        TButton *dlgButton = dynamic_cast<TButton*>(aMsgDlg->Components[i]);
        if(dlgButton)
        {
            dlgButton->Caption = Captions[captionIndex++];
        }
    }
    // тут можно и позицию выставить
 
    return aMsgDlg->ShowModal();
}
 
 
void __fastcall TForm1::Button30Click(TObject *Sender)
{
    String captions[] =
    {L"Предупреждение", L"Да", L"Нет"};
    MessageDlgPos(
        L"Вы действительно хотите разбанить\nвсех игроков из своего бан-листа?\n"
        L"(Yes = Да, No = Нет)\n\n\Отменить действие будет невозможно!",
        mtWarning, TMsgDlgButtons() << mbYes << mbNo, &captions[0], mbNo);
}


?
6
 Аватар для aligeri
-1 / 0 / 1
Регистрация: 09.06.2013
Сообщений: 8
14.11.2013, 21:15
Цитата Сообщение от UI Посмотреть сообщение
// тут можно и позицию выставить
return aMsgDlg->ShowModal();
а как определить этой функции возвращаемое значение типа
C++
1
int
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33192 / 21488 / 8233
Регистрация: 22.10.2011
Сообщений: 36,872
Записей в блоге: 12
14.11.2013, 21:21
ShowModal всегда возвращает int.
0
 Аватар для aligeri
-1 / 0 / 1
Регистрация: 09.06.2013
Сообщений: 8
14.11.2013, 22:01
C++
1
2
3
if(MessageDlgPos("Вы действительно хотите?",mtConfirmation,TMsgDlgButtons()<<mbYes<<mbNo<<mbCancel,&captions[0],mbCancel)==mbYes)
 
if(MessageDlgPos("Вы действительно хотите?",mtConfirmation,TMsgDlgButtons()<<mbYes<<mbNo<<mbCancel,&captions[0],mbCancel)==mbNo)
ни один вариант не работает!

Добавлено через 36 минут
Цитата Сообщение от UI Посмотреть сообщение
всегда возвращает int.
ни один вариант не работает!
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33192 / 21488 / 8233
Регистрация: 22.10.2011
Сообщений: 36,872
Записей в блоге: 12
14.11.2013, 22:17
C++
1
2
3
    if (MessageDlgPos(L"Вы действительно хотите?", mtConfirmation,
        TMsgDlgButtons() << mbYes << mbNo << mbCancel, &captions[0],
        mbCancel) == mrYes) // <-- mrYes это не то же самое, что mbYes
, ShowModal возвращает именно значение типа TModalResult
1
 Аватар для aligeri
-1 / 0 / 1
Регистрация: 09.06.2013
Сообщений: 8
14.11.2013, 23:06
Благодарю!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.11.2013, 23:06
Помогаю со студенческими работами здесь

Изменение размера\положения кнопок при resize формы
Всем привет! На форме 9 кнопок, 6 одного и 3 другого размера, пытаюсь изменять их размер\положение при изменении размера формы, но видимо...

Программное изменение ширины и положения кнопок относительно формы
При изменении размеров формы меняется ширина контрола Групбокс, внутри которого должны меняться ширина и X-координата расположения...

Изменение цвета и шрифта кнопок формы при нажатии на кнопку
Изменение цвета и шрифта кнопок формы при нажатии на кнопку

Размещение <div>-а по центре страницы
есть див размещённый божди, его рзмер фиксированый и нужно чтобы он был строго по центре страницы. не подскажите как это сделать...

Генерация названий кнопок из БД
Всем добрый день. Короче такая проблема ,есть кнопки в 2 ряда ,генерация названий кнопок берётся из БД sqlite. Нужно что бы при выборе...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru