3 / 3 / 1
Регистрация: 20.03.2019
Сообщений: 150
1

Настройка контрола

27.07.2019, 17:56. Показов 2394. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как можно сделать кнопку чтобы был виден только текст от нее. И вокруг текста был невидимый бокс при нажатии на него кнопку работала. Дайте идею пж
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.07.2019, 17:56
Ответы с готовыми решениями:

Перерисовка контрола static
В общем ситуация же как и у этого человека...

Полная перерисовка контрола
Есть такая беда для перерисовки вызываю InvalidateRect(hbut1,NULL,FALSE);...

Изменение стиля контрола
Немогу поменять стиль контрола EDIT lStyle = GetWindowLong(hEd1, GWL_STYLE); ...

Отрисовка фона своего контрола
В общем такое дело, создаю свой статик контрол, вынудило на это 2 причины, мне нужен прозрачный...

7
15 / 13 / 3
Регистрация: 14.05.2019
Сообщений: 64
27.07.2019, 20:02 2
Лучший ответ Сообщение было отмечено Zumhad как решение

Решение

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
#include <windows.h>
 
#define IDC_BUTTON1 1   // Кнопка
#define WIDTH       150 // ширина,
#define HEIGHT      50  // высота
 
void DrawButton(DRAWITEMSTRUCT* dis, HWND hWnd)
{
    HDC hDC = dis->hDC;
    RECT rect = dis->rcItem;
 
    SetTextColor(hDC, GetSysColor(COLOR_WINDOWTEXT) );
    SetBkMode(hDC, TRANSPARENT);
 
    TCHAR Buffer[32];
    GetWindowText(dis->hwndItem, Buffer, 32);
    DrawText(hDC, Buffer, lstrlen(Buffer), &rect,
        DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
 
//
// WndProc
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_CREATE:
        {
            HWND hwndBt = CreateWindowEx(NULL, TEXT("Button"), TEXT("Start"),
                WS_VISIBLE | WS_CHILD | BS_OWNERDRAW, 10, 10, WIDTH, HEIGHT,
                hWnd, (HMENU)IDC_BUTTON1, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
            if(!hwndBt)
            {
                MessageBox(hWnd,TEXT("Cannot create button"),TEXT("Err"),
                    MB_OK|MB_ICONSTOP|MB_SETFOREGROUND|MB_TOPMOST);
                return -1;
            }
        }
        return 0;
    
        case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        case IDC_BUTTON1:
            MessageBox(hWnd, TEXT("Hello, World!"), TEXT("Button Start"),MB_OK);
            break;
        }
        break;
 
        case WM_DRAWITEM:
        {
            DRAWITEMSTRUCT* dis = (DRAWITEMSTRUCT*)lParam;
            switch(dis->CtlID)
            {
            case IDC_BUTTON1:
                DrawButton(dis, GetDlgItem(hWnd, IDC_BUTTON1));
                break;
            }
        }
        break;
 
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
 
        default:
            return DefWindowProc(hWnd,uMsg,wParam,lParam);
    }
    return 0;
}
 
//
// Entry point
//
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HWND hWnd=HWND_DESKTOP;
    WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_VREDRAW|CS_HREDRAW,
        WndProc,0,0,hInstance,LoadIcon(NULL,IDI_APPLICATION),
        LoadCursor(NULL,IDC_ARROW),(HBRUSH)(COLOR_WINDOW),
        NULL,TEXT("AppClass"),NULL,};
    ATOM Atom=RegisterClassEx(&wc);
    if(Atom) {
        DWORD dwStyle=(WS_SYSMENU|WS_CAPTION|WS_MINIMIZEBOX);
        HWND hWnd=CreateWindowEx(WS_EX_WINDOWEDGE,MAKEINTATOM(Atom),TEXT("AppName"),
            dwStyle,CW_USEDEFAULT,0,CW_USEDEFAULT,0,HWND_DESKTOP,NULL,hInstance,NULL);
        if(hWnd) {
            ShowWindow(hWnd,nCmdShow);
            UpdateWindow(hWnd);
            MSG msg;
            while(GetMessage(&msg,NULL,0,0)>0) {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        } else
            MessageBox(hWnd,TEXT("Cannot create window"),TEXT("Error"),MB_OK|MB_ICONSTOP);
    } else
        MessageBox(hWnd,TEXT("Cannot register class"),TEXT("Error"),MB_OK|MB_ICONSTOP);
    return EXIT_SUCCESS;
}
1
3 / 3 / 1
Регистрация: 20.03.2019
Сообщений: 150
27.07.2019, 22:55  [ТС] 3
Щас проверю

Добавлено через 2 минуты
Да работает. Большое спасибо. А можно сделать так что при наведении на этот бокс меняется цвет текста?
0
15 / 13 / 3
Регистрация: 14.05.2019
Сообщений: 64
28.07.2019, 00:27 4
https://www.cyberforum.ru/post7416293.html

https://www.cyberforum.ru/post13493430.html
0
3 / 3 / 1
Регистрация: 20.03.2019
Сообщений: 150
28.07.2019, 13:04  [ТС] 5
Нифига ты хакер. От тебя одного узнал больше чем от всех других. Я хотел еще именно при наведении менять цвет кнопки но не получилось( Я делал так в WM_MOUSEMOVE но кнопка на WindowFromPoint не срабатывает. Что делать не подскажешь. Буду благодарен
C++
1
2
3
4
5
6
7
8
9
10
11
   POINT P;
   HWND Handle;
 
   GetCursorPos(&P);
 
   Handle=WindowFromPoint(P);
 
   if(Handle == "хэндл кнопки")
   {
    ....
   }
Добавлено через 11 минут
И да еще на счет первого кода. Если поменять цвет фона окна то кнопка уже не будет прозрачной.

Добавлено через 24 минуты
Я сделал кнопку прозрачной
C++
1
2
3
4
5
6
7
8
    case WM_CTLCOLORBTN:
    {
        HBRUSH hBrushbtn;
        hBrushbtn = (HBRUSH)GetStockObject(NULL_BRUSH);
        SetBkMode((HDC)wParam, TRANSPARENT);
        return ((LRESULT)hBrushbtn);
        break;
    }
Но хотелось бы как-то определять навел ли я курсор на кнопку.
0
15 / 13 / 3
Регистрация: 14.05.2019
Сообщений: 64
28.07.2019, 16:14 6
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
#include <windows.h>
 
#define IDC_BUTTON1 1   // Кнопка
#define WIDTH       250 // ширина,
#define HEIGHT      50  // высота
 
#define TIMER_BT_CAPTURE        703
#define TIMER_BT_CAPTURE_DELAY  100
UINT_PTR g_nTimerBtCapture;
BOOL g_bCapture;
 
LRESULT OnTimer(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    if(TIMER_BT_CAPTURE == wParam)
    {
        POINT p;
        DWORD dwValue = GetMessagePos();
        p.x = LOWORD(dwValue);
        p.y = HIWORD(dwValue);
        ScreenToClient(hWnd, &p);
 
        RECT Rect;
        GetClientRect(hWnd, &Rect);
 
        if( !PtInRect(&Rect, p) )
        {
            g_bCapture = FALSE;
            KillTimer(hWnd, g_nTimerBtCapture);
            g_nTimerBtCapture = NULL;
            SetWindowText(hWnd, TEXT("Lost Mouse Capture"));
            InvalidateRect(hWnd, &Rect, TRUE);
        }
        else
        {
            SetWindowText(hWnd, TEXT("Got Mouse Capture"));
            InvalidateRect(hWnd, &Rect, TRUE);
        }
    }
    return 0;
}
 
//
// CatchButtonProc
//
LRESULT CALLBACK CatchButtonProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    WNDPROC Wndproc=(WNDPROC)(LONG_PTR)GetWindowLong(hWnd, GWL_USERDATA);
    if(Wndproc)
    {
        switch(uMsg)
        {
        case WM_MOUSEMOVE:
        {
            if( !g_bCapture )
            {
                g_bCapture = TRUE;
 
                RECT Rect;
                GetClientRect(hWnd, &Rect);
                InvalidateRect(hWnd, &Rect, TRUE);
 
                g_nTimerBtCapture = SetTimer(hWnd,
                    TIMER_BT_CAPTURE, TIMER_BT_CAPTURE_DELAY, NULL);
            }
        }
        break;
 
        case WM_TIMER:
            OnTimer(hWnd, uMsg, wParam, lParam);
            break;
 
        case WM_NCDESTROY:
            if(g_nTimerBtCapture)
            {
                KillTimer(hWnd, g_nTimerBtCapture);
                g_nTimerBtCapture = NULL;
            }
            SetWindowLongPtr(hWnd, GWLP_WNDPROC,
                (__int3264)(LONG_PTR)Wndproc);
            SetWindowLongPtr(hWnd, GWLP_USERDATA, 0);
            break;
 
        } return CallWindowProc(Wndproc, hWnd, uMsg, wParam, lParam);
    } return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
 
void DrawButton(DRAWITEMSTRUCT* dis, HWND hWnd)
{
    HDC hDC = dis->hDC;
    RECT Rect = dis->rcItem;
 
    SetTextColor(hDC, GetSysColor(COLOR_WINDOWTEXT) );
    SetBkMode(hDC, TRANSPARENT);
 
    TCHAR Buffer[MAX_PATH];
    GetWindowText(dis->hwndItem, Buffer, MAX_PATH);
    DrawText(hDC, Buffer, lstrlen(Buffer), &Rect,
        DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
 
//
// WndProc
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_CREATE:
        {
            HWND hwndBt = CreateWindowEx(NULL, TEXT("Button"), TEXT("Start"),
                WS_VISIBLE | WS_CHILD | BS_OWNERDRAW /*BS_NOTIFY*/, 10, 10, WIDTH, HEIGHT,
                hWnd, (HMENU)IDC_BUTTON1, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
            if(!hwndBt)
            {
                MessageBox(hWnd,TEXT("Cannot create button"),TEXT("Error"),
                    MB_OK|MB_ICONSTOP|MB_SETFOREGROUND|MB_TOPMOST);
                return -1;
            }
 
            // Установить подпрограмму для управления Кнопкой.
 
            DWORD dwStyle=GetWindowLongPtr(hwndBt, GWLP_WNDPROC);
            SetWindowLongPtr(hwndBt, GWLP_USERDATA, dwStyle);
            SetWindowLongPtr(hwndBt, GWL_WNDPROC, (__int3264)(LONG_PTR)CatchButtonProc);
        }
        return 0;
    
        case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        case IDC_BUTTON1:
            MessageBox(hWnd, TEXT("Hello, World!"), TEXT("Button Start"),MB_OK);
            break;
        }
        break;
 
        case WM_DRAWITEM:
        {
            DRAWITEMSTRUCT* dis = (DRAWITEMSTRUCT*)lParam;
            switch(dis->CtlID)
            {
            case IDC_BUTTON1:
                DrawButton(dis, GetDlgItem(hWnd, IDC_BUTTON1));
                break;
            }
        }
        break;
 
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
 
        default:
            return DefWindowProc(hWnd,uMsg,wParam,lParam);
    }
    return 0;
}
 
//
// Entry point
//
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HWND hWnd=HWND_DESKTOP;
    WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_VREDRAW|CS_HREDRAW,
        WndProc,0,0,hInstance,LoadIcon(NULL,IDI_APPLICATION),
        LoadCursor(NULL,IDC_ARROW),(HBRUSH)(COLOR_WINDOW),
        NULL,TEXT("AppClass"),NULL,};
    ATOM Atom=RegisterClassEx(&wc);
    if(Atom) {
        DWORD dwStyle=(WS_SYSMENU|WS_CAPTION|WS_MINIMIZEBOX);
        HWND hWnd=CreateWindowEx(WS_EX_WINDOWEDGE,MAKEINTATOM(Atom),TEXT("AppName"),
            dwStyle,CW_USEDEFAULT,0,CW_USEDEFAULT,0,HWND_DESKTOP,NULL,hInstance,NULL);
        if(hWnd) {
            ShowWindow(hWnd,nCmdShow);
            UpdateWindow(hWnd);
            MSG msg;
            while(GetMessage(&msg,NULL,0,0)>0) {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        } else
            MessageBox(hWnd,TEXT("Cannot create window"),TEXT("Error"),MB_OK|MB_ICONSTOP);
    } else
        MessageBox(hWnd,TEXT("Cannot register class"),TEXT("Error"),MB_OK|MB_ICONSTOP);
    return EXIT_SUCCESS;
}
И ещё вариант Запрограммировать по порядку, чтобы было видно как работает каждый оператор
1
3 / 3 / 1
Регистрация: 20.03.2019
Сообщений: 150
28.07.2019, 21:17  [ТС] 7
Проверю и опишусь.

Добавлено через 12 минут
Я переписал и было 2 ошибки на 47 и 124 строчке надо было не gwl а gwlp. Но когда запускаю прекращается работа программы. В чем проблема?

Добавлено через 3 часа 42 минуты
С вылетом вроде разобрался. Но меняется текст только тогда когда курсор выходит из главного окна. А где нужно заменить хэндлы чтобы менялся текст при выходе из кнопки?

Добавлено через 53 минуты
Все разобрался с кнопкой. Но есть баг если медленно или очень быстро входить в окно то сообщение может не сработать. С чем это связанно?
0
15 / 13 / 3
Регистрация: 14.05.2019
Сообщений: 64
28.07.2019, 23:02 8
Попробуй в пакете проект двух конфигураций 32/64
У меня W7 Pro x64, работает неплохо, но защита Win (т.к. UAC, Firewall) отключена.
Возможно при включенной такое как у вас...

https://www.cyberforum.ru/atta... 1564344126
Вложения
Тип файла: zip Button_Capture.zip (13.4 Кб, 12 просмотров)
0
28.07.2019, 23:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.07.2019, 23:02
Помогаю со студенческими работами здесь

Управление событиями одного контрола через события другого контрола
Уважаемые форумчане помогите решить проблему. Есть два компонента на форме: checkBox и...

Поиск динамического контрола на динамической форме, созданной из динамического контрола с последующим
Поиск динамического контрола2 на динамической форме, созданной из динамического контрола1 с...

Изображение из Контрола
Господа, сдвиньте меня, плиз, с мертвой тчк. Есть визуальное дерево: ListBox -&gt; ViewBox -&gt;...

Перемещение контрола
Как перемещать контрол (TPaintBox) по форме при помощи мышки, чтобы перемещение было плавным, и...


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

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

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