1.什么是插入符
1.插入符也是一张图片
2.窗口客户区之内一个闪烁的符号,通常用于指示键盘输入的位置
3.常见的插入符外形为下划线、垂直线和方块
4.在某一个时刻只能有一个窗口拥有键盘输入焦点,通常接收键盘输入的窗口在接收到输入焦点时显示插入符,在失去输入焦
点时隐藏插入符。
5.有输入焦点的窗口不一定有插入符 有插入符的窗口也不一定有输入焦点 只是键盘消息的接收者都是含有输入焦点的,这样的窗口一般是活动窗口
2.插入符的创建和销毁
BOOL GUIAPI CreateCaret (HWND hWnd, PBITMAP pBitmap, int nWidth, int nHeight);
@hwnd: 拥有插入符的窗口
@pBitmap: 插入符位图 pBitmap!=NULL 则根据该位图句柄来创建插入符
pBitmap==NULL 则用插入点处宽度和高度分别为nWidth和nHeight的矩形反显像素点的颜色形成插入符
@nwidth: 插入符的宽
@nHeight:插入符的高
BOOL GUIAPI DestroyCaret (HWND hWnd);
@hWnd:拥有插入符的窗口
3.插入符的操作
3.1显示插入符
BOOL GUIAPI ShowCaret (HWND hWnd);
@hWnd:含有插入符的窗口
BOOL GUIAPI HideCaret (HWND hWnd);
@hWnd:含有插入符的窗口
如果应用程序在处理 MSG_PAINT 以外的消息时必须重新绘制屏幕,同时又要保留插入符,那么可以在绘制前使用 HideCaret 函数先隐藏插入符,在绘制结束后再使用 ShowCaret 函数重新显示插入符
因为 BeginPaint 和 EndPaint 函数会自动地完成这些操作
3.2设置插入符闪烁时间
UINT GUIAPI GetCaretBlinkTime (HWND hWnd)
@hWnd:含有插入符的窗口
@UINT:得到的返回时间
BOOL GUIAPI SetCaretBlinkTime (HWND hWnd, UINT uTime);
@hWnd:含有插入符的窗口
@uTime:设置的时间 不能小于100ms
3.3设置插入符位置
BOOL GUIAPI GetCaretPos (HWND hWnd, PPOINT pPt);
@hWnd:含有插入符的窗口
@pPt:插入符位置
BOOL GUIAPI SetCaretPos (HWND hWnd, int x, int y);
@hWnd:含有插入符的窗口
@x:客户区x
@y:客户区y
4.插入符的一个demo
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>
#define IDC_MYEDIT 100
static int MyeditWindowProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
static char *pBuffer = NULL;
static int pos = 0, len = 0;
HDC hdc;
switch (message) {
case MSG_CREATE:
SetWindowFont(hWnd, GetSystemFont(SYSLOGFONT_WCHAR_DEF));
if (!CreateCaret (hWnd, NULL, 1, GetSysCharHeight())) {
return -1;
}
pBuffer = (char *) malloc(10);
*pBuffer = 0;
break;
case MSG_SETFOCUS:
SetCaretPos(hWnd, pos*GetSysCharWidth(), 0);
ShowCaret(hWnd);
break;
case MSG_KILLFOCUS:
HideCaret(hWnd);
break;
case MSG_CHAR:
switch (wParam) {
case '\t':
case '\b':
case '\n':
{
SetCaretBlinkTime(hWnd, GetCaretBlinkTime(hWnd)-100);
}
break;
default:
{
char ch, buf[10];
char *tmp;
ch = wParam;
if (len == 10)
break;
tmp = pBuffer+pos;
if (*tmp != 0) {
strcpy(buf, tmp);
strcpy (tmp+1, buf);
}
*tmp = ch;
pos++;
len++;
break;
}
break;
}
break;
case MSG_KEYDOWN:
switch (wParam) {
case SCANCODE_CURSORBLOCKLEFT:
pos = MAX(pos-1, 0);
break;
case SCANCODE_CURSORBLOCKRIGHT:
pos = MIN(pos+1, len);
break;
case SCANCODE_BACKSPACE:
{
char buf[10];
char *tmp;
if (len == 0 || pos == 0)
break;
tmp = pBuffer+pos;
strcpy(buf, tmp);
strcpy(tmp-1, buf);
pos--;
len--;
}
break;
}
SetCaretPos(hWnd, pos*GetSysCharWidth(), 0);
InvalidateRect(hWnd, NULL, TRUE);
break;
case MSG_PAINT:
hdc = BeginPaint(hWnd);
TextOut(hdc, 0, 0, pBuffer);
EndPaint(hWnd, hdc);
return 0;
case MSG_DESTROY:
DestroyCaret (hWnd);
if (pBuffer)
free(pBuffer);
return 0;
}
return DefaultControlProc(hWnd, message, wParam, lParam);
}
BOOL RegisterMyedit(void)
{
WNDCLASS WndClass;
WndClass.spClassName = "myedit";
WndClass.dwStyle = 0;
WndClass.dwExStyle = 0;
WndClass.hCursor = GetSystemCursor(IDC_IBEAM);
WndClass.iBkColor = PIXEL_lightwhite;
WndClass.WinProc = MyeditWindowProc;
return RegisterWindowClass (&WndClass);
}
static int CaretdemoWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
HWND hMyedit;
switch (message) {
case MSG_CREATE:
RegisterMyedit();
hMyedit = CreateWindow("myedit", "", WS_VISIBLE | WS_CHILD, IDC_MYEDIT,
30, 50, 100, 20, hWnd, 0);
SetFocus(hMyedit);
break;
case MSG_CLOSE:
DestroyAllControls (hWnd);
DestroyMainWindow (hWnd);
PostQuitMessage (hWnd);
return 0;
}
return DefaultMainWinProc(hWnd, message, wParam, lParam);
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/d0d615343a114886a768954673d508be.png)
5.插入符API
函数 | 说明 |
---|
CreateCaret | 创建插入符 |
DestroyCaret | 销毁插入符 |
ShowCaret | 显示插入符 |
HideCaret | 隐藏插入符 |
GetCaretBlinkTime | 得到插入符的闪烁时间 |
SetCaretBlinkTime | 设置插入符的闪烁时间 |
GetCaretPos | 得到插入符位置 |
SetCaretPos | 设置插入符位置 |
消息 | 说明 | 消息产生 |
---|
MSG_SETFOCUS | 插入符可以显示 | 窗口得到输入焦点 |
MSG_KILLFOCUS | 插入符可以隐藏 | 窗口失去输入焦点 |
6.键盘与插入符 鼠标与光标
![在这里插入图片描述](https://img-blog.csdnimg.cn/c5fa9d7cc33b444ab3006f42ba33f876.png)