Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создать мессадж бокс с кнопками с другим названием, например "Да и Нет вместо Ок, Отмена" 
:(
    Опции темы
Jade
Дата 13.4.2009, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 18.10.2006
Где: Киев

Репутация: нет
Всего: нет



Всем добрый вечер!
Пишу на C# под .NET 2.0.
Как известно, текст кнопок МессаджБокса зависит от языка, установленного в винде.
Программа на украинском языке, а винда зачастую или русская или английская. Задача была в том, чтобы названия кнопок в мессадж боксе Ок и Отмена (MessageBoxButtons.OkCancel) заменить на "Так" и "Ні" - это Да и Нет по-украински.

Решил проблему следующим образом:

Код


    static class my_box
    {

        [DllImport("User32.Dll")]
        public static extern bool SetWindowText(int hwnd, string str);
        [DllImport("user32.dll")]
        private static extern IntPtr GetDlgItem(IntPtr hwnd, int DlgItem);
        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(IntPtr className, string windowTitle);

        const int timeOutQuant = 5000;
        static Thread backgroundThread;
        static private string _caption;

        //вызываемая из всей остальной программы функция
        public static DialogResult Show(string text, string caption, MessageBoxIcon icon)
        {
          _caption = caption;

          backgroundThread = new Thread(new ThreadStart(button_text_change));
          backgroundThread.Start();
          DialogResult dialogRes = MessageBox.Show(text, caption, MessageBoxButtons.OKCancel, icon);                 
          return dialogRes;           
        }
        
        //меняем тексты кнопок
        private static void button_text_change()
        {
            IntPtr box_window = IntPtr.Zero;
            int quant = 0;
            do
            {
                quant += 1;
                box_window = FindWindow(IntPtr.Zero, _caption);
                if (box_window != IntPtr.Zero)
                {
                    SetWindowText(GetDlgItem(box_window, 2).ToInt32(), "Нi");
                    SetWindowText(GetDlgItem(box_window, 1).ToInt32(), "Так");
                }
                    Thread.Sleep(1);
            }
            //пока окно не закрыли или время ожидания не вышло
            while (box_window == IntPtr.Zero && quant < timeOutQuant);
        }
    }


в этом классе создаю поток, в нем запускаю функцию изменения текстов кнопок.
Работает, но как-то на соплях.
getglditem не всегда возвращает правильный результат (о_О), кнопка OK оказывается то на 1-чке, то на 2-ке...

Подскажите пожалуйста более правильный и стабильный способ, как это сделать.
Заранее спасибо.
PM MAIL ICQ   Вверх
azesmcar
Дата 13.4.2009, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Jade
Да вы - извращенец! smile

Есть апи функция MessageBoxIndirect. Импортируйте ее и дело с концом, или возьмите wrapper.

кстати язык должен быть установлен, а то показывать будет все равно на английском.
PM   Вверх
-Mikle-
Дата 13.4.2009, 20:10 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



Сделайте свой MessageBox. Разве это так трудно? Его наличие в числе стандартных не обязывает вас использовать его. Если он не предоставляет нужных вам возможностей, так сделайте свой! Он ведь не супер-сложная форма, проблем с его созданием не будет! За 15 минут его можно накидать без труда. Стандартные иконки можно вытащить из SystemIcons (SystemIcons.Error, SystemIcons.Exclamation, etc.)

Добавлено через 1 минуту и 17 секунд
Это будет всяко лучше импорта нативных ф-ий из dll'ок


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
azesmcar
Дата 13.4.2009, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Цитата

Сделайте свой MessageBox


Это кстати намного легче (да и намного правильнее) чем импортировать АПИ.
PM   Вверх
Jade
Дата 14.4.2009, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 18.10.2006
Где: Киев

Репутация: нет
Всего: нет



Спасибо.
Писать свой мессаджбокс - это вариант конечно.
Было лень искать и передавать в него эти картинки. Также, в системном автоматически настраивается высота и ширина.
И, я так подозреваю, что показ мессадж-бокса менее ресурсоёмок, нежели показ нарисованного мною окна...

2 azesmcar
Что значит "язык должен быть установлен" ?
ведь моя цель - сделать Так и Ні независимо от языка виндоус...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0430 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.