Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
2 / 2 / 2
Регистрация: 17.10.2013
Сообщений: 126
1

Раскраска кнопок

24.11.2013, 01:01. Просмотров 1861. Ответов 10
Метки нет (Все метки)

Добрый вечер.Поставил пару кнопок в окно.Хочется их закрасить каким-либо цветом и текст вывести каким либо цветом.
Попробовал-
C++
1
2
3
4
         hdc1=GetDC(hButton1);
     SetBkColor(hdc1,RGB(255,255,255));//цвет  фон                           
     SetTextColor(hdc1,RGB(255,0,0));// цвет текста
     ReleaseDC(hButton1,hdc1);
Что-то никак.
Подскажите,пожалуйста.Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.11.2013, 01:01
Ответы с готовыми решениями:

Имитация нажатия кнопок клавиатуры нажатиями кнопок в окне
Скажите,как заменить нажатие кнопок клавиатуры на нажатие кнопок в окне?

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

Из созданного массива кнопок одна из кнопок (9) должна выполнять метод Percent
Из созданного массива кнопок одна из кнопок (9) должна выполнять метод Percent, но после запуска...

Ремонт кнопок тайч-пада и клавиатуры (замена кнопок)
Доброго времени суток. У меня появился нетбук ASUS EeePC 900 HA с несколькими проблемами: на...

10
50 / 49 / 14
Регистрация: 17.11.2012
Сообщений: 427
24.11.2013, 09:12 2
Покажи как ты кнопку создавал
0
2 / 2 / 2
Регистрация: 17.10.2013
Сообщений: 126
24.11.2013, 16:47  [ТС] 3
Добрый день.Кнопку создавал просто-
hButton4=CreateWindow(L"button",L"информация об окне", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,780,0,200, 20, hwnd, (HMENU)10004, hInstance, NULL);
Остальные -тоже так.Это в int WINAPI WinMain (.... Обрабатываю в case WM_COMMAND:
if(LOWORD(wparam)==10004)
{....
Но изменить цвет текста и залить фоном нужного цвета-что-то никак.
Заранее спасибо.
0
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
24.11.2013, 18:45 4
WM_CTLCOLORBTN

C++
1
2
3
case WM_CTLCOLORBTN:
      SetTextColor ((HDC)wParam, RGB (0, 0, 255));
      return hBrush;
0
2 / 2 / 2
Регистрация: 17.10.2013
Сообщений: 126
24.11.2013, 22:32  [ТС] 5
Спасибо.Сделал так-
C++
1
2
3
4
5
 case WM_CTLCOLORBTN:
                {
                         SetTextColor((HDC) wparam,RGB(0,0,0));
                         return (LRESULT)CreateSolidBrush(RGB(255,255,0));
                }
Работает.
Но 1)закрашиваются все кнопки желтым цветом,а как разные кнопки разным цветом.
2)текст на кнопках не виден.
3)кисть надо уничтожить.А где ?Или она сама уничтожается?
Что делать.Подскажите,пожалуйста.Прочитал все.Но что-то не доходит.
Заранее спасибо.
0
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
25.11.2013, 00:59 6
Цитата Сообщение от aznvsk Посмотреть сообщение
Но 1)закрашиваются все кнопки желтым цветом,а как разные кнопки разным цветом.
Цитата Сообщение от aznvsk Посмотреть сообщение
Прочитал все.
Ну и чему равен lParam?

Цитата Сообщение от aznvsk Посмотреть сообщение
3)кисть надо уничтожить.А где ?Или она сама уничтожается?
Это да. Надо уничтожать. Надо создать кисть в WM_CREATE и удалить в WM_DESTROY.
0
2 / 2 / 2
Регистрация: 17.10.2013
Сообщений: 126
25.11.2013, 03:43  [ТС] 7
Спасибо.Про создание и удаление понял.Так и сделал.А с lparam-понял,что это hwnd окна(кнопки).Попробовал использовать так,
C++
1
2
3
4
5
6
7
8
9
10
case WM_CREATE:
    br=CreateSolidBrush(RGB(255,0,0));
    break;  
    
 case WM_CTLCOLORBTN:
        SetWindowText((HWND)lparam, L"ColorXY_AZ");
                 SetBkColor((HDC)wparam,RGB(0,0,255));// цвет фон
                 SetTextColor((HDC)wparam,RGB(255,0,0));// цвет текста
                return ((LRESULT)br);
        break;
Что-то ничего не выходит.Что означает параметр знаю,а как и где использовать,что-то никак.Не понимаю.Возвращается кисть,но не цвет текста,не цвет фона,не надпись на кнопке.
Подскажите,пожалуйста.Заранее спасибо.
0
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
25.11.2013, 13:59 8
Давай весь код.
0
2 / 2 / 2
Регистрация: 17.10.2013
Сообщений: 126
25.11.2013, 14:45  [ТС] 9
Код весь здесь.Последняя версия ,как говорится.
Код рабочий .Мой.
Здесь три нерешенных момента(никак не могу их решить).Обьясняли многие,но не работает и все.
1)По закраске кнопок и надписям на них.С Ваших ответов,я только две кнопки закрасил красным цветом.Подписать не смог.
2)По очистке содержимого окна перед новым кликом.Я сделал по своему.Работает.Но,думаю,можно сделать лучше.Как очищать окно,не пойму.Обьясняли.Сделал,как обьясняли .Не работает ,и еще другие отрицательные моменты появились.Поэтому оставил свой вариант.
3)никак не пойму как вставить анимированную иконку.Простая втавляется.Анимированная никак.Можно таймер поставить и показывать картинки через интервал времени.Но есть ведь нужные функции.Какие не знаю.
Может есть и другие ляпы.

Подскажите,пожалуйста.


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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
//------------------------------- 
 
#include <stdafx.h>
//#include <stdio.h>
//#include <Windowsx.h>
LONG WINAPI WndProc(HWND, UINT, WPARAM,LPARAM);
int xPos, yPos; 
POINT cPt;
int Horres,Vertres;
WORD nSize;
HWND hwnd;
HBRUSH br;
MSG msg;
WNDCLASS w;                                                         
HDC  hdc;
TCHAR szBuf[80] ;
COLORREF color; 
PAINTSTRUCT ps; 
 
HWND    hButton1;
HWND    hButton2;
HWND    hButton3;
HWND    hButton4; 
HWND    hButton5; 
HWND    hButton6; 
HWND    hButton7; 
 
int size_x,size_y; 
int fl=0;
char cbBuffer[MAX_PATH];
int fl_r;
 
 
int  WINAPI WinMain    (HINSTANCE        hInstance,
                        HINSTANCE         hPrevInstance,
                        LPSTR             lpCmdLine,
                        int               nCmdShow)
 
{
 
 
    
    memset(&w, 0, sizeof(WNDCLASS));
    w.style = CS_HREDRAW | CS_VREDRAW;
    w.lpfnWndProc = WndProc;
    w.hInstance = hInstance;
    w.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);    
    w.lpszClassName =L"My Class";
    w.hCursor=LoadCursor(NULL,IDC_CROSS); 
    //w.hIcon = LoadIcon (0,IDI_ASTERISK);//IDI_APPLICATION IDI_HAND IDI_QUESTION IDI_EXCLAMATION   
    //w.hIcon = (HICON)LoadImage(NULL, L"C:\\Documents and Settings\\Admin\\My Documents\\Загрузки\\Картинки\\favicon.ico", IMAGE_ICON,16,16,LR_LOADFROMFILE);//работает            
    w.hIcon =LoadIcon(hInstance,MAKEINTRESOURCEW(300));//работает
        
    RegisterClass(&w);
    
    
      hdc=GetDC(NULL);
      Horres  =    GetDeviceCaps(hdc, HORZRES);
      Vertres =    GetDeviceCaps(hdc, VERTRES);
    
    
 
    
    hwnd = CreateWindow(L"My Class",L"Окно",WS_OVERLAPPEDWINDOW, 0, 0,Horres ,Vertres , NULL, NULL, hInstance, NULL);          
    hButton1=CreateWindow(L"button",L"показывать только последний результат",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|WS_DLGFRAME,0 , 0,300 , 20, hwnd, (HMENU)10001, hInstance, NULL);
    hButton2=CreateWindow(L"button",L"показывать все результаты",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|WS_DLGFRAME,300 , 0,230 , 20, hwnd, (HMENU)10002, hInstance, NULL);
    hButton3=CreateWindow(L"button",L"информация о программе Color_AZ", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,530,0,250, 20, hwnd, (HMENU)10003, hInstance, NULL);      
    hButton4=CreateWindow(L"button",L"информация об окне", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,780,0,205, 20, hwnd, (HMENU)10004, hInstance, NULL);       
    hButton5=CreateWindow(L"button",L"", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_OWNERDRAW,0,19,Horres, 4, hwnd, (HMENU)10005, hInstance, NULL);       
    hButton6=CreateWindow(L"button",L"", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_OWNERDRAW,985,0,Horres-985, 20, hwnd, (HMENU)10006, hInstance, NULL);     
          
        
    SendMessage(hButton2,BM_SETCHECK ,1 , 0);   //установка значкаBST_CHECKED
    fl_r=2;                        
    
    
    SetWindowText(hwnd, L"ColorXY_AZ-программа определения кода цвета и координат точек на экране дисплея.");    
    
    
    ShowWindow(hwnd,nCmdShow);
    
    while(GetMessage(&msg,NULL,0,0))
        {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
        }
    return msg.wParam;
}
 
 
LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
       
    switch (Message)
    {
 
        case WM_DESTROY:         
        PostQuitMessage(0);
        ReleaseDC(NULL,hdc);
        DeleteObject(br);
        break;
    
    
        case WM_SIZE:
            //Запоминаем текущие размеры окна.
            size_x = LOWORD(lparam); 
            size_y = HIWORD(lparam);
         break;
    
    case WM_LBUTTONUP:
                                                              
      if(fl_r==1)
     {
         ShowWindow(hwnd,SW_MINIMIZE);
         ShowWindow(hwnd,SW_MAXIMIZE);
      
      }
   
      GetCursorPos(&cPt);
      xPos   = cPt.x;
      yPos   = cPt.y;
      color  =    GetPixel(hdc,xPos,yPos);
      
      if(GetRValue(color)==0)
      {nSize=wsprintf(szBuf, TEXT("координаты:X:%d,Y:%d,цвет:#%X%X%X%X"), xPos,yPos,GetRValue(color),GetRValue(color),GetGValue(color),GetBValue(color) );}
      
      if(GetGValue(color)==0)
      {nSize=wsprintf(szBuf, TEXT("координаты:X:%d,Y:%d,цвет:#%X%X%X%X"), xPos,yPos,GetRValue(color),GetGValue(color),GetGValue(color),GetBValue(color) );}
      
      if(GetBValue(color)==0)
      {nSize=wsprintf(szBuf, TEXT("координаты:X:%d,Y:%d,цвет:#%X%X%X%X"), xPos,yPos,GetRValue(color),GetGValue(color),GetBValue(color),GetBValue(color) );}
      
      if(GetRValue(color)==0 && GetGValue(color)==0)
      {nSize=wsprintf(szBuf, TEXT("координаты:X:%d,Y:%d,цвет:#%X%X%X%X%X"), xPos,yPos,GetRValue(color),GetRValue(color),GetGValue(color),GetGValue(color),GetBValue(color) );}
      
      if(GetRValue(color)==0 && GetBValue(color)==0)
      {nSize=wsprintf(szBuf, TEXT("координаты:X:%d,Y:%d,цвет:#%X%X%X%X%X"), xPos,yPos,GetRValue(color),GetRValue(color),GetGValue(color),GetBValue(color),GetBValue(color) );}
      
      if(GetGValue(color)==0 && GetBValue(color)==0)
      {nSize=wsprintf(szBuf, TEXT("координаты:X:%d,Y:%d,цвет:#%X%X%X%X%X"), xPos,yPos,GetRValue(color),GetGValue(color),GetGValue(color),GetBValue(color),GetBValue(color) );}
      
      if(GetRValue(color)==0 &&GetGValue(color)==0 && GetBValue(color)==0)
      {nSize=wsprintf(szBuf, TEXT("координаты:X:%d,Y:%d,цвет:#%X%X%X%X%X%X"), xPos,yPos,GetRValue(color),GetRValue(color),GetGValue(color),GetGValue(color),GetBValue(color),GetBValue(color) );}
      
      if(GetRValue(color)!=0 &&GetGValue(color)!=0 && GetBValue(color)!=0)
      {nSize=wsprintf(szBuf, TEXT("координаты:X:%d,Y:%d,цвет:#%X%X%X"), xPos,yPos,GetRValue(color),GetGValue(color),GetBValue(color) );}
      
      SetBkColor(hdc,RGB(255,255,255));//цвет фона                          
      SetTextColor(hdc,RGB(255,0,0));  //цвет текста
    //if(fl!=0) {
    // Создаем красную кисть.
      
       if(xPos<Horres-270){TextOut(hdc,xPos ,yPos, szBuf, nSize);}  
       if(xPos>=Horres-270){SetTextColor(hdc,RGB(0,0,255));TextOut(hdc,xPos-260 ,yPos+5, szBuf, nSize);}
                
      br = CreateSolidBrush(RGB(255, 0, 0));
    // Приписываем кисть к контексту устройства.
      SelectObject(hdc, br);
      Ellipse(hdc, xPos-5, yPos-5, xPos+5, yPos+5);
    // Уничтожаем кисть.
      DeleteObject(br);                 
    //}
      fl=fl+1;                             
    break;      
      
    case WM_COMMAND:
        if(LOWORD(wparam)==10003)
        {      
     MessageBox(hwnd,
     TEXT("ColorXY_AZ-программа определения цвета и координат точек на экране дисплея."),TEXT("О программе ColorXY_AZ"), 0);
        }   
       if(LOWORD(wparam)==10004)
       {      
    
wsprintf((LPWSTR)cbBuffer, TEXT("%s - %d*%d\n%s - %d*%d"), L"Разрешение дисплея           ", Horres,Vertres,L"Размер окна                         ",size_x,size_y);
MessageBox(hwnd,(LPWSTR)cbBuffer,TEXT("Информация об окне            "), MB_OK);    
            
      
       
       }    
        
        if(LOWORD(wparam)==10002) {fl_r=2;}
             
        if(LOWORD(wparam)==10001) {fl_r=1;}
        
 case WM_CREATE:
    br=CreateSolidBrush(RGB(255,0,0));
    break;  
    
 case WM_CTLCOLORBTN:                                                                                                                                   
                return ((LRESULT)br);
        break;       
                
 
 
       default:
       return DefWindowProc(hwnd, Message, wparam, lparam);
    }
    return 0;
}
Добавлено через 29 минут
Вот еще одна проблема с кодом.Я в окно информацию вывожу,но скопировать в буфер не могу.Чтобы код цвета вставить куда либо.Как здесь быть.Заранее спасибо.
0
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
25.11.2013, 17:02 10
В MSND все написано, есть такой волшебный стиль BS_OWNERDRAW и сообщение WM_DRAWITEM, даже отдельная статейка про создание цветных кнопок имеется.
0
2 / 2 / 2
Регистрация: 17.10.2013
Сообщений: 126
25.11.2013, 19:50  [ТС] 11
Спасибо.Буду читать.Стиль BS_OWNERDRAW-есть у меня в коде.Сообщение-WM_DRAWITEM пока не анализирую.
Но если можно ,в двух словах,дайте пожалуйста ,Ваше решение этих трех-четырех проблем по моему коду.Заранее спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.11.2013, 19:50

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Имитация нажатия кнопок клавиатуры нажатиями кнопок в окне
Скажите,как заменить нажатие кнопок клавиатуры на нажатие кнопок в окне?

Как определить индексы соседних кнопок в массиве кнопок?
Массив кнопок 10*10,при нажатии на кнопку она меняет цвет,и соседние с ней тоже.Сама кнопка меняет...

Нужно получить окно из 11 кнопок: 9 кнопок одинакового размера (100х100 пикселей) (GridLayout(3,3)); и 2 кнопки снизу этих 9
Здравствуйте! Нужно получить окно из 11 кнопок: 9 кнопок одинакового размера (100х100 пикселей)...

Раскраска
Добрый день! Здесь описан замечательный урок: тема «Делаем детские разукрашки» Не могли бы вы...


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

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

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