Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,556
#1

Баг с SW_SHOW/SW_HIDE - C++ WinAPI

10.08.2015, 05:05. Просмотров 667. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Баг с SW_SHOW/SW_HIDE (C++ WinAPI):

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

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

Необъяснимый баг - C++ WinAPI
Здравствуйте! В оконной функции функции WndProc(...) вызывается функция calc(..) char* str=&quot;2+2*2&quot;; static float r; ...

Не могу словить баг - C++ WinAPI
Привет, помогите пожалуйста найти баг, есть TabControl Рисуется так: LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam,...

очень интересный баг - C++
Если кто-нибудь догадается в чем ошибка, то скажите. Ошибку я уже исправил, но не знаю, почему не работает этот код: #include...

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

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

Не по теме:

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

0
Digit@ll
Brainsbreaker
884 / 362 / 31
Регистрация: 01.02.2011
Сообщений: 1,586
11.08.2015, 01:40 #3
#include "stdafx.h" всегда должен быть первым, 20 строка (HMENU)ID_VCB0+i, но логика уже нарушается.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,556
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
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,556
13.08.2015, 23:11  [ТС] #5
Ну и чё, никаких соображений?.. Я наткнулся на какую то тему, где мол чел говорит что нельзя использовать ShowWindow() несколько раз "за присест".
В общем если нет, то сделаю чё массив и корневой обработкой.. Жаль, что придётся лишний функционал писать.
0
Enno
267 / 170 / 38
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
14.08.2015, 17:39 #6
Цитата Сообщение от Izual Посмотреть сообщение
дважды нажать
Скорее всего окно не имеет фокуса и появляется с развёрнутым списком. Сначала получает фокус, потом происходит выбор. Попробуй под конец твоих хайд/шоу фокус перевести куда-нибудь.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,556
05.09.2015, 05:27  [ТС] #7
Enno, фокус не катит, во первых элемент не должен иметь фокус, он должен быть лишь в активном состоянии, ну и во вторых не знаеш на верняка сколько из 100 элементов будут "типа дочерними" и куда фокус дать (даже если фокус не передастся, а случится типа активация состояния).
В общем проблему я решил написав собственную функцию которая парсит все доступные элементы, немного громоздко получилось, т.к. пришлось создавать глобальный массив для хранения состояний.

Ну если кто то всё же знает почему изначально такая вот фигня возникла - буду рад услышать(чисто для инфы, а мб попозже переделаю), т.к. странно что на мсдне в разделе ShowWindow об этом ни слова.
0
Enno
267 / 170 / 38
Регистрация: 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
Привет! Вот еще темы с ответами:

Баг работы мыши с меню - C++ WinAPI
Собственно пишу курсовую и появилась проблема с отловом нажатия мыши... #include &quot;externvars.h&quot; #include &quot;gamengine.h&quot; ...

Возможный баг Visual Studio - C++ WinAPI
Есть кусочек кода case WM_COMMAND: { switch (LOWORD(wParam)) { case IBS_ABOUT: MessageBox(NULL, &quot;ABOUT&quot;,...

Баг в MinGW при использовании fread - C++
Ну собственно вот простой тестовый код который выполняется некорректно: #include &lt;cstdio&gt; using namespace std; const int N =...

Не могу исправить баг в программе-рисовалке - C++ WinAPI
Здравствуйте, уважаемые программисты! Недавно начал писать на C++ (Visual Studio 2012, если что). Ну, само собой, полез сразу в...


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

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

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