Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для MrMarDok
0 / 0 / 0
Регистрация: 19.04.2013
Сообщений: 4

Зависает при добавлении вкладки в Tab Control

28.04.2013, 20:03. Показов 956. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу сетевой чат на Visual Studio 2010, WinApi, C++, Windows 7.
При нажатии на кнопку открывается окно диалога, в котором в элемент TabControl добавляется соответствующая вкладка. Получая информацию по сети, вызываю ту же функцию TabAdd. Появляется окно почти со всеми элементами(только Edit Control не дорисован) и зависает. Если в момент получения сетевого сообщения окно уже создано, то при добавлении новой вкладки оно точно так же зависает .
Вроде вызываю одну и ту же функцию, а в одном случае всё работает - в другом нет.
Функция добавления вкладки:
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
int TabAdd(char name[])
{
    TC_ITEM tabitem;
    dlg buf;
 
    if(dlghWnd==NULL) //проверка создано ли окно
        InitInstance (szDialogWindowClass, &dlghWnd, hInst, nCmdS, WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_VISIBLE|WS_CLIPCHILDREN, dlg_width, dlg_height);
 
    for(int i=0; i<controls.size(); i++) //поиск уже созданной такой же вкладки
    {
        if(strcmp(controls.at(i).name, name)==0)
        {
            SendMessage(Tab,TCM_SETCURSEL,i,0);
            TabSelect(i);
            return 0;
        }
    }
    tabitem.mask=TCIF_TEXT;
    tabitem.pszText=name;
    SendMessage(Tab,TCM_INSERTITEM,50,LPARAM(&tabitem));
    SendMessage(Tab,TCM_SETCURSEL,controls.size(),0);
    //заполняем структуру, хранящую информацию по содержимом вкладки
    strcpy(buf.name, name);
    buf.editId=2000+controls_num; 
    buf.listId=3000+controls_num; controls_num++;
    buf.edit=CreateWindow("edit",NULL,WS_BORDER|WS_CHILD|WS_VISIBLE|ES_MULTILINE|WS_VSCROLL,20,350,dlg_width-143,dlg_height-400,dlghWnd,(HMENU)buf.editId,hInst,NULL);
    buf.list=CreateWindow("listbox",NULL,WS_BORDER|WS_CHILD|LBS_NOSEL|WS_VISIBLE|WS_VSCROLL,20,40,dlg_width-53,dlg_height-200,dlghWnd,(HMENU)buf.listId,hInst,NULL);
    buf.last=-1;
    BringWindowToTop(buf.edit); BringWindowToTop(buf.list);
    SendMessage (buf.edit,WM_SETFONT,reinterpret_cast<WPARAM>(hfont),MAKELPARAM(1, 0));
    SendMessage (buf.list,WM_SETFONT,reinterpret_cast<WPARAM>(hfont),MAKELPARAM(1, 0));
    controls.push_back(buf);
    //получаем указатель на стандартный обработчик событий edit
    if(EditDefault==NULL)
        EditDefault = (WNDPROC)GetWindowLongPtr(buf.edit,GWLP_WNDPROC);
    //заменяем на собственный
    SetWindowLongPtr(buf.edit,GWLP_WNDPROC,(LONG_PTR)EditProc);
    return 1;
}
Создание основных элементов в окне:
C++
1
2
3
4
5
6
7
8
9
10
11
case WM_CREATE:
        {
        send_button=CreateWindow("button","Отправить", WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON|BS_LEFT,490,363,80,80,hWnd,(HMENU)100,hInst,NULL);
        Tab=CreateWindowEx(0, WC_TABCONTROL,0, WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_VISIBLE,0, 0, dlg_width-4, 490, hWnd, (HMENU)TabCtrl, hInst, NULL);
        close_tab_button=CreateWindow("button","X\nX\nX\nX\nX\nX\nX\nX\nX\nX\nX\nX\nX\nX\nX\nX\nX", WS_CHILD|WS_VISIBLE|BS_MULTILINE|BS_TEXT,570,40,20,dlg_height-208,hWnd,(HMENU)101,hInst,NULL);
        SendMessage (Tab,WM_SETFONT,reinterpret_cast<WPARAM>(hfont),MAKELPARAM(1, 0));
        SendMessage (send_button,WM_SETFONT,reinterpret_cast<WPARAM>(hfont),MAKELPARAM(1, 0));
        SendMessage (close_tab_button,WM_SETFONT,reinterpret_cast<WPARAM>(hfont),MAKELPARAM(1, 0));
        BringWindowToTop(send_button); BringWindowToTop(close_tab_button);
        }
        break;
Поток в котором происходит ожидание сообщений:
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
DWORD WINAPI WaitForMessage(LPVOID xxx)
{
    int num=(int)xxx;
    char buff[100]="";
    int nsize=0;
 
    SOCKET bufsock=clients.at(friends.at(num).client);
 
    todebug("Wait: Запущен поток ожидания сообщений", friends.at(num).name, 0, 1);
    while(nsize=recv(bufsock,buff,sizeof(buff)-1,0))
    {
        if(buff[0])
        {
            todebug("Wait: Получено сообщение", friends.at(num).name, nsize, 3);
 
            // ставим завершающий ноль в конце строки 
            buff[nsize]=0;
            int tab_num=-1;
            
            for(int i=0; i<controls.size(); i++) //поиск нужной вкладки
            {
                if(strcmp(controls.at(i).name, friends.at(num).name)==0)
                {
                    tab_num=i;
                    break;
                }
            }
            if(tab_num==-1) //если вкладка не найдена
                {
                    TabAdd(friends.at(num).name);
                    tab_num=controls.size()-1;
                }
            //вывод текста в ListBox
            ListCout(controls.at(tab_num).list, buff, controls.at(tab_num).name, controls.at(tab_num).last);
            controls.at(tab_num).last=1;
            memset(buff,0,100);
        }
    }
    todebug("Wait: Клиент отключился", friends.at(num).name, nsize, 3);
 
    //ShowTheMessage("Соединение разорвано!");
    friends.at(num).client=-1;
    closesocket(servers.at(friends.at(num).server));
    friends.at(num).server=-1;
    EnableWindow(buttons.at(num).hwnd,1);
 
    return 0;
}
Прикрепил скрин зависшего окна.
Миниатюры
Зависает при добавлении вкладки в Tab Control  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.04.2013, 20:03
Ответы с готовыми решениями:

при смене вкладки tab control - calendar не меняет месяц
Вопрос в следующем,что мне нужно сделать чтобы tab control и calendar взаимодействовали. Ну суть в следующем системно оно месяц переключает...

Edit Control, убрать звук при нажатии Tab
Ну собственно сабж... Как убрать бряконье при нажатие на таб в простом однострочном редакторе? Сразу говорю у меня не диалоговое окно,...

Как работать с Tab Control и Page Control?
В Win32 есть такие Tab Control и Page Control но как ими пользоватся вот ссылка если не понятно выразился ...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.04.2013, 20:03
Помогаю со студенческими работами здесь

msvcrt: Control-H и Backspace Control-I и Tab и т. д
Код import msvcrt print(ord(msvcrt.getch())) выдаст 8, если пользователь нажмёт Backspace, но этот код также выдаст 8, если...

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

При динамическом добавлении кнопки в User Control ничего не происходит
Вот код public partial class UserControl1 : UserControl { public UserControl1() { ...

Зависает компьютер при добавлении оперативки
у меня 2 гига ОЗУ - 2 планки по гигу, добавляю 3 планку, комп виснуть начинает, то перезгрузка, то еще что-нибудь, фирма одна и таже в чем...

При просмотре вкладки Postfix Webmin зависает
ОС: CentOS Linux 6.2 + Webmin 1.580 С некоторого времени веб-интерфейс Webmin стал подтормаживать. Настройки модуля Postfix не...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru