ann_nef
|
|
« : 24-06-2013 08:56 » |
|
Ещё один вопросик возник. Пишу на visual c++ 6. Есть MessageBox(текст, заголовок,режим). В зависимости от режима в окне появляются кнопки ДА НЕТ Отмена. Как изменить названия этих кнопок на свой текст? Или проще нарисовать свой диалог с 3-мя кнопками? Поискала в инете, толком не нашла или очень мудрённо
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #1 : 24-06-2013 09:50 » |
|
Сделать свой диалог. Ничего мудреного.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
ann_nef
|
|
« Ответ #2 : 24-06-2013 09:59 » |
|
Свой диалог я уже сделала.
Было желание воспользоваться MessageBox. Там всё красивенько. Дык и ладно.
|
|
|
Записан
|
|
|
|
|
zubr
Гость
|
|
« Ответ #4 : 25-06-2013 03:19 » |
|
Вад, может наблюдаться эффект смены текста. С таким же эффектом можно через хендл кнопок и WM_SETTEXT текст поменять. Тогда уж лучше перехватывать GDI-функции вывода текста TextOut, DrawText и т. п. Правда, имхо, овчинка выделки не стоит.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #5 : 25-06-2013 06:32 » |
|
Не уверен, что WM_SETTEXT поможет: MessageBox создает модальный диалог.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
zubr
Гость
|
|
« Ответ #6 : 25-06-2013 06:41 » |
|
RXL, ну и что. Сам диалог и его дочерние элементы очередь собщений ведь обрабатывает. А послать ему сообщение можно из другого потока.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #7 : 25-06-2013 06:47 » |
|
На мой взгляд, это куда более сложная система, чем нарисовать свой диалог. Просто не понимаю, в чем проблема. В том, что он «некрасивый»? Ну так приложить капельку усилий и скопипастить иконку у MS, вот и вся красота. Делается один раз, не требует многопоточного тестирования с каждой программой.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
zubr
Гость
|
|
« Ответ #8 : 25-06-2013 07:05 » |
|
RXL, не спорю, овчинка выделки не стоит.
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #9 : 25-06-2013 10:04 » |
|
Ну, я так понимаю, что там всего делов - один раз написать функцию MyMessageBox, которая ставит хук, кастомизирующий MessageBox, и создаёт сам MessageBox. Я не знаю, стоит ли овчинка выделки - стандартные иконки, наверное, и без того можно вытянуть из системы, при желании. Но люди зачем-то это делают
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #10 : 25-06-2013 10:44 » |
|
Содержательно напоминает анекдот про математика и чайник.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #11 : 25-06-2013 11:53 » |
|
Dimka, предложи свой способ!
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #12 : 25-06-2013 12:52 » |
|
RXL, я вообще не понимаю: какая разница, как сделать диалог из надписи с парой кнопочек? Его быстрее сделать, чем рассуждать о том, как
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #13 : 25-06-2013 13:23 » |
|
Можно сделать гораздо проще, без сабклассинга, но "захучив" (с) SlavaI ф-ю MessageBox 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."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #14 : 26-06-2013 04:42 » |
|
конечно же проще всего создать класс и ресурс диалога. Это быстро, проверено и работает без отладки ))
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #16 : 26-06-2013 09:55 » |
|
Надо отработать ВСЕ иконки, ВСЕ комбинации кнопок, плюс динамическое изменение размеров диалога в зависимости от длины текста с учётом установленного в системе размера шрифта, как это делается в MessageBox. Ессно это всё придётся отладить (сомневаюсь, что можно с ходу написать такой класс). Я уже не говорю о том, что ВСЕ места в коде, в которых УЖЕ используется MessageBox/AfxMessageBox придётся переделывать. Не очень-то понятно, зачем переделывать MessageBox. Если речь о конкретном месте программы, где вот ну очень надо нестандартные кнопки, то очевидно всё перечисленное про зоопарк иконок и изменение размеров смысла не имеет, т.к. в этом конкретном месте будет конкретная надпись и конкретная иконка. А кому ну очень не нравятся "ОК" и "Отмена", тот пусть МСВС использует с её "Есть" и "Отставить"
|
|
« Последнее редактирование: 26-06-2013 09:57 от Dimka »
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Джон
просто
Администратор
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
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #18 : 26-06-2013 12:54 » |
|
Джон, осталось понять, к чему это всё было сказано... Тут вроде корову никто не покупает...
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Джон
просто
Администратор
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
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #20 : 26-06-2013 15:52 » |
|
Джон, не знаю: показал и ладно. Просто аргументы за хук или за свою реализацию вообще бессмысленны вне контекста задачи и архитектуры исходной программы.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Вад
|
|
« Ответ #21 : 26-06-2013 18:45 » |
|
Dimka, так можно далеко зайти Аргументы за хук и свою реализацию бессмысленны вне контекста, но зато применимы к любому вновь появляющемуся контексту. Так что я за аргументы - так "в контексте" выбор делать проще.
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #22 : 26-06-2013 19:03 » |
|
Вад, ну... ладно, можно и порассуждать о бытии разных вещей. Главный вопрос в любых хуках - это side-эффекты. Как и в прочих таких случаях, типа аспектно-ориентированное программирование, примеси, прототипы в JavaScript. Т.е. я лично не люблю, когда нечто начинает работать за счёт того, что что-то другое перестаёт работать. Как-то это неправильно. И если уж что-то перекрывать и подменять, да ещё и глобально, то при этом надо точно сознавать последствия. И чем крупнее программа, тем больше осознания нужно.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #23 : 27-06-2013 07:22 » |
|
Ага, теперь ты глобализируешь. Какие могут быть 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."
|
|
|
|