Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Izual
142 / 120 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
1

Баг с SW_SHOW/SW_HIDE

10.08.2015, 05:05. Просмотров 790. Ответов 7
Метки нет (Все метки)

0-комбо бокс, жмёш на элемент, появляются другие комбо боксы. Но! Надо почему то дважды нажать на те которые появляются...
В общем то понятно, что баг связан с тем, что у меня с начала в цикле все "дочерние" комбобоксы SW_HIDE, а о потом при выборе каких либо они становятся SW_SHOW. Но почему так и как исправить?
Просто в реале у меня до 100 элементов, всяких разных и чтоб отобразить какой надо я ставлю лиш SW_SHOW, но чтоб не забыть про остальные, приходится их всех делать SW_HIDE, т.к. иначе писать какой из них HIDE - просто нереально, их слишком много.(даже циклом, просто учесть какой был show и стоит ли его сделать hide - очень много по коду)
Прикрепил файл с тестовым проэктом.
Это сам код основной процедуры:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
 
    HWND FHCB[10];
    int fSci[5];
    char fVdb[2][15]={"Создать","Редактировать"};
    char fVdc[2][20]={"Документ","Ячейка"};
    char fVdd[4][20]={"Размер листа","Область печати","Отступ","Выравнивание"};
    char fVde[7][20]={"Текст","Тип шрифта","Размер шрифта","Объединение","Выравнивание","Ширина колонки","Ширина строки"};
    char fVdf[7][20]={"Верх","Низ","Право","Лево","Центр","Вертикаль","Горизонталь"};
 
    switch (message)
    {
    case WM_CREATE:
        for(int i=0;i<5;i++)
        {
            FHCB[i] = CreateWindow("combobox", NULL , WS_CHILD | CBS_DROPDOWNLIST | WS_OVERLAPPED | WS_TABSTOP, 5, (i*35)+30, 130, 200, hWnd,(HMENU) (int)(ID_VCB0 + i), hInst, NULL);
            ShowWindow(FHCB[i],SW_HIDE);
        }
        ShowWindow(FHCB[0],SW_SHOW);
        for(int i=0;i<2;i++){SendMessage(FHCB[0], CB_ADDSTRING, 0, (LPARAM)fVdb[i]);}
        for(int i=0;i<2;i++){SendMessage(FHCB[1], CB_ADDSTRING, 0, (LPARAM)fVdc[i]);}
        for(int i=0;i<4;i++){SendMessage(FHCB[2], CB_ADDSTRING, 0, (LPARAM)fVdd[i]);}
        for(int i=0;i<7;i++){SendMessage(FHCB[3], CB_ADDSTRING, 0, (LPARAM)fVde[i]);}
        for(int i=0;i<7;i++){SendMessage(FHCB[4], CB_ADDSTRING, 0, (LPARAM)fVdf[i]);}
        for(int i=0;i<5;i++){SendMessage(FHCB[i], CB_SETCURSEL, 0, 0L);}
        SendMessage(hWnd, WM_COMMAND, (WPARAM)ID_VCB0, (LPARAM)0);
        break;
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Parse the menu selections:
        switch (wmId)
        {
        case ID_VCB0:
            for(int i=0;i<5;i++)
            {
                FHCB[i] = GetDlgItem(hWnd, ID_VCB0+i);
                fSci[i] = (int)SendMessageA(FHCB[i], CB_GETCURSEL, 0, 0);
                if(i!=0)
                    ShowWindow(FHCB[i],SW_HIDE);
            }
            if(fSci[0]==0)
            {
                ShowWindow(FHCB[1],SW_SHOW);
                SendMessage(hWnd, WM_COMMAND, (WPARAM)ID_VCB1, (LPARAM)0);
            }
            else
            {
                ShowWindow(FHCB[2],SW_SHOW);
                SendMessage(hWnd, WM_COMMAND, (WPARAM)ID_VCB2, (LPARAM)0);
            }
            break;
        case ID_VCB1:
            for(int i=0;i<5;i++)
            {
                FHCB[i] = GetDlgItem(hWnd, ID_VCB0+i);
                fSci[i] = (int)SendMessageA(FHCB[i], CB_GETCURSEL, 0, 0);
            }
            ShowWindow(FHCB[3],SW_SHOW);
            break;
        case ID_VCB2:
            for(int i=0;i<5;i++)
            {
                FHCB[i] = GetDlgItem(hWnd, ID_VCB0+i);
                fSci[i] = (int)SendMessageA(FHCB[i], CB_GETCURSEL, 0, 0);
            }
            ShowWindow(FHCB[4],SW_SHOW);
            break;
            /////////////////////////////
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: Add any drawing code here...
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
0
Вложения
Тип файла: rar TestBugShowBox.rar (2.35 Мб, 12 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2015, 05:05
Ответы с готовыми решениями:

Баг asio? или баг TCP стека?
всем привет. повстречался с очень странным багом. и не могу определить кто...

Непонятный баг
Пишу программу на Си++ с использованием Qt и FMOD. Вот место, где глючит...

Необъяснимый баг
Здравствуйте! В оконной функции функции WndProc(...) вызывается функция...

Не могу словить баг
Привет, помогите пожалуйста найти баг, есть TabControl Рисуется так: LRESULT...

очень интересный баг
Если кто-нибудь догадается в чем ошибка, то скажите. Ошибку я уже исправил, но...

7
ОгУрЕц
Заблокирован
10.08.2015, 19:41 2
Цитата Сообщение от Izual Посмотреть сообщение
иначе писать какой из них HIDE - просто нереально, их слишком много.
- что в этом нереального IsWindowVisible проверил и всё

Не по теме:

. Погляжу проект отпишусь.

0
Digit@ll
Brainsbreaker
888 / 366 / 51
Регистрация: 01.02.2011
Сообщений: 1,586
11.08.2015, 01:40 3
#include "stdafx.h" всегда должен быть первым, 20 строка (HMENU)ID_VCB0+i, но логика уже нарушается.
0
Izual
142 / 120 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
11.08.2015, 06:09  [ТС] 4
ОгУрЕц, Digit@ll, вопрос слышали?...

Ещё раз. Всё отображается, но нужно 2 раза кликнуть по появляющимся комбо боксам, вместо одного, как это должно быть.

И половина ответа в том что этот баг произошол когда я подряд вызвал SW_HIDE и SW_SHOW.


SW_SHOW должен не только отображать, но давать activate window как написано на мсдн, но ежели при первом клике список не выпадает, то значит окно не активировалось.

Цитата Сообщение от ОгУрЕц Посмотреть сообщение
что в этом нереального
Это касалось того, что в окне очень много элементов.
Цитата Сообщение от Digit@ll Посмотреть сообщение
(HMENU)ID_VCB0+i
У меня компилятор нормально отреагировал именно на мой вариант: (HMENU) (int)(ID_VCB0 + i)

Цитата Сообщение от Digit@ll Посмотреть сообщение
"stdafx.h" всегда должен быть первым
Вася Пупкин сказал?
0
Izual
142 / 120 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
13.08.2015, 23:11  [ТС] 5
Ну и чё, никаких соображений?.. Я наткнулся на какую то тему, где мол чел говорит что нельзя использовать ShowWindow() несколько раз "за присест".
В общем если нет, то сделаю чё массив и корневой обработкой.. Жаль, что придётся лишний функционал писать.
0
Enno
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
14.08.2015, 17:39 6
Цитата Сообщение от Izual Посмотреть сообщение
дважды нажать
Скорее всего окно не имеет фокуса и появляется с развёрнутым списком. Сначала получает фокус, потом происходит выбор. Попробуй под конец твоих хайд/шоу фокус перевести куда-нибудь.
0
Izual
142 / 120 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
05.09.2015, 05:27  [ТС] 7
Enno, фокус не катит, во первых элемент не должен иметь фокус, он должен быть лишь в активном состоянии, ну и во вторых не знаеш на верняка сколько из 100 элементов будут "типа дочерними" и куда фокус дать (даже если фокус не передастся, а случится типа активация состояния).
В общем проблему я решил написав собственную функцию которая парсит все доступные элементы, немного громоздко получилось, т.к. пришлось создавать глобальный массив для хранения состояний.

Ну если кто то всё же знает почему изначально такая вот фигня возникла - буду рад услышать(чисто для инфы, а мб попозже переделаю), т.к. странно что на мсдне в разделе ShowWindow об этом ни слова.
0
Enno
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
05.09.2015, 06:15 8
Цитата Сообщение от Izual Посмотреть сообщение
не должен иметь фокус, он должен быть лишь в активном состоянии
Что за "активное состояние"?
0
05.09.2015, 06:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2015, 06:15

Устал искать баг
Проблемма проста - нужно удалить из вещественной матрицы строку и столбец,...

Возможный баг Visual Studio
Есть кусочек кода case WM_COMMAND: { switch (LOWORD(wParam)) {...

Баг работы мыши с меню
Собственно пишу курсовую и появилась проблема с отловом нажатия мыши... ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru