Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Надписи на кнопках MessageBox  (Прочитано 26966 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« : 24-06-2013 08:56 » 

Ещё один вопросик возник.

Пишу на visual c++ 6.
Есть MessageBox(текст, заголовок,режим).
В зависимости от режима в окне появляются кнопки ДА НЕТ Отмена.
Как изменить названия этих кнопок на свой текст?

Или проще нарисовать свой диалог с 3-мя кнопками?
Поискала в инете, толком не нашла или очень мудрённо Здесь была моя ладья...

Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 24-06-2013 09:50 » 

Сделать свой диалог. Ничего мудреного.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #2 : 24-06-2013 09:59 » 

Свой диалог я уже сделала.

Было желание воспользоваться MessageBox. Там всё красивенько.
Дык и ладно.
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 25-06-2013 00:00 » 

Подумалось: никогда не делал, но, по идее, MB можно засабклассить - свой диалог и будет, но "красивенький" Улыбаюсь
Вот тут нагуглил, например, совсем кастомный диалог, сделанный сабклассингом от Messagebox: http://www.codeguru.com/cpp/w-p/win32/messagebox/article.php/c14605/Fancy-Custom-MessageBox.htm
В упрощённом виде, думаю, в хуке достаточно просто изменить текст кнопок - их ID ведь известно.
« Последнее редактирование: 25-06-2013 00:04 от Вад » Записан
zubr
Гость
« Ответ #4 : 25-06-2013 03:19 » 

Вад, может наблюдаться эффект смены текста. С таким же эффектом можно через хендл кнопок и WM_SETTEXT текст поменять.
Тогда уж лучше перехватывать GDI-функции вывода текста TextOut, DrawText и т. п. Правда, имхо, овчинка выделки не стоит.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 25-06-2013 06:32 » 

Не уверен, что WM_SETTEXT поможет: MessageBox создает модальный диалог.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zubr
Гость
« Ответ #6 : 25-06-2013 06:41 » 

RXL, ну и что. Сам диалог и его дочерние элементы очередь собщений ведь обрабатывает. А послать ему сообщение можно из другого потока.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 25-06-2013 06:47 » 

На мой взгляд, это куда более сложная система, чем нарисовать свой диалог. Просто не понимаю, в чем проблема. В том, что он «некрасивый»? Ну так приложить капельку усилий и скопипастить иконку у MS, вот и вся красота. Делается один раз, не требует многопоточного тестирования с каждой программой.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zubr
Гость
« Ответ #8 : 25-06-2013 07:05 » 

RXL, не спорю, овчинка выделки не стоит.
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 25-06-2013 10:04 » 

Ну, я так понимаю, что там всего делов - один раз написать функцию MyMessageBox, которая ставит хук, кастомизирующий MessageBox, и создаёт сам MessageBox. Я не знаю, стоит ли овчинка выделки - стандартные иконки, наверное, и без того можно вытянуть из системы, при желании. Но люди зачем-то это делают Улыбаюсь
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 25-06-2013 10:44 » 

Содержательно напоминает анекдот про математика и чайник.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 25-06-2013 11:53 » 

Dimka, предложи свой способ!
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 25-06-2013 12:52 » 

RXL, я вообще не понимаю: какая разница, как сделать диалог из надписи с парой кнопочек? Его быстрее сделать, чем рассуждать о том, как Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #13 : 25-06-2013 13:23 » 

Можно сделать гораздо проще, без сабклассинга, но "захучив" (с) SlavaI ф-ю MessageBox

Код: (C++)
INT CBTMessageBox(HWND,LPSTR,LPSTR,UINT);
LRESULT CALLBACK CBTProc(INT, WPARAM, LPARAM);

HHOOK hhk;

INT CBTMessageBox(HWND hwnd, LPCTSTR lpText, LPCTSTR lpCaption,
                                  UINT uType)
{
        hhk = SetWindowsHookEx(WH_CBT, &CBTProc, 0, GetCurrentThreadId());
        return ::MessageBox(hwnd, lpText, lpCaption, uType);
}

LRESULT CALLBACK CBTProc(INT nCode, WPARAM wParam, LPARAM lParam)
{
        if (nCode == HCBT_ACTIVATE)
        {
                HWND hChildWnd = (HWND)wParam;

                if (GetDlgItem(hChildWnd,IDOK))
                        SetDlgItemText(hChildWnd,IDOK,_T("Okidoki"));

                // делаем аналогично для IDYES, IDNO, IDABORT, IDCANCEL, ...

                UnhookWindowsHookEx(hhk);
        }
        else
                CallNextHookEx(hhk, nCode, wParam, lParam);
        return 0;
}
Теперь используем вместо MessageBox -> CBTMessageBox

Если же это MFC приложение, и от AfxMessageBox трудно отказаться, то можно засунуть вызов CBTMessageBox в виртуальную переписанную CWinApp::DoMessageBox.

-> AfxMessageBox(_T("Text"), MB_OK|MB_ICONERROR);




ps см теорию http://www.catch22.net/tuts/custom-messagebox

* ss1.gif (4.84 Кб - загружено 4437 раз.)
« Последнее редактирование: 25-06-2013 13:28 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 26-06-2013 04:42 » 

конечно же проще всего создать класс и ресурс диалога. Это быстро, проверено и работает без отладки ))
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #15 : 26-06-2013 07:35 » 

Насчёт быстро и просто - эт ты загнул. Надо отработать ВСЕ иконки, ВСЕ комбинации кнопок, плюс динамическое изменение размеров диалога в зависимости от длины текста с учётом установленного в системе размера шрифта, как это делается в MessageBox. Ессно это всё придётся отладить (сомневаюсь, что можно с ходу написать такой класс). Я уже не говорю о том, что ВСЕ места в коде, в которых УЖЕ используется MessageBox/AfxMessageBox придётся переделывать.

Так что проще и быстрее точно не будет. Да и кода будет гораздо больше.

Только я не понимаю, чем версия с хуком не нравится? Вот уже действительно быстро и просто. ВЕСЬ код я привёл выше.
« Последнее редактирование: 26-06-2013 07:37 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 26-06-2013 09:55 » 

Цитата: Джон
Надо отработать ВСЕ иконки, ВСЕ комбинации кнопок, плюс динамическое изменение размеров диалога в зависимости от длины текста с учётом установленного в системе размера шрифта, как это делается в MessageBox. Ессно это всё придётся отладить (сомневаюсь, что можно с ходу написать такой класс). Я уже не говорю о том, что ВСЕ места в коде, в которых УЖЕ используется MessageBox/AfxMessageBox придётся переделывать.
Не очень-то понятно, зачем переделывать MessageBox. Если речь о конкретном месте программы, где вот ну очень надо нестандартные кнопки, то очевидно всё перечисленное про зоопарк иконок и изменение размеров смысла не имеет, т.к. в этом конкретном месте будет конкретная надпись и конкретная иконка.

А кому ну очень не нравятся "ОК" и "Отмена", тот пусть МСВС использует с её "Есть" и "Отставить" Улыбаюсь
« Последнее редактирование: 26-06-2013 09:57 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #17 : 26-06-2013 10:50 » 

А кто говорит о переделке MessageBox? Просто меняем текст кнопок.

Ну хорошо, согласен. Я мыслю как всегда глобально, поэтому аргумент про много мест в программе и пр. снимается. Но даже если так. Давай сравним "мой" код с кодом, необходимым для реализации "через свой диалог". Ресурсы надо? Класс надо? Обработка режима надо? Обработка возвращения значения надо? Расстягивать диалог на размер текста надо (в любом случае растягивать статик), учитывая размер шрифта в винде? Это так, навскидку. Нутром чую, что это ещё не всё. Сколько строчек? Сколько времени?

Теперь об эффективности. Чтобы показать такое сообщение, тебе надо будет создавать экземпляр этого класса и вызывать его DoModal. Надо? А как без этого?

Ну и про зоопарк. В задании явно режим не указан:

Есть MessageBox(текст, заголовок,режим).
В зависимости от режима в окне появляются кнопки ДА НЕТ Отмена.
Как изменить названия этих кнопок на свой текст?

Более того, они разные, а кто сказал что они без иконок? Пусть даже если одна. Значит тебе: а) придётся добавить в ресурсы картинку (я уже не говорю о нарисовать, выдрать из системы и тд); б) отображать её на диалоге.

Идём дальше. В задании, текст передаётся в ф-ю MеssageBox, те текст динамический, а не статический. Следовательно, в самом общем случае  надо будет изменять размер.

А вобще как-то неконструктивно. Исходя из соображений выше, я считаю, что этот вариант... "компактней" и следовательно быстрей в реализации. Более того, он универсален, ибо включает нормальное привычное использование окошка сообщений со всеми "вкусностями" MessageBox-а, о которых я сказал в предыдущем сообщении.
В качестве доказательства привёл работающий код (проект не выложил лишь потому, что у меня только VS 2012, а у автора VS6), на который у меня ушло несколько минут. А вот недостатка варианта с хуком не слышу, более "компактного" кода с диалогом аналогичной функциональности не вижу... "И шо?" (с) Поэтому, что действительно не имеет смысла, так это голословная болтовня про якобы преимущества. Ведь если всё так просто с диалогом, нуу... дык докажите. Ага
« Последнее редактирование: 26-06-2013 10:53 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 26-06-2013 12:54 » 

Джон, осталось понять, к чему это всё было сказано... Тут вроде корову никто не покупает...
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #19 : 26-06-2013 13:11 » 

ОК, в доступной форме.

Сообщение 3, внимательно читаем:

Свой диалог я уже сделала.

Было желание воспользоваться MessageBox. Там всё красивенько.
Дык и ладно.

Теперь осталось понять к чему все рассуждения о диалоге, если человек спрашивал про как это сделать с MessageBox. Зубр и Вад предложили ПРОСТОЙ рабочий вариант с хуком, я его даже проиллюстрировал, а вот ВСЁ остальное к чему было сказано?

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #20 : 26-06-2013 15:52 » 

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

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 26-06-2013 18:45 » 

Dimka, так можно далеко зайти Улыбаюсь Аргументы за хук и свою реализацию бессмысленны вне контекста, но зато применимы к любому вновь появляющемуся контексту. Так что я за аргументы - так "в контексте" выбор делать проще.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #22 : 26-06-2013 19:03 » 

Вад, ну... ладно, можно и порассуждать о бытии разных вещей. Главный вопрос в любых хуках - это side-эффекты. Как и в прочих таких случаях, типа аспектно-ориентированное программирование, примеси, прототипы в JavaScript. Т.е. я лично не люблю, когда нечто начинает работать за счёт того, что что-то другое перестаёт работать. Как-то это неправильно. И если уж что-то перекрывать и подменять, да ещё и глобально, то при этом надо точно сознавать последствия. И чем крупнее программа, тем больше осознания нужно.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #23 : 27-06-2013 07:22 » new

Ага, теперь ты глобализируешь. Ага

Какие могут быть side-эффекты, если речь идёт о кратковременной подмене в момент активации? Да, подменили, поменяли текст, но тут же всё вернули. И что? Какая опасность? А "не люблю" - это не аргумент.
С другой стороны, согласен с Вадом. Раз уж тему подняли, то почему бы не обсудить? А иначе, какая польза от этой темы?

- Как поменять текст?
- Сделай свой диалог.
- Я уже его сделала.

И всё?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines