Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 1
Регистрация: 23.04.2015
Сообщений: 34
1

Немодальный диалог для изменения цвета фона окна

27.02.2016, 19:54. Показов 1088. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно создать немодальный диалог для изменения цвета фона главного окна. На окне диалога есть 3 элемента Slider и 3 элемента Edit для выбора цвета в формате RGB (в edit выводятся значения от 0 до 255 при изменении положения соответствующего элемента slider). Проблема заключается в следующем: при изменении положения любого элемента прокрутки результат всегда записывается только в edit1, edit2 и edit3 остаются пустыми. Плюс к тому, он записывается некорректно, может быть больше 255 или вообще отрицательным.
И не очень понятно, как сделать так, чтобы в результате цвет сразу же менялся на главном окне. Может кто подскажет, что нужно поправить?

Код процедуры:
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
INT_PTR CALLBACK My2(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)   
{
 
    HWND hEdit1 = GetDlgItem(hDlg, IDC_EDIT1);
    HWND hEdit2 = GetDlgItem(hDlg, IDC_EDIT2);
    HWND hEdit3 = GetDlgItem(hDlg, IDC_EDIT3); 
    wchar_t buffer[10];
    UNREFERENCED_PARAMETER(lParam);
 
    switch (message)
    {
    case WM_INITDIALOG:
        SendMessage(GetDlgItem(hDlg, IDC_SLIDER1), TBM_SETRANGE, TRUE, MAKELONG(0, 255));
        SendMessage(GetDlgItem(hDlg, IDC_SLIDER1), TBM_SETPOS, TRUE, num);
        SendMessage(GetDlgItem(hDlg, IDC_SLIDER2), TBM_SETRANGE, TRUE, MAKELONG(0, 255));
        SendMessage(GetDlgItem(hDlg, IDC_SLIDER2), TBM_SETPOS, TRUE, num);
        SendMessage(GetDlgItem(hDlg, IDC_SLIDER3), TBM_SETRANGE, TRUE, MAKELONG(0, 255));
        SendMessage(GetDlgItem(hDlg, IDC_SLIDER3), TBM_SETPOS, TRUE, num);
 
        return (INT_PTR)TRUE;
 
    case WM_HSCROLL:
 
        if (LOWORD(wParam) == SB_PAGERIGHT){
            num += 50;
        }
 
        if (LOWORD(wParam) == SB_PAGELEFT){
            num -= 50;
 
        }
        if (LOWORD(wParam) == SB_LINELEFT){
            num--;
        }
        if (LOWORD(wParam) == SB_LINERIGHT){
            num++;
        }
        if (LOWORD(wParam) == SB_THUMBTRACK){
            num = HIWORD(wParam);
        }
 
    case IDC_SLIDER1:
        SetScrollPos(GetDlgItem(hDlg, IDC_SLIDER1), SB_CTL, num, TRUE);
        _itow_s(num, buffer, 10);
        SetWindowText(hEdit1, buffer);
        num1 = (int)buffer;
        break;
 
    case IDC_SLIDER2:
        SetScrollPos(GetDlgItem(hDlg, IDC_SLIDER2), SB_CTL, num, TRUE);
        _itow_s(num, buffer, 10);
        SetWindowText(hEdit2, buffer);
        num2 = (int)buffer;
        break;
        
    case IDC_SLIDER3:
        SetScrollPos(GetDlgItem(hDlg, IDC_SLIDER3), SB_CTL, num, TRUE);
        _itow_s(num, buffer, 10);
        SetWindowText(hEdit3, buffer);
        num3 = (int)buffer;
        break;
 
        SetClassLongPtr(hWnd, GCLP_HBRBACKGROUND,(LONG)CreateSolidBrush(RGB(num1, num2, num3)));
        InvalidateRect(hWnd, 0, TRUE);
        UpdateWindow(hWnd);
        UpdateWindow(hDlg);
        break;
 
    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            DestroyWindow(hDlg);
            return (INT_PTR)TRUE;
        }
        
        break;
    }
    return (INT_PTR)FALSE;
}
Миниатюры
Немодальный диалог для изменения цвета фона окна  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.02.2016, 19:54
Ответы с готовыми решениями:

Немодальный диалог в DLL
Пытаюсь в функции DLL создать немодальный диалог с помощью CreateDialog. Функция возвращает ошибку...

Создать немодальный диалог
Написать программу, в которой используется диалог для работы со структурами данных, определяющими...

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

Заменить немодальный диалог на модальный
Всем привет. У меня появилась некоторая проблема, при изучении языка С++Bilder 6.0 Так как я...

2
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
27.02.2016, 22:22 2
Цитата Сообщение от multypulty Посмотреть сообщение
может быть больше 255 или вообще отрицательным
multypulty, какие значения здесь num может иметь? (Можно установить breakpoint и посмотреть.)
Цитата Сообщение от multypulty Посмотреть сообщение
C++
1
2
if (LOWORD(wParam) == SB_PAGELEFT){
 num -= 50;
Что, если здесь добавить точки останова?
Цитата Сообщение от multypulty Посмотреть сообщение
C++
1
2
3
4
5
6
7
SetWindowText(hEdit1, buffer); /* breakpoint */
...
 
 SetWindowText(hEdit2, buffer); /* breakpoint */ 
 
... 
 SetWindowText(hEdit3, buffer); /* breakpoint */
Добавлено через 50 секунд
Как пользоваться отладчиком
1
0 / 0 / 1
Регистрация: 23.04.2015
Сообщений: 34
27.02.2016, 22:57  [ТС] 3
Цитата Сообщение от Alex5 Посмотреть сообщение
Что, если здесь добавить точки останова?
Спасибо за ответ, вопрос уже решен, тему можно закрывать.
Вот рабочий код, если кому понадобится.
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
INT_PTR CALLBACK My2(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)   
{
    HWND hRedScroll = GetDlgItem(hDlg, IDC_SLIDER1);
    HWND hGreenScroll = GetDlgItem(hDlg, IDC_SLIDER2);
    HWND hBlueScroll = GetDlgItem(hDlg, IDC_SLIDER3);
    
    
    static int nxPos=128, nxMin=0, nxMax=255;
    UNREFERENCED_PARAMETER(lParam);
 
    switch (message)
    {
    case WM_INITDIALOG:
        
 
        SendMessage(hRedScroll, TBM_SETRANGE, TRUE, MAKELONG(0, 255));
        SendMessage(hRedScroll, TBM_SETPOS, TRUE, nxPos);
        SendMessage(hGreenScroll, TBM_SETRANGE, TRUE, MAKELONG(0, 255));
        SendMessage(hGreenScroll, TBM_SETPOS, TRUE, nxPos);
        SendMessage(hBlueScroll, TBM_SETRANGE, TRUE, MAKELONG(0, 255));
        SendMessage(hBlueScroll, TBM_SETPOS, TRUE, nxPos);
 
        return (INT_PTR)TRUE;
 
    case WM_HSCROLL:
        
        if (hRedScroll == (HWND)lParam) num = 0;
        if (hGreenScroll == (HWND)lParam) num = 1;
        if (hBlueScroll == (HWND)lParam)num = 2;
 
        switch (LOWORD(wParam)) {
 
        case SB_PAGERIGHT: //На страницу вправо
            nxPos += 50;
            break;
 
        case SB_LINERIGHT: //На одну линию вправо
            nxPos += 1;
            break;
 
        case SB_PAGELEFT: //На страницу влево
            nxPos -= 50;
            break;
 
        case SB_LINELEFT: //На линию влево
            nxPos -= 1;
            break;
 
 
        case SB_THUMBPOSITION: //Любое перемещение
        case SB_THUMBTRACK:
            nxPos = HIWORD(wParam);
            break;
 
        }
 
        //Если позиция больше максимальной
        if (nxPos>nxMax)
        {
            nxPos = nxMax; //Устанавливаем на граничную максимальную
            //Mas[num] = nxMax;
        }
 
        //Если позиция меньше минимальной
        if (nxPos<nxMin)
        {
            nxPos = nxMin; //Устанавливаем на граничную минимальную
            //Mas[num] = nxMin;
 
        }
 
        
        //Вспоминаем, какая полоса была сдвинута
        switch (num) {
        case 0:
            //Перемещаем движок
            SetScrollPos(hRedScroll, SB_CTL, nxPos, TRUE);
            //Выводим в поле ввода новое значение
            SetDlgItemInt(hWndNmod, IDC_EDIT1, nxPos, 0);
            break;
 
        case 1:
            SetScrollPos(hGreenScroll, SB_CTL, nxPos, TRUE);
            SetDlgItemInt(hWndNmod, IDC_EDIT2, nxPos, 0);
            break;
 
        case 2:
            SetScrollPos(hBlueScroll, SB_CTL, nxPos, TRUE);
            SetDlgItemInt(hWndNmod, IDC_EDIT3, nxPos, 0);
            break;
        }
 
        //Новые значения переменных цвета получены из полей ввода
        red = GetDlgItemInt(hWndNmod, IDC_EDIT1, NULL, 0);
        green = GetDlgItemInt(hWndNmod, IDC_EDIT2, NULL, 0);
        blue = GetDlgItemInt(hWndNmod, IDC_EDIT3, NULL, 0);
 
        InvalidateRect(hWnd, NULL, TRUE); //посылается WM_PAINT
        break;
 
    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            DestroyWindow(hDlg);
            return (INT_PTR)TRUE;
        }
        
        break;
    }
    return (INT_PTR)FALSE;
}
 
//обработка WM_PAINT
case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        SetClassLong(hWnd, GCLP_HBRBACKGROUND, (LONG)CreateSolidBrush(RGB(red,green,blue)));
        EndPaint(hWnd, &ps);
        break;
0
27.02.2016, 22:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.02.2016, 22:57
Помогаю со студенческими работами здесь

Изменение цвета фона окна
Как с помощью SendMessage менять цвет фона статика? посылаю в WM_INITDIALOG SendMessage(hStat,...

Изменение цвета фона окна
Добрый день, написал программу, все работает, но хочется изменить цвет фона, на котором крутиться...

Как создать немодальный диалог на Win64 API?
Собственно в Win32 API все довольно легко, а с Win64 возникли траблы. Вот таким образом создаем...

Сабклассирование и немодальный диалог с нажатием ENTER/ESC
Проблема в использовании клавиш Enter и Escape при сабклассировании с испольщованием в качестве...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru