Философия каретки 14.01.2025
Всем привет!
Сегодня поговорим про каретку или курсор. На английском курсор в Windows называется caret, с английского переводится как каретка см. https://translate.google.de/?sl=en&tl=ru&text=caret&op=tra.... Будем играться в Dev-C++.
Моя ФЛ Он и ОнаЧтобы появилась каретка в окне нужно 3 функции вызвать - CreateCaret - создаёт каретку, там устанавливается ширина и высота каретки. SetCaretPos - устанавливает позицию каретки на x, y. ShowCaret - отображает каретку в определённом окне.
Например вот небольшой код:
CreateCaret(hwnd, NULL, 2, 15); /* Создаём узкую но длинную каретку */ SetCaretPos(10, 10); /* Устанавливаем каретку в окне на позиция x = 10, y = 10*/ ShowCaret(hwnd); /* Отображаем каретку в окне */
Моя ФЛ Он и ОнаЯ буду программировать в Dev-C++. Показывать не буду как я создавал проект итд. А вот код main.c:
#include <windows.h>
LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
char szClassName[] = "WinCaretApp";
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil) {
HWND hwnd;
MSG messages;
WNDCLASSEX wincl;
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof(WNDCLASSEX);
wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
if(!RegisterClassEx(&wincl)) return 0;
hwnd = CreateWindowEx(0,
szClassName,
"",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
150,
60,
HWND_DESKTOP,
NULL,
hThisInstance,
NULL
);
ShowWindow(hwnd, nFunsterStil);
while(GetMessage(&messages, NULL, 0, 0)) {
TranslateMessage(&messages);
DispatchMessage(&messages);
}
return messages.wParam;
}
LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch(message) {
case WM_CREATE:
CreateCaret(hwnd, NULL, 2, 15); /* Создаём узкую но длинную каретку */
SetCaretPos(10, 10); /* Устанавливаем каретку в окне на позиция x = 10, y = 10*/
ShowCaret(hwnd); /* Отображаем каретку в окне */
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}Вуаля! А вот и результат, курсор видно и мигает:

Моя ФЛ Он и ОнаЕсли же написать так:
CreateCaret(hwnd, NULL, 15, 2);
То будет что-то типа такого, т.е. горизонтальная карет:

Моя ФЛ Он и Онагоризонтальная карет
*горизонтальная каретка
Моя ФЛ Он и ОнаЕсли нужно сменить скорость мигания каретки, то нужно написать так:
SetCaretBlinkTime(3);
Моя ФЛ Он и Она