Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
11 / 11 / 11
Регистрация: 28.12.2015
Сообщений: 161

Переключение элементов по Tab (scrollbar)

21.05.2021, 05:44. Показов 3534. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
IsDialogMessage не хочет работать с scrollbar и editbox.

И ещё вопрос, как активировать окно владелец после закрытия всплывающего окна

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include "windows.h"
#include "windowsx.h"
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
 
HWND hMainWnd;
COLORREF colPanel;
 
int RegClass(WNDPROC proc, LPCTSTR szName, HBRUSH background) {
    WNDCLASS ws;
    ws.cbClsExtra = ws.cbWndExtra = 0;
    ws.style = CS_HREDRAW | CS_VREDRAW;
    ws.lpfnWndProc = proc;
    ws.hInstance = GetModuleHandle(0);
    ws.hIcon = LoadIcon(0, IDI_ASTERISK);
    ws.hCursor = LoadCursor(0, IDC_ARROW);
    ws.hbrBackground = background;
    ws.lpszMenuName = 0;
    ws.lpszClassName = szName;
    return (RegisterClass(&ws)!=0);
}
 
 
LRESULT CALLBACK WinPopupProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){
    static HWND hRedScroll, hGreenScroll, hBlueScroll;
    static HWND hEditRed, hEditGreen, hEditBlue;
    static int nxPos; //Среднее положение движка
    switch (msg){
    case WM_CREATE:{
        SCROLLINFO info;
        info.cbSize = sizeof(info);
        info.fMask = SIF_PAGE | SIF_RANGE | SIF_POS | SIF_TRACKPOS;
        info.nMin = 0;
        info.nMax = 255+200-1;
        info.nPos = info.nTrackPos = 127;
        info.nPage = 200;
 
        nxPos = 128;
        //Создание трёх полос для каждого цвета
        hRedScroll=CreateWindow("scrollbar", NULL,
            WS_CHILD|WS_VISIBLE|SBS_HORZ|WS_TABSTOP|WS_GROUP, 10, 10, 200, 25,
            hwnd,10, GetModuleHandle(0), NULL);
        SetScrollInfo(hRedScroll, SB_CTL, &info, FALSE);
 
        hGreenScroll=CreateWindow("scrollbar", NULL,
            WS_CHILD|WS_VISIBLE|SBS_HORZ|WS_TABSTOP, 10, 45, 200, 25,
            hwnd,11, GetModuleHandle(0), NULL);
        SetScrollInfo(hGreenScroll, SB_CTL, &info, FALSE);
 
        hBlueScroll=CreateWindow("scrollbar", NULL,
            WS_CHILD|WS_VISIBLE|SBS_HORZ|WS_TABSTOP, 10, 80, 200, 25,
            hwnd,12, GetModuleHandle(0), NULL);
        SetScrollInfo(hBlueScroll, SB_CTL, &info, FALSE);
 
        //Создание полей ввода со значениями цветов
        hEditRed=CreateWindow("edit", "127",
        WS_CHILD|WS_VISIBLE|WS_BORDER, 10, 115, 30, 25,
        hwnd,(HMENU)0, GetModuleHandle(0), NULL);
 
        hEditGreen=CreateWindow("edit", "127",
        WS_CHILD|WS_VISIBLE|WS_BORDER, 50, 115, 30, 25,
        hwnd,(HMENU)0, GetModuleHandle(0), NULL);
 
        hEditBlue=CreateWindow("edit", "127",
        WS_CHILD|WS_VISIBLE|WS_BORDER, 90, 115, 30, 25,
        hwnd,(HMENU)0, GetModuleHandle(0), NULL);
        return 0;
    }
    case WM_ACTIVATE:{
        if(LOWORD(wParam) == WA_INACTIVE)
            DestroyWindow(hwnd);
        return 0;
    }
    case WM_HSCROLL:{
        switch (LOWORD(wParam)) {
            case SB_LINERIGHT: //На одну линию вправо
                nxPos+=1;
            break;
            case SB_LINELEFT: //На линию влево
                nxPos-=1;
            break;
            case SB_THUMBPOSITION: //Любое перемещение
            case SB_THUMBTRACK:
                nxPos=HIWORD(wParam);
            break;
        }
        char str0[10];
        sprintf(str0,"%d",nxPos);
        if(hRedScroll==(HWND)lParam){
            SetScrollPos(hRedScroll, SB_CTL, nxPos, TRUE);
            SendMessage(hEditRed, WM_SETTEXT, NULL, str0);
        }
        if(hGreenScroll==(HWND)lParam){
            SetScrollPos(hGreenScroll, SB_CTL, nxPos, TRUE);
            SendMessage(hEditGreen, WM_SETTEXT, NULL, str0);
        }
        if(hBlueScroll==(HWND)lParam){
            SetScrollPos(hBlueScroll, SB_CTL, nxPos, TRUE);
            SendMessage(hEditBlue, WM_SETTEXT, NULL, str0);
        }
        HWND ownerHwnd = GetWindow(hwnd, GW_OWNER);
        COLORREF cl = RGB(GetScrollPos(hRedScroll, SB_CTL), GetScrollPos(hGreenScroll, SB_CTL), GetScrollPos(hBlueScroll, SB_CTL));
        PostMessage(ownerHwnd, WM_USER, (WPARAM)cl, 0);
        return 0;
    }
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}
 
 
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstprev, LPSTR cmd, int nShow) {
    //const char* className = "MyClassForm";
    //RegClass(&WinProc, className, CreateSolidBrush(RGB(70,80,90)));
    //hMainWnd = CreateWindowEx(WS_EX_CONTROLPARENT, className, "Form1", WS_OVERLAPPEDWINDOW, 300, 20, 650, 370, 0, 0, hinst, 0);
    //ShowWindow(hMainWnd, nShow);
 
 
    HWND hPopupWnd;
            const char* className = "MyClassPopupForm";
            hPopupWnd = FindWindow(className,"");
            if(hPopupWnd == NULL){
                POINT pt;
                GetCursorPos(&pt);
                RegClass(&WinPopupProc, className, (COLOR_APPWORKSPACE+1));
                hPopupWnd = CreateWindow(className, "", WS_POPUP, pt.x - 240/2, pt.y - 124/2, 240, 150, hMainWnd, 0, GetModuleHandle(0), 0);
                ShowWindow(hPopupWnd, SW_SHOWNORMAL);
            }
    MSG msg; BOOL bRet = 0;
    while(bRet = GetMessage(&msg,0,0,0))
    {
        if ( -1 == bRet )return 0;
        bRet = IsDialogMessage(msg.hwnd, &msg);
        if(!bRet){
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return 0;
    UnregisterClass(className, hinst);
    return (int)(msg.wParam);
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.05.2021, 05:44
Ответы с готовыми решениями:

Как сделать переключение между Edit'ами через Tab
Задачка такова, есть программа на главном окне 2 button, 3 edit, 1 list, 5 static. Как сделать переключение по нажатию Tab между button,...

Запретить переключение клавишей Tab для своего компонента
Мне нужно сделать так, чтобы при нажатии клавиши tab в своем компоненте не переключался фокус, а генерировалось событие OnKeyPress. Как это...

Переключение tab в JTabbedPane
И так есть JTabbedPane, пример в прикреплении. Tab состоит из JPanel (JLabel - название tab'a, JButton - кнопка для его закрытия). ...

1
11 / 11 / 11
Регистрация: 28.12.2015
Сообщений: 161
17.06.2021, 18:05  [ТС]
От IsDialogMessage я отказался.
Решил проблему через через сабклассинг элементов editbox и scrollbar.

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
       
LRESULT CALLBACK CustomCTLProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
    if(uMsg == WM_KEYDOWN){
        if(wParam == VK_TAB || wParam == VK_ESCAPE) {
            // Если клавиша VK_TAB или VK_ESCAPE то переадресовываем сообщение в оконную процедуру главного окна.
            SendMessage(GetParent(hwnd), uMsg, wParam, lParam);
            return 0;
        }
    }
    if(uMsg == WM_DESTROY){
            // Возращаем эелементу scrollbar оригинальную оконную процедуру. 
            WNDPROC oldEditProc =  (WNDPROC)GetWindowLongPtr(hwnd, GWLP_USERDATA);
            SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)oldEditProc);
    }
    // Передаём сообщение в оконную процедуру окна scrollbar
    return CallWindowProc((WNDPROC)GetWindowLongPtr(hwnd, GWLP_USERDATA), hwnd, uMsg, wParam, lParam);
}
 
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){
    switch (msg){
    case WM_CREATE:{
         hRedScroll=CreateWindow("scrollbar", NULL,
            WS_CHILD|WS_VISIBLE|SBS_HORZ|WS_TABSTOP, 48, 35, 200, 25,
            hwnd, (HMENU)0, GetModuleHandle(0), NULL);
        // Заменяем оконную процедуру окна hRedScroll на CustomCTLProc().
        WNDPROC lpScrollProc = (WNDPROC)SetWindowLongPtr(hRedScroll, GWLP_WNDPROC, (LONG_PTR)CustomCTLProc);
        // Запоминаем оригенальную процедуру окна hRedScroll в переменную GWLP_USERDATA окна hRedScroll.
        SetWindowLongPtr(hRedScroll, GWLP_USERDATA, (LONG_PTR)lpScrollProc);
        return 0;
    }
    ...
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}
Вторую проблему тоже решил: отправил сообщение главному окну, чтобы оно сделало DestroyWindow(hwnd); для всплывающего окна.

C
1
2
3
4
5
6
7
    case WM_ACTIVATE:{
        if(LOWORD(wParam) == WA_INACTIVE){
            HWND ownerHwnd = GetWindow(hwnd, GW_OWNER);
            PostMessage(ownerHwnd, WM_COMMAND, (WPARAM)MAKELONG(GetWindowLong(hwnd, GWL_ID),apRGB_Inactive), (LPARAM)hwnd);
        }
        return 0;
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.06.2021, 18:05
Помогаю со студенческими работами здесь

MFC Tab Control переключение вкладок
Привет. Есть два Tab Control'а. В каждом по две вкладки. В первых вкладках List Control'ы. Как сделать так, чтоб по нажатию кнопки...

Opera: переключение по Ctrl+Tab как в Chrome
Ctrl+Tab в опере переключает вкладку только после отпускания кнопки Ctrl Мне же надо, чтобы вкладка переключалась по нажатию Tab

Переключение между фигурами с использованием клавиши TAB
Не могу понять как сделать это действие Помогите ,пожалуйста, суть программы чтобы можно было переключаться между фигурами с помощью...

Не работает Alt+Tab и переключение между окнами
Здравствуйте! Возникла очень неприятная проблема: невозможно переключиться между окнами. Если открыть несколько окон сразу (проводник и...

Переключение между Input Field благодаря Tab
Доброго времени суток, форумчане! Возможно ли сделать переключение между 4-мя Input Field с помощью Tab? Например, если активно для...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru