⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 caret.c

📁 TN-kernel内核针对LPC系列ARM7处理器和S3C44B0X重新定制好的源代码包。内含Nano-X GUI。
💻 C
字号:
/*
 * Copyright (c) 2000 Greg Haerr <greg@censoft.com>
 *
 * Caret control for Microwindows win32 api.
 *
 * TODO: add SetSysTimer for blinking
 */

#include "../../include/mwtn.h"
#include "../../include/windows.h"

#define DEF_BLINK_TIME                500        /* default blink time in ms*/

typedef struct
{
        HWND        hwnd;                /* != NULL if caret is created*/
        int        x;
        int        y;
        int        nWidth;
        int        nHeight;
        BOOL        fShown;                /* caret is currently visible*/
        int        nShowCount;        /* <= 0 for hidden caret*/
        UINT        nBlinkTime;
}CARETINFO;

/* local data*/
static CARETINFO sysCaret;        /* the system caret*/

/* local procs*/
static void MwShowCaret(void);
static void MwHideCaret(void);
static void MwUpdateCaret(void);

BOOL WINAPI CreateCaret(HWND hwnd, HBITMAP hBitmap, int nWidth, int nHeight)
{

        DestroyCaret();                        /* destroy old caret if any*/

        if (nWidth <= 0)
                nWidth = 1;
        if (nHeight <= 0)
                nHeight = 1;

        sysCaret.hwnd = hwnd;
        sysCaret.x = 0;
        sysCaret.y = 0;
        sysCaret.nWidth = nWidth;
        sysCaret.nHeight = nHeight;
        sysCaret.fShown = FALSE;
        sysCaret.nShowCount = 0;
        sysCaret.nBlinkTime = DEF_BLINK_TIME;
        return TRUE;
}

BOOL WINAPI DestroyCaret(VOID)
{
        if (sysCaret.fShown)
                MwHideCaret();
        sysCaret.hwnd = NULL;
        sysCaret.fShown = FALSE;
        return TRUE;
}

BOOL WINAPI HideCaret(HWND hwnd)
{
        if (hwnd == NULL)
                hwnd = sysCaret.hwnd;
        if (hwnd == NULL || hwnd != sysCaret.hwnd)
                return FALSE;

        /* hide caret if this call made it invisible*/
        if (--sysCaret.nShowCount == 0) {
                MwHideCaret();
                return TRUE;
        }
        return FALSE;
}

BOOL WINAPI ShowCaret(HWND hwnd)
{
        if (hwnd == NULL)
                hwnd = sysCaret.hwnd;
        if (hwnd == NULL || hwnd != sysCaret.hwnd || sysCaret.nShowCount < 0)
                return FALSE;

        if (++sysCaret.nShowCount > 1)
                return TRUE;

        /* show caret, this call made it visible*/
        MwShowCaret();
        return TRUE;
}

BOOL WINAPI SetCaretPos(int nX, int nY)
{
        if (sysCaret.fShown && (sysCaret.x != nX || sysCaret.y != nY)) {
                MwUpdateCaret();        /* toggle off*/
                sysCaret.x = nX;
                sysCaret.y = nY;
                MwUpdateCaret();        /* toggle on in new location*/
                return TRUE;
        }
        sysCaret.x = nX;
        sysCaret.y = nY;
        return TRUE;
}

BOOL WINAPI GetCaretPos(LPPOINT lpPoint)
{
        lpPoint->x = sysCaret.x;
        lpPoint->y = sysCaret.y;
        return TRUE;
}

UINT WINAPI GetCaretBlinkTime(VOID)
{
        return sysCaret.nBlinkTime;
}

BOOL WINAPI SetCaretBlinkTime(UINT uMSeconds)
{
        sysCaret.nBlinkTime = uMSeconds;
        /* SetSysTimer */
        return TRUE;
}

static void MwShowCaret(void)
{
        if (sysCaret.fShown)
                return;
        MwUpdateCaret();
        sysCaret.fShown = TRUE;
}

static void MwHideCaret(void)
{
        if (!sysCaret.fShown)
                return;
        MwUpdateCaret();
        sysCaret.fShown = FALSE;
}

/* Draw the caret using XOR.  Same routine is used to show and hide caret.*/
static void MwUpdateCaret(void)
{
        int        oldmode;
        HDC        hdc;
        HPEN        hpen;
        HBRUSH        hbr;

        oldmode = GdSetMode(MWMODE_XOR);
        hdc = GetDC(sysCaret.hwnd);
        hpen = SelectObject(hdc, GetStockObject(WHITE_PEN));

        /* it seems there's some problems with Rectangle with nWidth == 1*/
        if (sysCaret.nWidth == 1)
        {
                MoveToEx(hdc, sysCaret.x, sysCaret.y, NULL);
                LineTo(hdc, sysCaret.x, sysCaret.y+sysCaret.nHeight);
        }
        else
        {
                hbr = SelectObject(hdc, GetStockObject(WHITE_BRUSH));
                Rectangle(hdc, sysCaret.x, sysCaret.y,
                        sysCaret.x+sysCaret.nWidth,
                        sysCaret.y+sysCaret.nHeight);
                SelectObject(hdc, hbr);
        }
        SelectObject(hdc, hpen);
        ReleaseDC(sysCaret.hwnd, hdc);
        GdSetMode(oldmode);
}

//----------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -