Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915

Каким методом создано окно гугл хром (для примера)

23.09.2020, 13:09. Показов 2761. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,

Подскажите пожалуйста, как устроено или каким методом создано окно к примеру гугл хром ?

Меня даже не метод создания интересует, а вот это:

Я думал, что каким бы методом не создается окно, но, если это окно создается в Windows, то оно должно работать неким стандартным образом: ну к примеру если водить курсором мышки в пределах окна, то для этого окна всегда должно генерироваться сообщение: WM_SETCURSOR, WM_MOVE и координаты где нибудь в wparam/lparam.

Но к примеру в окне гугл хром, spy++ вообще почти никаких сообщений не видит, кроме буквально - WM_CAPTURECHANGED и еще не скольких.
И как устроено поле ввода текста тоже не понятно, это тоже не окно "edit", но поле ввода есть и работает.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.09.2020, 13:09
Ответы с готовыми решениями:

А можно узнать с каким значением второго параметра функции CreateWindow создано окно?
Есть дескриптор. Можно по нему вытянуть эту инфу?

Прошу помоши! Появилось окно в браузере Гугл Хром
В Гугл Хроме появилось окно под названием "Find people" типо какой то поиск людей. Проверил компьютер антивирусами: Аваст, Касперский ИС,...

Закрыть окно, из которого создано новое окно
Как мне закрыть окно из которого я создал новое окно? Window1 window = new Window1(); window.Owner = this; window.Show(); ...

8
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
23.09.2020, 13:45
Там окно с дочерними окнами. И всё им приходит как и следует, как и всех окнам.

Добавлено через 2 минуты
А вот все визуальные элементы вроде бы всегда "свои-нарисованные"...
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
23.09.2020, 13:48  [ТС]
Цитата Сообщение от GoodWeather Посмотреть сообщение
Там окно с дочерними окнами. И всё им приходит как и следует, как и всех окнам.

Добавлено через 2 минуты
А вот все визуальные элементы вроде бы всегда "свои-нарисованные"...
Но дочернего окна с классом "edit" там нет. То есть минимум не понятно, как устроено поле ввода.
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
23.09.2020, 13:53
Я же сказал, нарисованные они. Картинка это.

Добавлено через 2 минуты
В событии WM_PAINT на окне просто рисуется фон/рамка/текст. Вот и "edit".
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
23.09.2020, 13:55  [ТС]
Но, ведь одно дело рисунок - другое, само как бы поле должно, как то работать - ну там курсор установить, ввод текста осуществить. В рисунок же ввод текста не осуществишь ?
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
23.09.2020, 14:04
Лучший ответ Сообщение было отмечено Optimus11 как решение

Решение

На самом деле даже стандартный "edit" просто окошко с картинкой. Магического в нём ничего нету. Получает сообщения мыши и клавиатуры, анализирует, запоминает что-то, выводит.
Просто оно оформлено как отдельное окно с каким-то управлением извне через сообщения к HWND. И к нему кажется даже вроде из стороннего процесса можно тыкнуться.

Добавлено через 1 минуту
Знаем какого размера шрифт, знаем куда ткнули мышкой, вычисляем в какие символы попали - делаем выводы.

Добавлено через 3 минуты
Мигающая палочка между символов - каретка - просто доп-анимация.
Изначально её вроде даже выводили как XOR, так что не надо было перерисовывать всё - сверху дорисовывали одно и то же по таймеру.
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
23.09.2020, 15:53  [ТС]
Цитата Сообщение от GoodWeather Посмотреть сообщение
Добавлено через 1 минуту
Знаем какого размера шрифт, знаем куда ткнули мышкой, вычисляем в какие символы попали - делаем выводы.

Добавлено через 3 минуты
Мигающая палочка между символов - каретка - просто доп-анимация.
Изначально её вроде даже выводили как XOR, так что не надо было перерисовывать всё - сверху дорисовывали одно и то же по таймеру.
А позвольте еще вопрос: а как делается тогда, этакая "интерактивность" введенного текста, то есть в я этот текст могу выделить мышкой, скопировать в буфер.
Но, если я к примеру создам окно и прост ос помощью SetWindowText - выведу какой нибудь текст, я не смогу не выделить его не скопировать.

Неужели, эффект выделения текста - это тоже:
C++
1
Знаем какого размера шрифт, знаем куда ткнули мышкой, вычисляем в какие символы попали...
Делаем анимацию выделения ?
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
23.09.2020, 17:05
Под капотом - да, разумеется. Выделение - по идее WM_MOUSEMOVE с зажатой кнопкой мыши. Просто перерисовывается когда это нужно.

Добавлено через 1 минуту
Окно активно и оно видит что нажали Ctrl+C или Ctrl+V - вызывает всякие GetClipboardData()/SetClipboardData().

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

Добавлено через 3 минуты
Под Делфи есть компоненты TButton и TSpeedButton - глазами не отличишь, реагируют на всё абсолютно одинаково. А вот если покопаться...
Оказывается что первое - это дочернее окно-аналог стандартного "BUTTON" (типа потомок), а второе - просто картинка на основном окне (без дочерних окон).
1
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,119
23.09.2020, 18:57
Лучший ответ Сообщение было отмечено Optimus11 как решение

Решение

Цитата Сообщение от Optimus11 Посмотреть сообщение
Неужели, эффект выделения текста - это тоже:
Пример реализации выделения:
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
#include <Windows.h>
#include <windowsx.h>
#include <tchar.h>
 
//-------------------------------------------------------------------------------------------------
HINSTANCE hInst;
HFONT hFont;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
//-------------------------------------------------------------------------------------------------
int x0 = 40;
int y0 = 40;
const TCHAR* text = 0;
int length = 0;
int selected = -1;
int charOfs[1000] = { 0 };
RECT boundRect = { 0 };
 
//-------------------------------------------------------------------------------------------------
void OnPaint(HWND hWnd);
void OnMouseMove(HWND hWnd, LPARAM lParam);
//-------------------------------------------------------------------------------------------------
void InitString(HWND hWnd, const TCHAR* string);
void DrawString(HWND hWnd, HDC dc = 0);
int GetCharFromPoint(int x, int y);
 
//-------------------------------------------------------------------------------------------------
int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);
 
    hInst = hInstance;
 
    WNDCLASS wc;
    memset(&wc, 0, sizeof(wc));
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(0, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.lpszClassName = TEXT("MyClass");
    if (!RegisterClass(&wc))
        return FALSE;
 
    hFont = CreateFont(50, 0, 0, 0, 0, 0/*1*/, 0, 0, 0, 0, 0, 0, 0, TEXT("Times New Roman"));
 
    HWND hWnd = CreateWindow(wc.lpszClassName, TEXT("MyTitle"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 0, hInstance, 0);
    if (!hWnd)
        return FALSE;
 
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
 
    MSG msg;
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return (int)msg.wParam;
}
 
//-------------------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_CREATE:
            InitString(hWnd, TEXT("Нужно поводить мышью по этому тексту."));
            return 1;
 
        case WM_PAINT:
            OnPaint(hWnd);
            break;
 
        case WM_MOUSEMOVE:
            OnMouseMove(hWnd, lParam);
            break;
 
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
 
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
 
    return 0;
}
 
//-------------------------------------------------------------------------------------------------
void OnPaint(HWND hWnd)
{
    PAINTSTRUCT ps;
    HDC dc = BeginPaint(hWnd, &ps);
    DrawString(hWnd, dc);
    EndPaint(hWnd, &ps);
}
 
//-------------------------------------------------------------------------------------------------
void OnMouseMove(HWND hWnd, LPARAM lParam)
{
    int x = GET_X_LPARAM(lParam);
    int y = GET_Y_LPARAM(lParam);
 
    int sel = GetCharFromPoint(x, y);
    if (selected != sel)
    {
        selected = sel;
        DrawString(hWnd);
    }
}
 
//-------------------------------------------------------------------------------------------------
void InitString(HWND hWnd, const TCHAR* string)
{
    text = string;
    length = _tcslen(string);
 
    HDC dc = GetDC(hWnd);
    HFONT oldFont = (HFONT)SelectObject(dc, hFont);
 
    SIZE sz;
    BOOL bres = GetTextExtentExPoint(dc, text, length, 10000, 0, charOfs + 1, &sz);
    
    boundRect.left = x0;
    boundRect.top = y0;
    boundRect.right = x0 + sz.cx;
    boundRect.bottom = y0 + sz.cy;
 
    SelectObject(dc, oldFont);
    ReleaseDC(hWnd, dc);
 
    RECT newRect = boundRect;
    AdjustWindowRect(&newRect, GetWindowLong(hWnd, GWL_STYLE), FALSE);
    int cx = newRect.right - newRect.left + 2 * x0;
    int cy = newRect.bottom - newRect.top + 2 * y0;
 
    SetWindowPos(hWnd, 0, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOZORDER);
}
 
//-------------------------------------------------------------------------------------------------
void DrawString(HWND hWnd, HDC dc)
{
    bool bNoDc = (dc == 0) ? true : false;
 
    if (bNoDc)
        dc = GetDC(hWnd);
    HFONT oldFont = (HFONT)SelectObject(dc, hFont);
    COLORREF oldText = GetTextColor(dc);
    COLORREF oldBk = GetBkColor(dc);
 
    if (selected >= 0)
    {
        SetBkColor(dc, GetSysColor(COLOR_WINDOW));
        SetTextColor(dc, GetSysColor(COLOR_WINDOWTEXT));
        TextOut(dc, x0, y0, text, selected);
 
        SetBkColor(dc, GetSysColor(COLOR_HIGHLIGHT));
        SetTextColor(dc, GetSysColor(COLOR_HIGHLIGHTTEXT));
        TextOut(dc, x0 + charOfs[selected], y0, text + selected, 1);
 
        if (selected + 1 < length)
        {
            SetBkColor(dc, GetSysColor(COLOR_WINDOW));
            SetTextColor(dc, GetSysColor(COLOR_WINDOWTEXT));
            TextOut(dc, x0 + charOfs[selected + 1], y0, text + selected + 1, length - selected - 1);
        }
    }
    else
    {
        SetBkColor(dc, GetSysColor(COLOR_WINDOW));
        SetTextColor(dc, GetSysColor(COLOR_WINDOWTEXT));
        TextOut(dc, x0, y0, text, length);
    }
 
    SetBkColor(dc, oldBk);
    SetTextColor(dc, oldText);
    SelectObject(dc, oldFont);
    if (bNoDc)
        ReleaseDC(hWnd, dc);
}
 
//-------------------------------------------------------------------------------------------------
int GetCharFromPoint(int x, int y)
{
    if ((x >= boundRect.left) && (x < boundRect.right))
    {
        if ((y >= boundRect.top) && (y < boundRect.bottom))
        {
            for (int i = 1; i < length; i++)
            {
                if (x < x0 + charOfs[i])
                    return i - 1;
            }
 
            return length - 1;
        }
    }
 
    return -1;
}
 
//-------------------------------------------------------------------------------------------------
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.09.2020, 18:57
Помогаю со студенческими работами здесь

Расширение для Гугл Хром
Поискав в сети я чутка разобрался как создать приложение и расширение для хрома. Однако целью моих поисков являются &quot;Визуальные...

Плагин wmp для Google Chrome
Через гугл хром не получается слушать радио прямо с сайта. Хром предлагает скачать и установить плагин, но скачивается файл с расширением...

В гугл хром не подключаются стили для мобильной версии
Здравствуйте. Есть сайт http://www.fleurdevie.ru/dostavka/ Сейчас немного адаптируем его для мобильников. Всё записывается в файл...

В Гугл Хром для воспроизведения некоторых видеоблоков и игр просит обновить флэшплеер
Лог в приложении

Можно ли свернуть или скрыть окно чужой программы, если оно создано не средствами WinAPI?
То есть есть программа, окно которой, мне кажется, создано не средствами WinAPI: команды SW_MINIMIZE и SW_HIDE, как и другие, на него не...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Установка 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/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru