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

цвет

11.01.2011, 16:16. Показов 2100. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток уважаемые коллеги!прошу не судить меня строго,ибо я только учусь.Прошу помочь разобраться со свойством "CreateWindow" ниже приведен часть кода программы на visual c++,где создаются кнопки, надо закрасить кнопки каким-либо цветом. Сколько методов не пробовал-все безуспешно.буду очень признателен за помощь!

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
case WM_CREATE:
 
            //текст
    CreateWindow(TEXT("static"), TEXT("Выбирайте"),
        WS_CHILD|WS_VISIBLE|SS_CENTER,
        30, 10,
        260, 30,
        hWnd, (HMENU)ID_STATIC, hInstance, NULL);
    //DrawThemeBackground(red);
 
 
  
    //кнопка "800х600(8)" вот эти кнопки надо закрасить.
        CreateWindow(TEXT("button"), TEXT("800x600(8)"),
        WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,
        30, 45,
        120, 30, hWnd, (HMENU)ID_CH1,  hInstance, NULL);
      
    //HDC hdc = GetWindowDC(hButton1);
    //SetTextColor(hdc,RGB(255,0,0));
        
    
    //кнопка "800x600(16)"
    CreateWindow(TEXT("button"),  TEXT("800x600(16)"),
        WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,
        30, 75,
        120, 30, hWnd, (HMENU)ID_CH2, hInstance, NULL,SetBkColor(255,0,0));
    
    //кнопка "800x600(32)"
    CreateWindow(TEXT("button"), TEXT("800x600(32)"),
        WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,
        170, 45,
        120, 30, hWnd, (HMENU)ID_CH3, hInstance, NULL);
    
    //кнопка "1024x768(32)"
    CreateWindow(TEXT("button"), TEXT("1024x768(32)"),
        WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,
        170, 75,
        120, 30, hWnd, (HMENU)ID_CH4, hInstance, NULL);
    
    //кнопка "Выход"
    CreateWindow(TEXT("button"), TEXT("Выход"),
        WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,
        110, 180,
        90, 30, hWnd, (HMENU)ID_EXIT, hInstance, NULL);
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.01.2011, 16:16
Ответы с готовыми решениями:

vc++ Цвет эдитов
Здравствуйте, коллеги! Скажу сразу, в теме только начал разбираться, потому если вопрос дилетантский, простите, не со зла. Стоит...

Цвет фона
необходимо чтобы менялся цвет фона статика в зависимости от переменной сделал так HBRUSH CwndLevel::OnCtlColor(CDC* pDC, CWnd* pWnd,...

цвет окна
как можно с помощью WinAPI изменить цвет окна, созданного CreateWindow?

10
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
12.01.2011, 13:28
поменять цвет неклиентской области для отдельно взятого окна нельзя.
это системный параметр, зависящий от стиля окна.
вся кнопка класса "Button" - это неклиентская область.

можно перехватить сообщение "WM_NCPAINT".
оно вызывается, когда окно пытается перерисовать неклиентскую область.
и нарисовать там что угодно и любым цветом уже обычными рисовалками:
Painting and Drawing Functions
0
0 / 0 / 0
Регистрация: 11.01.2011
Сообщений: 5
12.01.2011, 13:54  [ТС]
а каким образом с помощью
Цитата Сообщение от Patch Посмотреть сообщение
WM_NCPAINT"
можно закрасить кнопку?как мне это реализовать? SetTextColor?
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
12.01.2011, 15:26
SetTextColor - меняет цвет текста.
SetBkColor - меняет цвет фона, на котором рисуется текст
Rectangle - рисует заполненный прямоугольник(смотреть MSDN: Filled Shapes)
0
8 / 8 / 2
Регистрация: 12.01.2011
Сообщений: 26
12.01.2011, 16:32
C++
1
2
3
4
5
6
7
case WM_NCPAINT:
{
    HDC hdc;
    hdc = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN);
    SetBkColor(hdc,RGB(255,0,0));
    ReleaseDC(hwnd, hdc);
}
только это не в главной оконной функции, а в оконной функции кнопки, она меняется примерно так SetWindowLong(hButton,GWL_WNDPROC,*адрес новой функции*)
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
12.01.2011, 16:40
Цитата Сообщение от Jeka_T Посмотреть сообщение
только это не в главной оконной функции, а в оконной функции кнопки, она меняется примерно так SetWindowLong(hButton,GWL_WNDPROC,*адрес новой функции*)
точно.
а еще лучше - зарегистрировать собственный класс окна, на базе "Button".
0
0 / 0 / 0
Регистрация: 11.01.2011
Сообщений: 5
13.01.2011, 13:11  [ТС]
попробовал,че-то не получается :

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
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
//Присвоим идентификаторы нашим элементам управления
#define ID_CH1 1
#define ID_CH2 2
#define ID_CH3 3
#define ID_CH4 4
#define ID_EXIT 5
#define ID_STATIC 6
#define ID_LIN 7
 
#include "windows.h"
#include "resource.h"
 
//создаем пропотип функции окна
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
 
TCHAR szProgName[]=TEXT("Имя программы");//имя программы
TCHAR szMenu[]=TEXT("Menu");//меню
HINSTANCE hInstance;
HCURSOR hCurs1,hCurs2;//дескрипторы курсоров
COLORREF color=RGB(255,222,128);
PAINTSTRUCT ps;//создаём экземпляр структуры графического вывода
DWORD dColor[3]={255,222,222};
 
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow)
{
HWND hWnd;//идентификатор окна
MSG IpMsg;//идентификатор сообщения
hInstance=hInst;//дескриптор текущего экземпляра программы
 
WNDCLASS w;//создаем экземпляр структуры WNDCLASS
//И начинаем её заполнять
w.lpszClassName=szProgName;//имя программмы-объявлено выше
w.hInstance=hInst;//идентификатор текущего приложения
w.lpfnWndProc=WndProc;//указатель на функцию окна
w.hCursor=LoadCursor(hInst,MAKEINTRESOURCE(230));//курсор
w.hIcon=LoadIcon(NULL,IDI_APPLICATION);//стандартная иконка приложения WinAPI
w.lpszMenuName=szMenu;//меню
 
 
 
w.hbrBackground=(HBRUSH)GetStockObject(1);//цвет фона окна
COLOR_BTNFACE(hdc,RGB(255,0,0));
 
 
w.style=CS_HREDRAW|CS_VREDRAW;//стиль-перерисовываемое по х и по у
w.cbClsExtra=0;
w.cbWndExtra=0;
 
//Если не удалось зарегистрировать класс окна-выходим
if(!RegisterClass(&w))
return 0;
 
//Создадим окно в памяти, заполнив аргументы CreateWindow
hWnd=CreateWindow(szProgName,//Имя программы
TEXT("Alternative"),//Заголовок окна
WS_OVERLAPPEDWINDOW|WS_VISIBLE|DS_SETFONT|
DS_MODALFRAME|DS_3DLOOK|DS_FIXEDSYS|
WS_CAPTION|WS_SYSMENU,//Стиль окна
COLOR_BTNFACE(hdc,RGB(255,0,0));
 
80,100,//Положение окна на экране по х и по у
330,300,//размеры по х и по у
(HWND)NULL,//идентификатор родительского окна
(HMENU)NULL,//идентификатор меню
hInstance,//идентификатор экземпляра программы
(LPSTR)NULL);//отсутствие дополнительных параметров
 
//Выводим окно из памяти экрана
ShowWindow(hWnd,nCmdShow);
 
//Обновим содержимое окна
UpdateWindow(hWnd);
//Цикл обработки сообщений
while(GetMessage(&IpMsg,NULL,0,0)){
TranslateMessage(&IpMsg);
DispatchMessage(&IpMsg);
}
return((int)IpMsg.wParam);
}
 
//Функция окна
LRESULT CALLBACK WndProc(HWND hWnd,UINT messg,WPARAM wParam, LPARAM lParam)
{
HDC hdc;//создаём контекст устройства
DEVMODE dm;
hCurs1=LoadCursor(NULL,IDC_NO);//задаём настройки курсоров
hCurs2=LoadCursor(NULL,IDC_ARROW);
CHOOSECOLOR cc;
cc.Flags=CC_RGBINIT|CC_FULLOPEN;
cc.hInstance=NULL;
cc.hwndOwner=hWnd;
cc.lCustData=0L;
cc.lpCustColors=dColor;
cc.lpfnHook=NULL;
cc.lpTemplateName=(LPCSTR)NULL;
cc.lStructSize=sizeof(cc);
 
 
 
cc.rgbResult=RGB(255,0,0);
HBRUSH hBrush;
RECT rcClient;//Прямоугольник рабочей области
POINT ptClientUL;//верхний левый угол рабочей области
POINT ptClientLR;//нижний правый угол рабочей области
static POINTS ptsBegin;//исходная точка
static POINTS ptsEnd;//новая конечная точка
static POINTS ptsPrevEnd;//предыдущая конечная точка
static BOOL fPrevLine=FALSE;//флажок предыдущей линии
 
//функция кнопки -я не знаю можно ли так сделать?
    g_fnOldProc = GetWindowLong(hWnd,GWL_WNDPROC); // получаем адрес оригинальной функции
    SetWindowLong(hWnd,GWL_WNDPROC,(LONG)NewProc); // заменяем на нашу
 
LRESULT CALLBACK NewProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    LRESULT res = g_fnWndProc(hWnd,uMsg,wParam,lParam);
    if (uMsg == WM_PAINT) {
        rectangle(35,45,120,35);
        // выполняем требуемые действия
    }
    return (res);
}
 
 
switch(messg)
{
case WM_LBUTTONDOWN:
    //захват ввода данных от мыши
    SetCapture(hWnd);
    
    //Получим экранные координаты рабочей области,
    //и преобразуем их в рабочие координаты
    
    GetClientRect(hWnd, &rcClient);
    ptClientUL.x=rcClient.left;
    ptClientUL.y=rcClient.top;
    
    //Добавим по еденице с правой и нижней стороны, поскольку
    //координаты полученые при помощи GetClientRect не
    //включают в себя крайний левый и крайний нижний пиксели.
    ptClientLR.x=rcClient.right+1;
    ptClientLR.y=rcClient.bottom+1;
    ClientToScreen(hWnd, &ptClientUL);
    ClientToScreen(hWnd, &ptClientLR);
 
    //Скопируем рабочие координаты рабочей области в
    //член rcClient структуры. Ограничен курсор мыши рабочей
    //областью с помощью передачи rcClient структуры в
    //ыункцию ClipCursor
 
    SetRect(&rcClient, ptClientUL.x, ptClientUL.y, ptClientLR.x, ptClientLR.y);
    ClipCursor(&rcClient);
 
    //Преобразуем координаты курсора в структуру POINTS
    //которая определяет исходную точку рисуемой линии
    //в ходе сообщения WM_MOUSEMOVE
 
    ptsBegin=MAKEPOINTS(lParam);
    return 0;
 
        case WM_NCPAINT:
{
 HDC hdc;
    hdc = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN);
    SetBkColor(hdc,RGB(255,0,0));
    ReleaseDC(hwnd, hdc);
    rectangle(35, 45,120, 35);
}
 
case WM_MOUSEMOVE:
 
    //Когда мышь движется, пользователь чтобы нарисовать линию,
    //должен удерживать нажатой левую кнопку мыши
 
    if (wParam & MK_LBUTTON)
    {
        //Получим контекст устройства (DC) для рабочей области
        hdc=GetDC(hWnd);
 
        //Ниже следуют функции гарантирующие, что пиксели
        //предыдущей нарисованной линии установятся в белый и
        //те же самые новые линии установятся в черный
        
            SetROP2(hdc,R2_NOTXORPEN);
 
        //Если линия была нарисованна раньшесообщения WM_MOUSEMOVE
        //то рисование происходит поверх ее. Линия стирается при помощи
        //установки ее пикселя в белый цвет.
 
     if (fPrevLine)
     {
         MoveToEx(hdc, ptsBegin.x, ptsBegin.y,(LPPOINT)NULL);
         LineTo(hdc, ptsPrevEnd.x, ptsPrevEnd.y);
     }
 
     //Преобразуем текущие координаты курсорв в структуру
     //POINTS, а затем нарисуем новую линию.
 
     ptsEnd=MAKEPOINTS(lParam);
     MoveToEx(hdc, ptsBegin.x, ptsBegin.y, (LPPOINT)NULL);
     LineTo(hdc, ptsEnd.x, ptsEnd.y);
 
     //Установим флажок предыдущей линии, сохранив конечную
     //точку новой линии, а затем востановим прежний DC.
     fPrevLine=TRUE;
     ptsPrevEnd=ptsEnd;
     ReleaseDC(hWnd, hdc);
    }
    break;
case WM_LBUTTONUP:
 
    //Пользователь закончил рисовать линиию. Сбросив флажок
    //предыдущей линии, освободим курсор мыши,  и освободим
    //мышь от захвата.
 
    fPrevLine=FALSE;
    ClipCursor(NULL);
    ReleaseCapture();
    return 0;
 
    
case WM_CREATE:
    //текст
    CreateWindow(TEXT("static"), COLOR_WINDOWFRAME, TEXT("Выбирайте"),
        WS_CHILD|WS_VISIBLE|SS_BLACKRECT,
        30, 10,
        260, 30,
        hWnd, (HMENU)ID_STATIC, hInstance, NULL);
    
    //DrawThemeBackground(red);
 
 
  
    //кнопка "800х600(8)"
    button1= CreateWindow(TEXT("button"), TEXT("800x600(8)"),
        WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,
        30, 45,
        120, 30, hWnd, (HMENU)ID_CH1, hInstance, NULL);
 
    //кнопка "800x600(16)"
    CreateWindow(TEXT("button"),  TEXT("800x600(16)"),
        WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,
        30, 75,
        120, 30, hWnd, (HMENU)ID_CH2, hInstance, NULL,SetBkColor(red));
    
    //кнопка "800x600(32)"
    CreateWindow(TEXT("button"), TEXT("800x600(32)"),
        WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,
        170, 45,
        120, 30, hWnd, (HMENU)ID_CH3, hInstance, NULL);
    
    //кнопка "1024x768(32)"
    CreateWindow(TEXT("button"), TEXT("1024x768(32)"),
        WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,
        170, 75,
        120, 30, hWnd, (HMENU)ID_CH4, hInstance, NULL);
    
    //кнопка "Выход"
    CreateWindow(TEXT("button"), TEXT("Выход"),
        WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,
        110, 180,
        90, 30, hWnd, (HMENU)ID_EXIT, hInstance, NULL);
    break;
 
case WM_COMMAND:
 
//Обработка сообщений от элементов управленния
    switch(LOWORD(wParam)) {
    case WM_SETCURSOR:
 
    //изменить вид курсора на перечеркнутый круг при выборе пункта меню
    case ID_CURSOR_DIFFERENT:
    SetClassLong(hWnd,GCL_HCURSOR, (LONG)hCurs1);
    break;
 
//изменить курсор на стандартный
case ID_CURSOR_NORMAL:
SetClassLong(hWnd,GCL_HCURSOR,(LONG)hCurs2);
break;
 
//вызов окна выбора цвета при нажатии пункта меню
case ID_BACKGROUND:
    if (ChooseColor(&cc)){
        color=(COLORREF)cc.rgbResult;
    }
    InvalidateRect(hWnd,NULL,1);
break;
 
//Самое простое-кнопка выхода
case ID_EXIT:
    DestroyWindow(hWnd);
    return 0;
    break;
 
//кнопка "800х600(8)"
case ID_CH1:
    memset(&dm,0,sizeof(DEVMODE));
    dm.dmSize=sizeof(DEVMODE);
    dm.dmBitsPerPel=8;//глубина цвета
    dm.dmPelsWidth=800;//разрешение
    dm.dmPelsHeight=600;
    dm.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;
    ChangeDisplaySettings(&dm,CDS_FULLSCREEN);
break;
 
//кнопка "800х600(16)"
case ID_CH2:
    memset(&dm,0,sizeof(DEVMODE));
    dm.dmSize=sizeof(DEVMODE);
    dm.dmBitsPerPel=16;
    dm.dmPanningWidth=800;
    dm.dmPelsHeight=600;
    dm.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSWIDTH|DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;
    ChangeDisplaySettings(&dm,CDS_FULLSCREEN);
break;
 
//кнопка "800х600(32)"
case ID_CH3:
    memset(&dm,0,sizeof(DEVMODE));
    dm.dmSize=sizeof(DEVMODE);
    dm.dmBitsPerPel=32;
    dm.dmPanningWidth=800;
    dm.dmPelsHeight=600;
    dm.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSWIDTH|DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;
    ChangeDisplaySettings(&dm,CDS_FULLSCREEN);
break;
 
//кнопка "1024х768"
    case ID_CH4:
        memset(&dm, 0, sizeof(DEVMODE));
        dm.dmSize=sizeof(DEVMODE);
        dm.dmBitsPerPel=32;
        dm.dmPelsWidth=1024;
        dm.dmPelsHeight=768;
        dm.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;
        ChangeDisplaySettings(&dm, CDS_FULLSCREEN);
        break;
        break;
    }
    break;//wm-command
 
//рисование
 
 
        PAINTSTRUCT ps;//экземпляр структуры рисования
        hdc=BeginPaint(hWnd, &ps);//начали ирасование
 
        hBrush=CreateSolidBrush(color);//создание кисти
        SelectObject(hdc,hBrush);//выбор кисти
 
        SetBkMode(hdc, TRANSPARENT);
        SetBkColor(hdc, color);
        Rectangle(hdc,0,0,500,500);
 
        EndPaint(hWnd, &ps);//закончили рисование
        break;
    }
//сообщение выхода-разрушение окна
case WM_DESTROY:
    PostQuitMessage(0);//Посылаем сообщение выхода с кодом 0 - нормальное завершение
    break;
 
default:
    return(DefWindowProc(hWnd, messg, wParam, lParam));//освобождаем очередь
    //приложения от нераспознаных функций
    }
/*case WM_NCPAINT:
{
void CMyControl::OnPaint()
{
    dc.FillSolidRect(-1000,-10,Wid+2000,Hig+20,RGB(0,255,0));//зелёный
    dc.FillSolidRect(-20,-20,Wid+40,Hig+40,RGB(0,0,0));//чёрный
    dc.FillSolidRect(0,0,Wid,Hig,RGB(255,0,0));//красный
}*/
 
    return 0;
    }
0
8 / 8 / 2
Регистрация: 12.01.2011
Сообщений: 26
13.01.2011, 13:34
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
//Присвоим идентификаторы нашим элементам управления
#define ID_CH1 1
#define ID_CH2 2
#define ID_CH3 3
#define ID_CH4 4
#define ID_EXIT 5
#define ID_STATIC 6
#define ID_LIN 7
 
#include "windows.h"
#include "resource.h"
 
//создаем пропотип функции окна
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK NewProc(HWND,UINT,WPARAM,LPARAM);
 
TCHAR szProgName[]=TEXT("Имя программы");//имя программы
TCHAR szMenu[]=TEXT("Menu");//меню
HINSTANCE hInstance;
HCURSOR hCurs1,hCurs2;//дескрипторы курсоров
COLORREF color=RGB(255,222,128);
PAINTSTRUCT ps;//создаём экземпляр структуры графического вывода
DWORD dColor[3]={255,222,222};
WNDPROC g_fnOldProc;
 
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow)
{
HWND hWnd;//идентификатор окна
MSG IpMsg;//идентификатор сообщения
hInstance=hInst;//дескриптор текущего экземпляра программы
 
WNDCLASS w;//создаем экземпляр структуры WNDCLASS
//И начинаем её заполнять
w.lpszClassName=szProgName;//имя программмы-объявлено выше
w.hInstance=hInst;//идентификатор текущего приложения
w.lpfnWndProc=WndProc;//указатель на функцию окна
w.hCursor=LoadCursor(hInst,MAKEINTRESOURCE(230));//курсор
w.hIcon=LoadIcon(NULL,IDI_APPLICATION);//стандартная иконка приложения WinAPI
w.lpszMenuName=szMenu;//меню
 
 
 
w.hbrBackground=(HBRUSH)GetStockObject(1);//цвет фона окна
COLOR_BTNFACE(hdc,RGB(255,0,0));
 
 
w.style=CS_HREDRAW|CS_VREDRAW;//стиль-перерисовываемое по х и по у
w.cbClsExtra=0;
w.cbWndExtra=0;
 
//Если не удалось зарегистрировать класс окна-выходим
if(!RegisterClass(&w))
return 0;
 
//Создадим окно в памяти, заполнив аргументы CreateWindow
hWnd=CreateWindow(szProgName,//Имя программы
TEXT("Alternative"),//Заголовок окна
WS_OVERLAPPEDWINDOW|WS_VISIBLE|DS_SETFONT|
DS_MODALFRAME|DS_3DLOOK|DS_FIXEDSYS|
WS_CAPTION|WS_SYSMENU,//Стиль окна
COLOR_BTNFACE(hdc,RGB(255,0,0));
 
80,100,//Положение окна на экране по х и по у
330,300,//размеры по х и по у
(HWND)NULL,//идентификатор родительского окна
(HMENU)NULL,//идентификатор меню
hInstance,//идентификатор экземпляра программы
(LPSTR)NULL);//отсутствие дополнительных параметров
 
//Выводим окно из памяти экрана
ShowWindow(hWnd,nCmdShow);
 
//Обновим содержимое окна
UpdateWindow(hWnd);
//Цикл обработки сообщений
while(GetMessage(&IpMsg,NULL,0,0)){
TranslateMessage(&IpMsg);
DispatchMessage(&IpMsg);
}
return((int)IpMsg.wParam);
}
 
//Функция окна
LRESULT CALLBACK WndProc(HWND hWnd,UINT messg,WPARAM wParam, LPARAM lParam)
{
switch(messg)
{
 
case WM_CREATE:
//текст
CreateWindow(TEXT("static"), COLOR_WINDOWFRAME, TEXT("Выбирайте"),
WS_CHILD|WS_VISIBLE|SS_BLACKRECT,
30, 10,
260, 30,
hWnd, (HMENU)ID_STATIC, hInstance, NULL);
 
//DrawThemeBackground(red);
 
 
 
//кнопка "800х600(8)"
button1= CreateWindow(TEXT("button"), TEXT("800x600(8)"),
WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,
30, 45,
120, 30, hWnd, (HMENU)ID_CH1, hInstance, NULL);
 
//для button1 меняем оконную функцию
g_fnOldProc = GetWindowLong(button1,GWL_WNDPROC); // получаем адрес оригинальной функции
SetWindowLong(hWnd,GWL_WNDPROC,(LONG)NewProc); // заменяем на нашу
 
 
 
 
break;
 
//сообщение выхода-разрушение окна
case WM_DESTROY:
PostQuitMessage(0);//Посылаем сообщение выхода с кодом 0 - нормальное завершение
break;
 
default:
return(DefWindowProc(hWnd, messg, wParam, lParam));//освобождаем очередь
//приложения от нераспознаных функций
}
 
 
return 0;
}
 
LRESULT CALLBACK NewProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
if (uMsg == WM_NCPAINT) 
{
  HDC hdc;
  hdc = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN);
  SetBkColor(hdc,RGB(255,0,0));
  ReleaseDC(hwnd, hdc);
  return 0;
}
  return CallWindowProc(g_fnOldProc, hWnd, uMsg, wParam, lParam);
}
как-то так попробуй, я тут много убрал из твоего кода чтоб нагляднее было
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
13.01.2011, 14:44
сделал проект "с нуля". стандартный "хеллоуворд"
играйся, изучай что цветом управляет.
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
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
// button_color.cpp : Defines the entry point for the application.
//
 
#include "stdafx.h"
#include "resource.h"
 
#define MAX_LOADSTRING 100
 
// Global Variables:
HINSTANCE hInst;                                // current instance
TCHAR szTitle[MAX_LOADSTRING];                              // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];                                // The title bar text
HWND hButton;
WNDPROC OldWindowProc;
 
// Foward declarations of functions included in this code module:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT APIENTRY    ButtonWndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
 
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    // TODO: Place code here.
    MSG msg;
    HACCEL hAccelTable;
 
    // Initialize global strings
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_BUTTON_COLOR, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);
 
    OldWindowProc = 0;
 
    // Perform application initialization:
    if (!InitInstance (hInstance, nCmdShow)) 
    {
        return FALSE;
    }
 
    hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_BUTTON_COLOR);
 
    // Main message loop:
    while (GetMessage(&msg, NULL, 0, 0)) 
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
 
    return msg.wParam;
}
 
 
 
//
//  FUNCTION: MyRegisterClass()
//
//  PURPOSE: Registers the window class.
//
//  COMMENTS:
//
//    This function and its usage is only necessary if you want this code
//    to be compatible with Win32 systems prior to the 'RegisterClassEx'
//    function that was added to Windows 95. It is important to call this function
//    so that the application will get 'well formed' small icons associated
//    with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;
 
    wcex.cbSize = sizeof(WNDCLASSEX); 
 
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = (WNDPROC)WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, (LPCTSTR)IDI_BUTTON_COLOR);
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = (LPCSTR)IDC_BUTTON_COLOR;
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
 
    return RegisterClassEx(&wcex);
}
 
 
//
//   FUNCTION: InitInstance(HANDLE, int)
//
//   PURPOSE: Saves instance handle and creates main window
//
//   COMMENTS:
//
//        In this function, we save the instance handle in a global variable and
//        create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
 
   hInst = hInstance; // Store instance handle in our global variable
 
   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
 
   if (!hWnd)
   {
      return FALSE;
   }
 
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
 
   return TRUE;
}
 
//
//  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND  - process the application menu
//  WM_PAINT    - Paint the main window
//  WM_DESTROY  - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    TCHAR szHello[MAX_LOADSTRING];
    LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
 
    switch (message) 
    {
        case WM_COMMAND:
            wmId    = LOWORD(wParam); 
            wmEvent = HIWORD(wParam); 
            // Parse the menu selections:
            switch (wmId)
            {
                case IDM_ABOUT:
                   DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
                   break;
                case IDM_EXIT:
                   DestroyWindow(hWnd);
                   break;
                default:
                   return DefWindowProc(hWnd, message, wParam, lParam);
            }
            break;
        case WM_CREATE:
 
            //текст
            hButton = CreateWindow(TEXT("STATIC"), TEXT("Выбирайте"),
                WS_CHILD|WS_VISIBLE|SS_CENTER,
                20, 20,
                200, 20,
                hWnd, (HMENU)100, hInst, NULL);
            OldWindowProc =(WNDPROC)SetWindowLong(hButton,GWL_WNDPROC, (LONG)ButtonWndProc);
        
 
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            // TODO: Add any drawing code here...
            RECT rt;
            GetClientRect(hWnd, &rt);
            DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
            EndPaint(hWnd, &ps);
            break;
        case WM_DESTROY:
            if(OldWindowProc != 0)
                SetWindowLong(hButton,GWL_WNDPROC, (LONG)OldWindowProc);
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}
 
// Message handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_INITDIALOG:
                return TRUE;
 
        case WM_COMMAND:
            if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
            {
                EndDialog(hDlg, LOWORD(wParam));
                return TRUE;
            }
            break;
    }
    return FALSE;
}
 
// Message handler for button box.
LRESULT APIENTRY ButtonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    RECT rect;
    HBRUSH hBrush;
    HPEN hPen;
    PAINTSTRUCT ps;
    char str[50];
 
    switch (message)
    {
        
        case WM_PAINT:
            HDC hdc;
            GetWindowRect(hWnd, &rect);
//          hdc = GetDCEx(hWnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN);
 
            hdc = BeginPaint(hWnd, &ps);
 
            SetBkColor(hdc,RGB(255,0,0));   
            SetTextColor(hdc, RGB(0,0,0));
            hBrush = CreateSolidBrush(RGB(255,255,0));
            hPen = CreatePen(PS_SOLID,1,RGB(100,100,100));
            SelectObject(hdc,hBrush);
            SelectObject(hdc,hPen);
            GetWindowText(hWnd, str, 50);
 
            Rectangle(hdc, rect.left, rect.top,rect.right, rect.bottom);
            DrawText(hdc,str, -1, &rect, DT_CENTER);
 
//          ReleaseDC(hWnd, hdc);
            EndPaint(hWnd,&ps);
 
            break;
        default:
            return CallWindowProc(OldWindowProc,hWnd, message, wParam, lParam);
    }
    return FALSE;
}
0
0 / 0 / 0
Регистрация: 11.01.2011
Сообщений: 5
13.01.2011, 20:32  [ТС]
а нельза ли попроще реалтзовать? ведь кнопка-это обьект. а у обьекта должно быть свойство?

Добавлено через 5 минут
или хотя бы цвет надписи на кнопке поменять
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
13.01.2011, 20:33
Цитата Сообщение от GARDEMARIN Посмотреть сообщение
а нельза ли попроще реалтзовать? ведь кнопка-это обьект. а у обьекта должно быть свойство?
ошибочное суждение.
"объект" - существует в ООП.
в ядре операционки "объектов" нет, и в любой готовой компилируемой программе - тоже.
и это - самая простая реализация.

хочется работать с объектами - пиши не на WinAPI, а на .Net

Цитата Сообщение от GARDEMARIN Посмотреть сообщение
или хотя бы цвет надписи на кнопке поменять
так уже положен код:
C++
1
2
3
4
                        SetBkColor(hdc,RGB(255,0,0));   //цвет фона
                        SetTextColor(hdc, RGB(0,0,0));   //цвет текста
 
                        DrawText(hdc,str, -1, &rect, DT_CENTER); //вывод текста
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.01.2011, 20:33
Помогаю со студенческими работами здесь

цвет шрифта
всем привет)) меня интересует можно или изменить цвет шрифта в VSC++ и как это сделать?

Цвет линий (MFC)
Программа рисует элипсы белые с оболочкой чёрного цвета. Проблемы: 1) Как зделать, чтобы цвет менялся рандомно? 2) При запуске уже...

Mfc удаляется цвет
рисует цветным, когда сворачиваю, либо жму назад, либо сохраняю потом открываю, ободы становятся чёрными. void...

Цвет элементов управления
Мне нужно в диалоговом окне сделать элементы управления: кнопочки и статический текст, цвета отличного от стандартного черного Я делаю...

Цвет текста в MessageBox
Могу выводить цветной текст в Button, Static. Хотелось бы еще уметь и в MessageBox("Text"); Добавлено через 18 часов 47 минут ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru