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

Visual Studio 6.0 C++ MFC Событие BEGIN_EVENTSINK_MAP

03.04.2013, 15:16. Показов 2746. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача:
1. есть диалог, на нем:
1.1. List Control со столбцами "Штрих-код" и "Количество".
1.2. Check Box

2. если Check Box == 0, то при считывании штрих-кода сканером в колонку "Штрих-код" записываются цифры штрихКода, в колонку "Количество" единица(пока так)
3. если Check Box == 1, то при считывании штрих-кода сканером открывается модально диалог с Edit ами, в один из них помещается считанный штрих-код(можно внести или исправить вручную), в другой вручную вводится количество.
это все получается, работает.

что не получается:
нужно сделать так, что бы, при считывании сканером штрих-кодов в модальном диалоге (с занесенным туда уже считанным штрих-кодом) вновь считанный штрих-код заносился в Edit, там должен оставаться последний считанный.

как сделано то, что работает:
1. в главном диалоге в

BOOL CSbor::OnInitDialog()
....................
if (!m_Scaner.Create(NULL,0,CRect(0,0,0,0), this,IDC_SCANER))
{
MessageBox ( "Сканер НЕ ПОДКЛЮЧЕН!!!", "Ошибка подключения сканера!!!", MB_ICONASTERISK );
return -1; // fail to create
}
m_Scaner.SetAutoDisable(TRUE);
m_Scaner.SetDataEventEnabled(TRUE);
m_Scaner.SetDeviceEnabled(TRUE);
...................

2.
BEGIN_EVENTSINK_MAP(CSbor, CPropertyPage)
ON_EVENT(CSbor, IDC_SCANER, 1 /* DataEvent */, OnDataEventScaner, VTS_NONE)
END_EVENTSINK_MAP()

3.
void CSbor::OnDataEventScaner()
{
}
если я находясь в модальном диалоге и считываю несколько раз штрих-код, то при закрытии диалога вываливаюсь в основной и сразу возникает событие, возвращающее в модальный диалог со следующим считанным штрих-кодом и это столько, сколько раз считывал сканером.

в модальном диалоге добавляю событие и обработчик, но событие не возникает.
1. не понятно, нужно ли опять создавать обоъект или как то передать уже созданный в основном диалоге(if (!m_Scaner.Create(NULL,0...)

2. как узнать, почему событие не происходит, кроме задания точки останова на обработчике?
3. можно ли как то посмотреть какие события происходят вообще?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.04.2013, 15:16
Ответы с готовыми решениями:

MFC в visual studio
Здорова господа!!! У меня щас стоит visual studio 2010, но в ней нет почему то МФС? Где скачать нормальную бесплатную версию visual...

Visual Studio C++ и MFC
Что нужно знать еще чтобы учить MFC за исключением С++?

Visual Studio C++ MFC (графика)
Здравствуйте, прошу о помощи! Возникла необходимость написания графического приложения в Visual Studio. Задача кажется непосильной. Раньше...

18
0 / 0 / 0
Регистрация: 28.12.2010
Сообщений: 49
05.04.2013, 18:00  [ТС]
оказалось при возникновения события я попадаю в обработчик и оттуда вызываю модальный диалог и остаюсь в обработчике, пока этот диалог не закрою.

Теперь не знаю, как из обработчика послать сообщение, что бы открылся диалог, но из обработчика нужно сразу выйти. Есть клавиша вызова модального диалога, как можно симитировать тажатие этой клавиши?
0
 Аватар для Lynatik001
48 / 40 / 15
Регистрация: 28.09.2012
Сообщений: 818
05.04.2013, 19:14
кто мне поможет? а в теме В объекте вид создать функцию, заменяющую побочную диагональ нулями
еще даже 1 ответа нету
0
0 / 0 / 0
Регистрация: 28.12.2010
Сообщений: 49
05.04.2013, 19:52  [ТС]
Lynatik001, спасибо, помогло.
0
 Аватар для Lynatik001
48 / 40 / 15
Регистрация: 28.09.2012
Сообщений: 818
05.04.2013, 19:54
Цитата Сообщение от ВВладимир Посмотреть сообщение
Lynatik001, спасибо, помогло.
сколько сарказма ХД
0
0 / 0 / 0
Регистрация: 28.12.2010
Сообщений: 49
05.04.2013, 23:37  [ТС]
Lynatik001, прасти, не видел твою тему, подумал, подкалываешь, типа, глупость спрашиваешь. Сложно, наверное не будучи экстрасэксом понять, где я лажаю.

Добавлено через 1 час 43 минуты
Цитата Сообщение от ВВладимир Посмотреть сообщение
............, как можно симитировать тажатие этой клавиши?
GetParent()->PostMessage(WM_COMMAND,IDC_Insert,0);
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
06.04.2013, 07:26
Цитата Сообщение от ВВладимир Посмотреть сообщение
что не получается:
нужно сделать так, что бы, при считывании сканером штрих-кодов в модальном диалоге (с занесенным туда уже считанным штрих-кодом) вновь считанный штрих-код заносился в Edit, там должен оставаться последний считанный.
и не получится
модальный диалог на то и модальный что перехватывает все сообщения
вывод или делай не модальный диалог
или читай штрих код в диалоге

Добавлено через 1 минуту
Цитата Сообщение от ВВладимир Посмотреть сообщение
GetParent()->PostMessage(WM_COMMAND,IDC_Insert,0);
и это тоже не дойдет до твоего окна
делай в окне отдельную функцию
а в диалоге вызывай
1
0 / 0 / 0
Регистрация: 28.12.2010
Сообщений: 49
06.04.2013, 22:00  [ТС]
ValeryS, спасибо. Что модальный перехватывает все сообщения, не знал, опыта такого программирования нет.

Наверное я не очень четко свормулировал задачу, но, как будто, получается:
1. есть ГЛАВНЫЙ диалог
2. на ГЛАВНОМ диалоге есть Check Box
3. на ГЛАВНОМ диалоге есть таблица с колонками ("штрих-код", "количество", "цена", "наименование").
4. в одном положении Check Box при считывании штрих-кода сканером появляется строка, штрих-код заносится в колонку "штрих-код", количество равное 1 заносится в колонку "количество".(пока без объединения строк с одинаковым штрих-кодом, потом нужно будет как то сделать).

5. В другом положении Check Box при считывании штрих-кода сканером появляется МОДАЛЬНЫЙ диалог с полями (Едит) "штрих-код", "количество", "цена", "наименование". При появлении МОДАЛЬНОГО диалога штрих-код уже занесен в свое поле, заполняются вручную остальные поля, в том числе и штрих-код, если надо.
если в этот момент считать штрих-код, он теперь заносится в свое поле.

6. Есть на МОДАЛЬНОМ диалоге кнопки: "добавить(+)", "вставить(*)", "удалить(-)", пока нажатие любой кнопки или клавиш, указанных на кнопках, приводят к одному - МОДАЛЬНЫЙ диалог закрывается, в ГЛАВНОМ появляется строка с заполненными полями.

7. На ГЛАВНОМ диалоге есть кнопка "ввод товара", при нажатии этой кнопки открывается этот же МОДАЛЬНЫЙ диалог п.5, позволяющий проделать все те же действия, что и при появлении от считывания сканером.

моя ошибка была в том, что я запускал из обработчика МОДАЛЬНЫЙ диалог и оставался в обработчике, пока не закрою этот диалог. Теперь обработчик в зависимости от Check Box либо выполняет п.4 либо посылает команду GetParent()->PostMessage(WM_COMMAND,IDC_Insert,0); , что приводит к срабатыванию кнопки п.7. Конечно, только при возникновении события первый раз, в другие разы(когда МОДАЛЬНЫЙ диалог открыт) только меняется штрих-код в поле МОДАЛЬНОГО диалога.

Может я не во всем разобрался, делов еще много, но все семь пунктов работают.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
06.04.2013, 23:14
Я не понял зачем такие сложности
вызываешь диалог (который модальный) в нем вносишь что надо
нажмешь ок все внесется в главную программу нажмешь отмена ничего не внесется

например так

вот твой модальный диалог
C++
1
2
3
4
5
6
7
class MyDialog public CDialog
{
................
 public:
int val1;
int val2;
}
вот так ты его вызываешь
C++
1
2
3
4
5
6
7
8
...................
MyDialog dlg;
 
if(dlg.DoModal()==IDOK)// здесь проверяешь вышли по ОК или нет
 {
    a=dlg.val1;
    b=dlg.val2;
 }
зайди на сайт
http://www.firststeps.ru/ вкладка Visual C++ куча примеров, может что и пригодится
0
0 / 0 / 0
Регистрация: 28.12.2010
Сообщений: 49
06.04.2013, 23:29  [ТС]
приблизительно так я и делаю, а насчет выхода из модального только по ОК или Кансел мало, нужно либо добавить товар(количество), либо заменить количество, либо вычесть. И миниму действий, считал сканером, набрал количество, нажал +,- или *.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
07.04.2013, 00:02
Цитата Сообщение от ВВладимир Посмотреть сообщение
И миниму действий, считал сканером, набрал количество, нажал +,- или *.
ну так и выходи
например обработчик +
C++
1
2
3
4
5
void MyDialog::OnPlus()
{
//чтото делаем
CDialog::OnOK();
}
или так
C++
1
2
3
4
5
void MyDialog::OnPlus()
{
//чтото делаем
OnOK();
}
пишу на коленке, по памяти могу и накосячить
но смысл надеюсь понятен
делаем свои действия, потом вызываем метод базового класса ( можешь и своего если он у тебя переопределен)
и вызывающая функция думает что ты нажал ОК

Добавлено через 5 минут
можешь еще ввести поле действия в класс своего диалога чтобы не диалог складывал вычитал, а основная программа
например так
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
class MyDialog public CDialog
{
................
 public:
int val1;
int val2;
}
void MyDialog::OnPlus()
{
val2=1;
OnOK();
}
void MyDialog::OnMinus()
{
val2=2;
OnOK();
}
MyDialog dlg;
 
if(dlg.DoModal()==IDOK)// здесь проверяешь вышли по ОК или нет
 {
    a=dlg.val1;
   switch(dlg.val2)
   {
     case 1:
      a+= dlg.val1;
       break;
    case 2:
      a-== dlg.val1;
        break;
   }
 }
Добавлено через 18 минут
Цитата Сообщение от ВВладимир Посмотреть сообщение
И миниму действий, считал сканером, набрал количество, нажал +,- или *.
ага случайно нажал кнопку и потом тупо чешешь репу, как это исправить
1
0 / 0 / 0
Регистрация: 28.12.2010
Сообщений: 49
07.04.2013, 09:52  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
делаем свои действия, потом вызываем метод базового класса
в модальном диалоге я обрабатываю только нажатия клавиш цифровых, стрелок, забой дел. и т.д., количество, ведь, может быть дробным, да и цена с копейками. А для выхода из модального по клавишам +/-/*/Esc я завел переменную int и буду складывать, вычитать или заменять количество в основном диалоге.
Задумался глядя на
Цитата Сообщение от ValeryS Посмотреть сообщение
a+=
и
Цитата Сообщение от ValeryS Посмотреть сообщение
a-==
как же я буду суммировать и вычитать, ведь, "количество" у меня строка? пока просто добавляю строку.

Цитата Сообщение от ValeryS Посмотреть сообщение
случайно нажал кнопку
не понял, что каждое действия переспрашивать?
Я пишу, как бы, аналог терминала сбора данных, если не знаете, это такая штука, используется для введения в таблицы документов 1С товаров, на экранчике терминала приглашение: введите штрих-код - сканируешь, дальше на экранчике: введите количество - вводишь количество и нажимаешь Ентер. А случайно нажал, для этого и есть возможность минусовать или замещать количество, в некоторых конфигурация терминала и этого нет.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
07.04.2013, 11:23
Цитата Сообщение от ВВладимир Посмотреть сообщение
как же я буду суммировать и вычитать, ведь, "количество" у меня строка?
Я же тебе привел пример
а реализацию сам придумай
сейчас как суммируешь?
Цитата Сообщение от ВВладимир Посмотреть сообщение
дальше на экранчике: введите количество - вводишь количество и нажимаешь Ентер.
т.е Ентер все таки нажимаешь?
Я ведь не настаиваю но "зашита от дурака" по моему должна быть
а если ты хочешь ускорить процесс то лучше бы предусмотреть "горячие клавиши" чтобы не дергаться от клавиатуры к мышке
Цитата Сообщение от ВВладимир Посмотреть сообщение
Задумался глядя на
я там немного описался
нужно было написать
C++
1
2
3
4
a+= dlg.val1;
       break;
    case 2:
      a-=dlg.val1;
0
0 / 0 / 0
Регистрация: 28.12.2010
Сообщений: 49
07.04.2013, 13:13  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
сейчас как суммируешь?
просто новая строка добавляется, в последствии будет сворачиваться таблица(объединяться строки с одинаковым штрих-кодом), как то преобразовываться строка количество в число, суммироваться и опять в строку??? пока не знаю.

Цитата Сообщение от ValeryS Посмотреть сообщение
Ентер все таки нажимаешь
конечно, но в моем случае либо +, либо -, либо *

Цитата Сообщение от ValeryS Посмотреть сообщение
"горячие клавиши"
так и есть, можно вообще без мышки работать. Считал сканером, ввел количество, нажал +. Обычно только этого достаточно, но в модальном диалоге выбор полей цена, штрих-код, наименование тоже возможно клавишами(F2, F3 и т.д.)

Добавлено через 13 минут
если интересно, пока то, что сделано:
http://files.mail.ru/69891F877... 0A05BA1F91

Добавлено через 50 минут
видимо так посылать нельзя exe файл, сам проверил ссылку, ругается
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
07.04.2013, 13:16
Цитата Сообщение от ВВладимир Посмотреть сообщение
если интересно, пока то, что сделано:
посмотрю завтра послезавтра
но у меня нет шестерки так что только общие замечания
Цитата Сообщение от ВВладимир Посмотреть сообщение
преобразовываться строка количество в число,
посмотри функции
atoi atof

Цитата Сообщение от ВВладимир Посмотреть сообщение
суммироваться и опять в строку
itoa sprintf

Добавлено через 2 минуты
Цитата Сообщение от ВВладимир Посмотреть сообщение
видимо так посылать нельзя exe файл,
из проекта выброси папки Debug Release
сожми архиватором и брось сюда
в расширенном режиме заначек скрепки
0
0 / 0 / 0
Регистрация: 28.12.2010
Сообщений: 49
07.04.2013, 14:35  [ТС]
http://files.mail.ru/CE1A5F0C4... 736013135A

скажите, пожалуйста, подобного рода задачи лучше писать на Бэйсике или еще на каком другом языке?
0
0 / 0 / 0
Регистрация: 28.12.2010
Сообщений: 49
12.04.2013, 12:53  [ТС]
что бы строки в таблице CList Control выделялись по-человечески, использую это (нашел где-то в инете)

C++
1
2
3
4
5
6
    // после этого строка в таблице выделяется полностью
    DWORD ExStyle = m_List1.GetExtendedStyle();
    // ExStyle |= LVS_EX_FULLROWSELECT; // что здесь за знак, непонятно
    ExStyle = LVS_EX_FULLROWSELECT;
 
    m_List1.SetExtendedStyle(ExStyle);
что за знак "|", в отладчике смотрю, обе строки(первую я здесь закомментарил) заносят одинаковое чило 32?
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
12.04.2013, 16:12
Цитата Сообщение от ВВладимир Посмотреть сообщение
// ExStyle |= LVS_EX_FULLROWSELECT; // что здесь за знак, непонятно
это означает "ИЛИ", логическое сложение
т.е в этой записи означает к стилям описным в ExStyle добавить LVS_EX_FULLROWSELECT
а здесь
Цитата Сообщение от ВВладимир Посмотреть сообщение
ExStyle = LVS_EX_FULLROWSELECT;
ты пишешь присвоить ExStyle LVS_EX_FULLROWSELECT
остальные стили потерял
1
0 / 0 / 0
Регистрация: 28.12.2010
Сообщений: 49
12.04.2013, 17:17  [ТС]
ValeryS, понял, спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.04.2013, 17:17
Помогаю со студенческими работами здесь

Visual Studio C++ MFC Aplication
Всем привет! Есть задачи одна из них в скором времени достанется мне на рейтенге, Кому интересно порешать вот! Задание 1 ...

Как подсоединить MFC AppWizard к С++ 9.0 Visual Studio ?
Подскажите пожалуйста где можно скачать MFC AppWizard для С++ 9.0 Visual Studio? В инете нашла только для С++ 6. И как его подсоединить?

Visual Studio C++ MFC Application - работа с файлом
Средствами c++ создаётся некий файл: void Cvar5Dlg::OnBnClickedButton2() { CDialog1 dlg; CFile myFile; ...

Построение графиков в MFC приложении Visual Studio.
Ребята, проверьте пожалуйста код программы. Задача построить график функции f(x)=sec x. Вроде бы все правильно, т.е. ошибок при...

Окно со свойствами в проекте MFC, как в Visual Studio
Мне нужно окошечко свойств как в VisualStudio. Обязательно на MFC. Для этого я создал проект SDI со стилем Visual Studio. Там как раз было...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru