Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
Azmoday
0 / 0 / 0
Регистрация: 26.07.2017
Сообщений: 23
#1

Как изменить цвет курсора ввода и курсора мыши в элементе Edit - C++ WinAPI

24.09.2017, 17:58. Просмотров 277. Ответов 7
Метки нет (Все метки)

Всем Здравия.

Проблема в следующем, задал цвет фона и цвет текста в Edit, тут все нормально, но обнаружилось что при некоторых цветах в едите абсолютно не видно курсор ввода, а так же курсор мыши в элементе.
Как их можно изменить, а вернее инвертировать?
(пример приложения приложил)

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
#include <windows.h>
#include <windowsx.h>
#include <tchar.h> 
 
#define IDC_BUTTONTEST 1001
#define IDC_EDIT 2001
 
TCHAR szWindowClass[] = _T("Win32Test");
TCHAR szTitle[] = _T("Win32Test Application");
 
HINSTANCE g_hMainInstance;
 
HWND g_hMainWnd;
HWND g_hButtonTest;
HWND g_hEditBox;
HWND g_hScroll;
HBRUSH g_hbrBackground;
void WndProc_OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    g_hMainInstance = hInstance;
 
    g_hbrBackground = CreateSolidBrush(RGB(0, 0, 255));
 
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = NULL;
    wcex.hCursor = LoadCursor(NULL, IDI_APPLICATION);
    wcex.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = szWindowClass;
    wcex.hIconSm = LoadCursor(NULL, IDI_APPLICATION);
    if (!RegisterClassEx(&wcex))
    {
        MessageBox(NULL, _T("Call to RegisterClassEx failed!"), _T("Win32 Guided Tour"), NULL);
        return 1;
    }
 
    g_hMainWnd = CreateWindowEx(WS_EX_CLIENTEDGE, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, 0, 0, 350, 430, NULL, NULL, g_hMainInstance, NULL);
    if (!g_hMainWnd)
    {
        MessageBox(NULL, _T("Call to CreateWindow failed!"), _T("Win32 Guided Tour"), NULL);
        return 1;
    }
    ShowWindow(g_hMainWnd, SW_SHOW);
 
    g_hButtonTest = CreateWindow(L"button", L"Test", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 7, 38, 100, 20, g_hMainWnd, (HMENU) IDC_BUTTONTEST, g_hMainInstance, 0);
    g_hEditBox = CreateWindow(L"edit", L"Hello world!!! Test )))", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL | WS_VSCROLL, 5, 100, 300, 200, g_hMainWnd, (HMENU)IDC_EDIT, g_hMainInstance, 0);
    
    UpdateWindow(g_hButtonTest);
    UpdateWindow(g_hEditBox);
 
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return (int)msg.wParam;
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        HANDLE_MSG(hWnd, WM_COMMAND, WndProc_OnCommand);
    case WM_CTLCOLOREDIT:
    {
        LOGBRUSH bk_brush_info;
        HBRUSH m_hbrBackgroundEdit = CreateSolidBrush(RGB(128, 128, 128));
        GetObject(m_hbrBackgroundEdit, sizeof(bk_brush_info), &bk_brush_info);
        
        SetTextColor((HDC)wParam, RGB(0, 0, 0));
        SetBkColor((HDC)wParam, bk_brush_info.lbColor);
 
        return (LRESULT) m_hbrBackgroundEdit;
    }
    
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
        break;
    }
 
    return 0;
}
 
void WndProc_OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify)
{
 
    switch (LOWORD(id))
    {
    case IDC_BUTTONTEST:
    {
        SetWindowText(g_hEditBox, L"Hello world!!! Test )))");
        break;
    }
    case IDC_EDIT:
    {
        if (codeNotify == EN_CHANGE)
        {
            //SetWindowText(g_hEditBox, L"EN_CHANGE");
        }
        if (codeNotify == EN_UPDATE)
        {
            //SetWindowText(g_hEditBox, L"EN_UPDATE");
        }
        break;
    }
    default:
        break;
    }
}
0
Вложения
Тип файла: rar Win32Test.rar (144.3 Кб, 1 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2017, 17:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как изменить цвет курсора ввода и курсора мыши в элементе Edit (C++ WinAPI):

Как изменить цвет выделенного слова в элементе Edit? - C++ WinAPI
Добрый день ! Подскажите пожалуйста как изменить цвет выделенного слова в элементе EDIT ? Цвет всего текста изменить не проблема...

Изменить вид курсора мыши на экране, чтобы он указывал в сторону, в которую движется мышка - C++ WinAPI
как изменить вид курсора мыши на экране, чтобы он указывал в сторону вкоторую движется мышка? Примерно как на картинке. Я думал, может...

Как получить LPARAM по координатам курсора мыши? - C++ WinAPI
привет всем. есть вопрос. есть макросы такие как GET_X_LPARAM( LPARAM lParam ) и GET_Y_LPARAM( LPARAM lParam), которые возвращают x и y...

Положение курсора мыши - C++ WinAPI
Как проверить вне рабочей области мышь или нет? Скрин ниже. Например, нажимаем ЛКМ, смещаем, отпускаем ЛКМ и график...

Цвет текстового курсора - C++
Можно ли в ДОС-программе изменить цвет текстового курсора ? Все поиски дали только управление его формой (через прерывание 010H)

Как изменить цвет фона в Edit - C++ WinAPI
Здравствуйте! Подскажите, пожалуйста, как изменить цвет фона у Edit? Заранее благодарен!

7
Azmoday
0 / 0 / 0
Регистрация: 26.07.2017
Сообщений: 23
10.10.2017, 19:39  [ТС] #2
Ни уж то никто не знает (
0
Alex5
1086 / 747 / 116
Регистрация: 12.04.2010
Сообщений: 1,907
10.10.2017, 22:35 #3
Курсор мыши. В окне ресурсов создаем курсор нужной формы. После создания edit изменяем курсор.
C++
1
2
3
4
5
//   IDC_CURSOR1  -  в свойствах курсора задаем его идентификатор 
    HCURSOR c = LoadCursor( hInstance, MAKEINTRESOURCE( IDC_CURSOR1 ) );  
    DWORD d;
    if( c )
        d = SetClassLong( g_hEditBox, GCL_HCURSOR, (long)c   );
Добавлено через 35 минут
Текстовый курсор - см. Creating and Displaying a Caret
1
Azmoday
0 / 0 / 0
Регистрация: 26.07.2017
Сообщений: 23
11.10.2017, 20:02  [ТС] #4
Спасибо, про каретку интересно.
А вот с курсором, есть проблемы, курсор должен быть нарисован зарание и загружен, а это не подходит так как я не знаю какая палитра буде в Edit'е, следовательно не могу инвертировать цвет.
0
Operok
162 / 160 / 44
Регистрация: 15.02.2015
Сообщений: 464
Завершенные тесты: 2
12.10.2017, 10:24 #5
Через CreateCursor
1
Azmoday
0 / 0 / 0
Регистрация: 26.07.2017
Сообщений: 23
12.10.2017, 22:32  [ТС] #6
Спасибо, попробую.
0
Alex5
1086 / 747 / 116
Регистрация: 12.04.2010
Сообщений: 1,907
13.10.2017, 12:01 #7
Цитата Сообщение от Azmoday Посмотреть сообщение
А вот с курсором, есть проблемы
Здесь нет проблем. Курсор (мыши) может быть изменен в любой момент. Если цвет фона в edit изменился, то изменим курсор мыши для edit.

Добавлено через 15 минут
Цитата Сообщение от Azmoday Посмотреть сообщение
case WM_CTLCOLOREDIT: // // // // ERROR // // // //
{
LOGBRUSH bk_brush_info;
HBRUSH m_hbrBackgroundEdit = CreateSolidBrush(RGB(128, 128, 128));
Azmoday, несколько десятков или сотен раз создается кисть (вызывается CreateSolidBrush ). Где она удаляется? Цитирую msdn:
When you no longer need the HBRUSH object call the DeleteObject function to delete it.
1
Azmoday
0 / 0 / 0
Регистрация: 26.07.2017
Сообщений: 23
21.10.2017, 17:24  [ТС] #8
Это тестовое приложение, мне плевать сколько тысяч раз создаются кисти, оно нужно для отработки тех или иных вопросов(про delete я в курсе).
0
21.10.2017, 17:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2017, 17:24
Привет! Вот еще темы с ответами:

Программное изменение курсора мыши - C++ WinAPI
Всем привет, возник такой вопрос: программно изменяю курсор мыши, например: winclass.hCursor = LoadCursor(hinstance,...

Проверка перемещение курсора мыши - C++ WinAPI
Как сделать проверку перемещения курсора мыши то есть сначала получить сами координаты, а потом если координаты изменились то выбить...

Получение координат курсора при захваченной мыши - C++ WinAPI
Здравствуйте. По условию мышь захвачена одним дочерним окном. Задача - при этой захваченной мыши определить координаты курсора...

Координаты курсора мыши относительно клиентской области окна - C++ WinAPI
Здравствуйте! Подскажите пожалуйста как можно узнать координаты курсора мыши клиенской области окна! Знаю и юзал функциию ...


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

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

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