С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564

Отлавливание сообщений для удаления временного BOXa

24.02.2013, 19:18. Показов 589. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
И так ситуация следюущяя:
Есть ListView, в которой по нажатию на строку (Double click)- создаётся EditBox. (Экое редактирование SubItemov).
Сделано это через WM_NOTIFY, вот небольшой кусок кода:

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
case WM_NOTIFY:
        switch(LOWORD(wParam))
        {
        case ID_LISTVIEW:
            if(((LPNMHDR)lParam)->code == NM_DBLCLK)
            {
                hListView = GetDlgItem(hWnd, ID_LISTVIEW);
                gsi = ListView_GetNextItem(hListView, -1, LVNI_ALL | LVNI_SELECTED);
                char gc[10]="";
                int gi=0;
                if (gsi != -1)
                {
 
                        ListView_Scroll(hListView,-800,0);
                        RECT subitemrect;
                        lcen = let-1;
                        gsu = ListView_GetSubItemRect(hListView,gsi,lcen,LVIR_BOUNDS,&subitemrect);
                        largura = subitemrect.right - subitemrect.left;
                        xp1 = subitemrect.left;
                        yp1 = subitemrect.top;
                        xp2 = largura;
                        yp2 = 16;
hEditEdt = CreateWindow(TEXT ("edit"), NULL , WS_CHILD | WS_BORDER | ES_NUMBER, xp1+10, yp1+75, xp2, yp2, hWnd,(HMENU) (int)ID_EDITEDT, hInst, NULL);
 
                            HFONT hFontEd =CreateFont(12, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "Arial");
                            SendMessage (hEditEdt, WM_SETFONT, WPARAM (hFontEd), TRUE);
                            DefEditProc = (WNDPROC)SetWindowLong(hEditEdt, GWL_WNDPROC, (long)EditProc);
                            SetFocus(hEditEdt);
                            ShowWindow(hEditEdt, SW_NORMAL);
                        }
                    }
Так вот, в новом EditProc ( Процедура редактирования ) - сделал отлавливание сообщений на кнопки: Enter и Esc. После нажатия каждой, как и правильно должно быть - EditBox удаляется, с соотв. изменениями(или без, если Esc).

Однако окно перекрывается формой ListView если польльзователь вместо ввода символов в появившийся EditBox, нажимает кнопкой на какие то другие элементы в окне, или нажатие клавиш типа Shift+ так же снимают фокус с EditBoxa. Вопрос в том что перекрытие формы не удаляет EditBox, а после перекрытия может остаться палка(не помню как называется - которая при вводе появляется и мигает), но она уже не мигает. Палка удаляется полько при обновлении строки получением фокуса. Так вот как удалять временный EditBox, если пользователь сменил фокус? Честно не знаю куда впихнуть код ( по логике же ~GetFocus, если фокус не в EditBoxe, то if EditBox != NULL - delite EditBox )... И если так написать как я привёл, то это же при каждой манипуляции будет производиться поиск этого бокса и получение фокуса, хотелось бы избежать этого... Может вводом переменной, т.е. в NOTIFY при создании бокса переменной присвоить " 1 ", а при удалении ( Enter или Esc ) - 0 (изначально переменная конешно " 0 "). Но тогда при любом полученном сообщении, уже будет не 2 проверки, а 1 ( а в нутри будут уже ещё, но это не важно, потому что основная будет одна). Я так понимаю такой код нада реализовать в коде рядом с GetMessage/TranslateMessge... У меня этот код в WinMaine выглядит так:
C++
1
2
3
4
5
6
7
8
9
10
11
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_PROJ1));
 
    // Main message loop:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if ( (!IsDialogMessage(hWnd,&msg)) && (!TranslateAccelerator( msg.hwnd, hAccelTable, &msg)) )
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
Буду длагодарен за помощь =)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.02.2013, 19:18
Ответы с готовыми решениями:

Отлавливание сообщений на Ruby
Всем привет. Нужна программа, которая отслеживает появление новых постов в группе вк и, если новый пост появился, вводит его в другом...

Отлавливание сообщений в проекте MFC
Есть проект с двумя классами! Первый, который создается при создании проекта, а второй я добавил сам( в нем файлы соответственно **.h и...

Кнопочка удаления отдельных сообщений
Ситуация состоит в следующем: я уже написал форум (точнее говоря возможность регистрации пользователей и написание ими сообщений). Данные,...

2
840 / 347 / 67
Регистрация: 20.11.2012
Сообщений: 809
24.02.2013, 19:37
Цитата Сообщение от Izual Посмотреть сообщение
как удалять временный EditBox, если пользователь сменил фокус?
Лови WM_KILLFOCUS в оконной процедуре Edit'a и удаляй его.
1
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
24.02.2013, 20:28  [ТС]
WhiteP, спасибо. Всё заработало, маловато знаю, только начал углубляться в WinApi всего 4 месяца назад =)
Сделал так: ( в оконной процедуре EditProc)
C++
1
2
3
4
5
6
7
8
switch (uMsg)
    {
    case WM_KILLFOCUS:
        {
            hEditEdt = GetDlgItem(hWnd, ID_EDITEDT);
            DestroyWindow(hEditEdt);
        }
        break;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.02.2013, 20:28
Помогаю со студенческими работами здесь

phpBB Пропали кнопки изменения, удаления сообщений после смены дизайна
У нас администратор с кривыми руками поменял диз и пропали кнопки изменения, удаления сообщений и при отправке ЛС и сообщений выдается...

слайдер для временного интервала
Доброго времени суток, товарищи, подскажите пожалуйста, как можно реализовать слайдер для временного интервала? что то не особо...

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

Формула спектральной плотности для временного ряда
Добрый день!!! Передо мной стоит задача разработать программу, реализующая построение графика спектральной плотности временного ряда. Вроде...

Почему для временного безымянного объекта не вызывается оператор ()?
Почему AddValue(value)(*pos); не вызывает operator()(int &elem) из класса AddValue? class AddValue { public: AddValue(int...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru