minigui[基础篇][13]—— 插入符

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设置插入符闪烁时间

//得到插入符的闪烁时间 闪烁时间是指显示、反向显示、再恢复所消耗的时间
//该时间以毫秒计数。系统缺省的插入符反转时间为 500 毫秒
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://得到输入焦点 getfocus函数可得到这个消息
            SetCaretPos(hWnd, pos*GetSysCharWidth(), 0);//在获得输入焦点时设置插入符位置
            ShowCaret(hWnd); //显示插入符
            break;
        case MSG_KILLFOCUS://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);
}
/* main windoww proc */
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);
}
/* 以下创建主窗口的代码从略 */

在这里插入图片描述

5.插入符API

函数说明
CreateCaret创建插入符
DestroyCaret销毁插入符
ShowCaret显示插入符
HideCaret隐藏插入符
GetCaretBlinkTime得到插入符的闪烁时间
SetCaretBlinkTime设置插入符的闪烁时间
GetCaretPos得到插入符位置
SetCaretPos设置插入符位置
消息说明消息产生
MSG_SETFOCUS插入符可以显示窗口得到输入焦点
MSG_KILLFOCUS插入符可以隐藏窗口失去输入焦点

6.键盘与插入符 鼠标与光标

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值