С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 12

Как сделать кнопки диалогового окна не активными на время выполнения процесса??

06.10.2011, 11:22. Показов 4397. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые господа. Помогите пожалуйста новичку. Для управления неким устройством я создал диалоговое окно с набором кнопок с помощью визарда(VS-2008). После ввода необходимых параметров я запускаю работу потока, управляющего устройством и обрабатывающего результаты. Хотелось бы на время работы потока сделать часть кнопок диалогового окна не активным, т.е. "затенить" кнопки и сделать невозможным обращение к ним. Как это сделать из моей программы? И попутно второй вопрос: как сделать так, чтобы при нажатии на кнопку на клавиатуре отображалось нажатие соответствующей кнопки диалогового окна так же, как и при нажатии на нее с помощью мышки?
С уважением, Алексей.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.10.2011, 11:22
Ответы с готовыми решениями:

Как присвоить переменную одного диалогового окна к переменной другого диалогового окна? (ООП)
Вот у меня есть результат вычисления и я его присваиваю переменной в первом диалоговом окне, но я хочу выдать результат во второе...

Сделать кликабельной кнопку на форме во время выполнения процесса (Process.Start)
Добрый день.Хотелось бы отменять Process нажатием на кнопку формы, которая во время работы программы некликабельна. (button1.Enabled=true...

Как в калькуляторе сделать кнопки не активными, пока оба аргумента не будут записаны?
Я сделал калькулятор, есть история операций, но как сделать кнопки неактивными - не знаю. Подскажите.

19
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
06.10.2011, 13:09
1. На время работы потока делай для кнопок EnableWindow(FALSE), а потом - опять EnableWindow(TRUE).
2. А нажатия клавиш обрабатывай в OnChar или OnKeyDown/OnKeyUp класса диалогового окна. Можно тупо вызывать обработчик нажатия кнопки окна - только не забудь предварительно проверить, не задизейблена ли соответствующая кнопка.
0
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 12
06.10.2011, 16:53  [ТС]
Спасибо за ответ, но не понятно (извини бестолкового): EnableWindow - это для всего диалогового окна или можно сделать не активным один из элементов окна? Вопрос ставился именно так. Если можно, пример использования.

Добавлено через 16 минут
Еще раз спасибо, с первым вопросом разобрался. Что касается второго вопроса, то описанные выше обработчики я использовал в своей программе. Для мыши OnLButtonDown и OnLButtonUp, а для управления стрелками клавиатуры OnKeyDown, OnKeyUp и OnGetDlgCode. Вопрос в том, чтобы при нажатии на кнопку клавиатуры обратиться к кнопке в диалоговом окне на экране монитора, что бы отобразить ее нажатие.
0
3 / 3 / 0
Регистрация: 06.10.2011
Сообщений: 35
07.10.2011, 00:05
Цитата Сообщение от danila52 Посмотреть сообщение
Спасибо за ответ, но не понятно (извини бестолкового): EnableWindow - это для всего диалогового окна или можно сделать не активным один из элементов окна? Вопрос ставился именно так. Если можно, пример использования.

Добавлено через 16 минут
Еще раз спасибо, с первым вопросом разобрался. Что касается второго вопроса, то описанные выше обработчики я использовал в своей программе. Для мыши OnLButtonDown и OnLButtonUp, а для управления стрелками клавиатуры OnKeyDown, OnKeyUp и OnGetDlgCode. Вопрос в том, чтобы при нажатии на кнопку клавиатуры обратиться к кнопке в диалоговом окне на экране монитора, что бы отобразить ее нажатие.
если я вас правильно понял то вы хотите использовать клавиши для того что бы функция Enable на кнопках перешла из состояния false в состояние true.
для этого в функциях клавиш пропишите обращение к диалоговому окну и что бы функция Enabled переходила в состояние true при нажатии на клавиатуре
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.10.2011, 10:00
danila52, нам всего лишь нужно воспользоваться методом EnableWindow. Вот и весь код
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
void CEnableButtonDlg::OnOK() 
{
    // TODO: Add extra validation here
    UpdateData(true);//Собрали данные из контролов
    m_ok.EnableWindow(false);//отключили ОК
    long sec = 1;
    long bgn = time(NULL);
    double dif;
    while((dif = difftime(time(NULL),bgn)) <= end)
    {
        if(sec <= dif)
        {
            m_timer.Format("%u sec",(sec++));
            UpdateData(false);//Светим секунды на экране
        }
    }
    m_ok.EnableWindow(true);//Включили ОК
    //Обнулили данные в контролах
    end = 0;
    m_timer = "";
    UpdateData(false);
        
 
//  CDialog::OnOK();
}
Выкладываю также MFC проектик и скомпилированный exe, написанные в 6-ке
Миниатюры
Как сделать кнопки диалогового окна не активными на время выполнения процесса??  
Вложения
Тип файла: rar EnableButton_proj.rar (9.3 Кб, 27 просмотров)
Тип файла: rar EnableButton.exe.rar (4.3 Кб, 17 просмотров)
0
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 12
07.10.2011, 10:30  [ТС]
Уважаемые коллеги. Спасибо Вам за ответы, но к сожалению Вы не правильно меня понимаете. Когда вы нажимаете мышкой кнопку в диалоговом окне, то кнопка утопает, а после поднимается. Такой же реакции кнопки диалогового окна мне бы хотелось и при нажатии стрелки на клавиатуре, чтобы пользователь видел это изменение. Функция EnableWindow(FALSE/TRUE) делает кнопку не активной(что требовалось в моем первом вопросе и благодаря Вам я с ним уже разобрался).
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.10.2011, 12:59
danila52, что конктретно нужно сделать блокировать/разблокировать Button по нажатию заданной кнопки на клавиатуре?
0
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 12
07.10.2011, 15:00  [ТС]
Нужно, чтобы по нажатию кнопки на клавиатуре (используется функция OnKeyDown) соответствующая кнопка диалогового окна, сделанного в визарде, утапливалась, а при отпускании(OnKeyUp) поднималась. Т.е. происходили те же действия, как и при использовании OnLButtonDown и OnLButtonUp при обработке сообщений мыши.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
07.10.2011, 22:36
Цитата Сообщение от danila52 Посмотреть сообщение
на клавиатуре (используется функция OnKeyDown) соответствующая кнопка диалогового окна
что значит соответствующая ???
У тебя экранная клавиатура ??
и все реализовано на кнопках СButton ?
можно послать кнопке сообшение " ой на мне щелкнули"
можно создать класс производный от кнопки
1
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 12
09.10.2011, 17:04  [ТС]
Уважаемый ValeryS. Соответствующая, это та кнопка диалогового окна, нажатие которой мне бы хотелось отобразить при нажатии на кнопку клавиатуры, которая лежит на столе. С чего Вы взяли, что речь идет о виртуальной клавиатуре. Советы типа Вашего (ой на мне щелкнули) не принимаются, поскольку это очевидно. Все методы,обработчики сообщений нажатия кнопки мыши или клавиатуры, описаны в классе, производном от CWnd(хотя от CButton так же все работает). Вопрос остается открытым.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
09.10.2011, 19:17
Цитата Сообщение от danila52 Посмотреть сообщение
оответствующая, это та кнопка диалогового окна, нажатие которой мне бы хотелось отобразить при нажатии на кнопку клавиатуры, которая лежит на столе.
Прекрасное ТЗ

Цитата Сообщение от danila52 Посмотреть сообщение
Советы типа Вашего (ой на мне щелкнули) не принимаются, поскольку это очевидно.
В смысле "Мы не ищем легких путей" ???


Цитата Сообщение от danila52 Посмотреть сообщение
Все методы,обработчики сообщений нажатия кнопки мыши или клавиатуры, описаны в классе, производном от CWnd
вообщето я сказал послать а не обработать
и прямо таки все методы описаны в CWnd
или некоторые переопределены???
и новых в производных классах нет???

Цитата Сообщение от danila52 Посмотреть сообщение
Вопрос остается открытым.
когда все-таки почитаешь что такое сообщение и кто куда что посылает
посмотри код
C++
1
2
3
4
5
6
7
8
9
void CAudioAnalyseDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // TODO: добавьте свой код обработчика сообщений или вызов стандартного
   if(nChar==' ')
    {
     wButAuto.SendMessage(BM_CLICK,0,0);
    }
    CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}
поверь все работает

Добавлено через 2 минуты
BM_CLICK это есть сообщение " ой на мне щелкнули"

Добавлено через 3 минуты
BM_ переводится буттон мессаге сообщения для кнопки
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
 * Button Control Messages
 */
#define BM_GETCHECK        0x00F0
#define BM_SETCHECK        0x00F1
#define BM_GETSTATE        0x00F2
#define BM_SETSTATE        0x00F3
#define BM_SETSTYLE        0x00F4
#if(WINVER >= 0x0400)
#define BM_CLICK           0x00F5
#define BM_GETIMAGE        0x00F6
#define BM_SETIMAGE        0x00F7
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0600)
#define BM_SETDONTCLICK    0x00F8
#endif /* WINVER >= 0x0600 */
 
#if(WINVER >= 0x0400)
вон их сколько
и где они определены в CWnd ????
0
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 12
10.10.2011, 15:18  [ТС]
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
void CLeftButton::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // TODO: Add your message handler code here and/or call default
    CScanDlg m_LeftButton;
    if(m_nkey==0)
    {
        switch(nChar)
        {
            case VK_UP:
                Out32(PORT,UP);
                break;
            case VK_DOWN:
                Out32(PORT,DOWN);
                break;
            case VK_RIGHT:
                Out32(PORT,RIGHT);
                break;
            case VK_LEFT:
                Out32(PORT,LEFT);
                m_LeftButton.SendMessage(BM_CLICK,0,0);
                break;
        }
        StartThread();
        m_nkey=1;
    }
 
    CButton::OnKeyDown(nChar, nRepCnt, nFlags);
}
При нажатии стрелки влево отображения нажатия соответствующей кнопки диалогового окна не происходит. Что не так? Уточните пожалуйста, что должно происходить, когда Вы пишите "проверь все работает".
Что касается Вашего сарказма насчет CWnd, то я имел ввиду, что методы(функции) обработчики сообщений, например OnKeyDown (сообщение WM_KEYDOWN), описаны в классе, производном от CWnd.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
10.10.2011, 15:43
danila52, я тоже вначале ринулся вводить обработчик
Цитата Сообщение от danila52 Посмотреть сообщение
OnKeyDown
грешным делом думая что всё так просто, потом завис пока не прочёл о PreTranslateMessage здесь http://www.firststeps.ru/mfc/steps/r.php?142
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
10.10.2011, 20:22
Цитата Сообщение от ValeryS Посмотреть сообщение
wButAuto.SendMessage(BM_CLICK,0,0);
мой текст
wButAuto. это окно моей кнопки


Цитата Сообщение от danila52 Посмотреть сообщение
m_LeftButton.SendMessage(BM_CLICK,0,0);
твой текст
m_LeftButton это окно твоей кнопки???
если да то все должно работать
если нет куда мы шлем сообщение ???
Цитата Сообщение от danila52 Посмотреть сообщение
Out32(PORT,RIGHT);
что сия аллегория значит????
Цитата Сообщение от danila52 Посмотреть сообщение
Что касается Вашего сарказма насчет CWnd, то я имел ввиду, что методы(функции) обработчики сообщений, например OnKeyDown (сообщение WM_KEYDOWN), описаны в классе, производном от CWnd.
и больше нигде не переопределены?
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
грешным делом думая что всё так просто, потом завис пока не прочёл о PreTranslateMessage
-=ЮрА=-, ты меня удивляешь там же написано перед посылкой сообщения
не видел ни разу когда даблклик подменивается на лефтбуттон

Добавлено через 5 минут
Цитата Сообщение от danila52 Посмотреть сообщение
описаны в классе, производном от CWnd.
миль пардон не заметил в слове описаны
привести в пример кучу классов где они не переопределены
и в самой CWnd это определено как default
нет все таки отладчик великая вещь особенно по Ф11
0
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 12
10.10.2011, 22:12  [ТС]
Что означает "окно кнопки"? Может все-таки wButAuto есть переменная( как говорят друзья англичане variable), присвоенная кнопке? В моем случае именно так, переменная типа control.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
10.10.2011, 22:27
Цитата Сообщение от danila52 Посмотреть сообщение
Что означает "окно кнопки"?
в винде как мы все знаем есть только окна которым посылаются сообщения
Цитата Сообщение от danila52 Посмотреть сообщение
wButAuto есть переменная( как говорят друзья англичане variable), присвоенная кнопке
ты друзей то получше читай
переменная это переменная кнопка это окно
(она не виновата так поучилось) и посему у друзей англичан(точнее американцев)
есть окно и есть класс окна (который к классу С++ не имеет никого отношения)
и вообще я устал спорить
возьми MSDN прочитай и спорь с ними
это они стерляди придумали что сообщение BM_CLICK говорит кнопке что она нажата
я даже согласен что MFC ты знаешь лучше меня(тогда зачем вопросы?)
0
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 12
11.10.2011, 12:54  [ТС]
Спорить Вас никто не заставляет, если знаете как помочь вопрошающему и есть желание ответить, то ответьте без хамства и брюзжания, тем более я написал в самом начале, что в Visual C я новичок и поэтому задаю вопросы, которые могут казаться тривиальными для знатоков. Хотелось бы так же отметить, что в русском языке существуют два местоимения: ты и Вы, и вежливый и воспитанный человек должен знать, какое и в каком случае применять.

Добавлено через 2 часа 25 минут
Всем спасибо. Разобрался. Листинг программы выглядит следующим образом:
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
HWND hDlg;
hDlg = ::FindWindow(NULL, _T("Scan"));
 
void CLeftButton::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // TODO: Add your message handler code here and/or call default
 
    ::SendMessage(::GetDlgItem(hDlg,IDC_LEFTBUTTON), WM_LBUTTONDOWN, 0, 0);
    
    CButton::OnKeyDown(nChar, nRepCnt, nFlags);
}
 
void CLeftButton::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // TODO: Add your message handler code here and/or call default
        
    ::SendMessage(::GetDlgItem(hDlg,IDC_LEFTBUTTON), WM_LBUTTONUP, 0, 0);
    
    CButton::OnKeyUp(nChar, nRepCnt, nFlags);
}
 
UINT CLeftButton::OnGetDlgCode()
{
    // TODO: Add your message handler code here and/or call default
 
    return DLGC_WANTARROWS;
}
Тема закрыта.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
11.10.2011, 13:36
[OFF]

Не по теме:

ValeryS, думал что нам надо нажать кнопку на клавиатуре и отобразить нажатый символ на кнопке окна, а как оказалось ловим

Цитата Сообщение от danila52 Посмотреть сообщение
CLeftButton
- клацание левой клавиши мыши как я понял:D

0
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 12
11.10.2011, 15:08  [ТС]
Юра! Нажимаем кнопку на клавиатуре, при этом отображается нажатие кнопки диалогового окна. Что мне и требовалось.
0
11.10.2011, 16:10

Не по теме:

Цитата Сообщение от danila52 Посмотреть сообщение
WM_LBUTTONDOWN
- меседж от нажатия левой клавиши мыши, на каждое OnKeyDown ты именно это передаёшь в WindowProc, таким образом эмулируешь нажатие кнопки мышью, я же думал тебе на кнопке при нажатии нужно введеный символ светить, вобщем задание твоё не так понял, вот и все....

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.10.2011, 16:10
Помогаю со студенческими работами здесь

Как получить время выполнения процесса в наносекундах?
Скорость выполнения процесса может варьироваться от миллисекунд до нескольких минут, но точность нужно знать в наносекундах. К сожалению,...

Bitmap с фоновым цветом диалогового окна (как сделать?)
Будьте добры, подскажите незнающему: как вставить в диалоговое окно bitmap с прозрачным фоном? Точнее, чтобы фон автоматически не менялся...

Как сделать вычисления внутри диалогового окна, а не по сообщению
Как в VisualBasic 2010 сделать так, чтобы все вычисления проходили внутри диалогового окна? К примеру вводим число и результат без...

Как сделать выравнивание по левому краю заголовка диалогового окна?
В свойствах диалога не нашел данной функции, на msdn нужной функции так же не нашел... Есть какие варианты? По средине как-то не очень...

Ошибка во время запуска диалогового окна
НЕзнаю почему так.Непонимаю как исправить. Пишет ошибку во время запуска диалоговыого окна вот код imglogsave=class //Зона не...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru