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

📄 haicaret.c

📁 HGui4.1.rar
💻 C
字号:
//---------------------------------------------------------------------------------
// Copyright (c) Haisoft 2006-9-1
// Copyright jinhailiao 2008-2010
// E-mail:   jinhailiao@163.com
// Project:			HGui
// File:			haicaret.c
// Description:		
//-------------------------------------------------------------
// Reversion Histroy:
//-------------------------------------------------------------
// Version		date		operations				by who
// 2.0.0		2006-09-06  create                  Kingsea
// 3.0.0		2008-03-01	update					Kingsea
//---------------------------------------------------------------------------------
#include "haitype.h"
#include "haihandle.h"
#include "haimem.h"
#include "_haigdi.h"
#include "haigdi.h"
#include "haicaret.h"
#include "_haiscene.h"

#define  CARET_COLOR		COLOR_BLACK
#define  CARET_WIDTH		6
#define  CARET_HEIGHT		1

typedef struct _tagCaret
{
	S_BYTE  fShow;
	S_BYTE  fBlink;
	S_BYTE  BlinkTime;
	S_BYTE  Reserved;
	S_SHORT x;
	S_SHORT y;
	S_SHORT SaveScrnX;
	S_SHORT SaveScrnY;
	S_WORD  width;
	S_WORD  height;
}
_S_CARET, *_SP_CARET;


HGui_SIZE_ASSERT(S_CARET, sizeof(S_CARET)>=sizeof(_S_CARET));


static _S_CARET caret;


S_VOID hai_InitCaret(S_VOID)
{
	memset(&caret, 0x00, sizeof(_S_CARET));
	caret.fBlink = 1;
	caret.height = CARET_HEIGHT;
	caret.width = CARET_WIDTH;
	caret.BlinkTime = 2;
}

static S_VOID _hai_InversetPixel(S_BYTE *pPixels, S_WORD num)
{
	while (num--)
	{
		*pPixels = ~(*pPixels);
		pPixels++;
	}
}

S_VOID  _hai_BlinkCaret(S_VOID)
{
	S_WORD i, ScrnX, ScrnY;
	S_BYTE *pDis;
	SH_DC hScrnDC;
	_SP_BITMAP pBmp;

	if ( caret.fShow )
	{
		hScrnDC = hai_GetSceneDC();
		pDis  = (S_BYTE *)(((SP_DC)hScrnDC)->lpImage);
		pBmp  = (_SP_BITMAP)(((SP_DC)hScrnDC)->hBitmap);
		if ( caret.fBlink )
		{
			caret.SaveScrnX = caret.x;
			caret.SaveScrnY = caret.y;
			ScrnX = caret.x + ((SP_DC)hScrnDC)->x;
			ScrnY = caret.y + ((SP_DC)hScrnDC)->y;

			pDis += (ScrnY+1-caret.height)*pBmp->WidthBytes + ScrnX*pBmp->BitsPixel/8;
			for (i = 0; i < caret.height; i++)
			{
				_hai_InversetPixel(pDis, (S_WORD)(caret.width*pBmp->BitsPixel/8));
				pDis += pBmp->WidthBytes;
			}
			caret.fBlink = 0;
			_hai_ObjectUpdateRect(caret.x, (S_WORD)(caret.y+1-caret.height), caret.width, caret.height);
		}
		else
		{
			ScrnX = caret.SaveScrnX + ((SP_DC)hScrnDC)->x;
			ScrnY = caret.SaveScrnY + ((SP_DC)hScrnDC)->y;
			
			pDis += (ScrnY+1-caret.height)*pBmp->WidthBytes + ScrnX*pBmp->BitsPixel/8;
			for (i = 0; i < caret.height; i++)
			{
				_hai_InversetPixel(pDis, (S_WORD)(caret.width*pBmp->BitsPixel/8));
				pDis += pBmp->WidthBytes;
			}
			caret.fBlink = 1;
			_hai_ObjectUpdateRect(caret.SaveScrnX, (S_WORD)(caret.SaveScrnY+1-caret.height), caret.width, caret.height);
		}
		hai_ReleaseDC(hScrnDC);
	}
}

S_BOOL  _hai_ShowCaret(S_VOID)
{
	if ( caret.fShow )
	{
		_hai_BlinkCaret();
	}
	
	return S_TRUE;
}

S_BOOL  _hai_HideCaret(S_VOID)
{
	S_BOOL fBlink = caret.fBlink;
	
	if ( caret.fShow )
	{
		if ( !caret.fBlink )
			_hai_BlinkCaret();
		return !fBlink;
	}
	
	return S_FALSE;
}


S_BOOL  hai_ShowCaret(S_VOID)
{
	S_BOOL fShow = caret.fShow;

	if ( !caret.fShow )
	{
		caret.fShow = 1;
		_hai_BlinkCaret();
	}

	return fShow;
}

S_BOOL  hai_HideCaret(S_VOID)
{
	S_BOOL fShow = caret.fShow;
	
	if ( caret.fShow )
	{
		if ( !caret.fBlink )
			_hai_BlinkCaret();
		caret.fShow = 0;
	}

	return fShow;
}

S_VOID  hai_GetCaretPos(S_SHORT *x, S_SHORT *y)
{
	*x = caret.x;
	*y = caret.y;
}

S_VOID  hai_SetCaretPos(S_SHORT x, S_SHORT y)
{
	S_WORD CaretH, CaretW, ClientH, ClientW;
	SH_DC hScrnDC;

	if (y < 0 || x < 0)
		return;

	hScrnDC = hai_GetSceneDC();
	ClientH = ((SP_DC)hScrnDC)->cy;
	ClientW = ((SP_DC)hScrnDC)->cx;
	CaretH   = caret.height;
	CaretW  = caret.width;
	hai_ReleaseDC(hScrnDC);
	if (y+1 < CaretH || y >= ClientH || x+CaretW >= ClientW)
		return;

	caret.x = x;
	caret.y = y;

	if ( !caret.fShow )
		return;

	if ( !caret.fBlink )
		_hai_BlinkCaret();
	_hai_BlinkCaret();
}

S_VOID  hai_SetCaretWidthHeight(S_WORD w, S_WORD h)
{
	S_WORD BmpH, BmpW;
	SH_DC hScrnDC;
	_SP_BITMAP pBmp;

	if (w == 0 || h == 0)
		return;

	hScrnDC = hai_GetSceneDC();
	pBmp    = (_SP_BITMAP)(((SP_DC)hScrnDC)->hBitmap);
	BmpW   = pBmp->width;
	BmpH    = pBmp->height;
	hai_ReleaseDC(hScrnDC);
	if (h >= (S_WORD)caret.y || caret.x+w >= BmpW)
		return;

	caret.width= w;
	caret.height= h;

	if ( !caret.fShow )
		return;

	if ( !caret.fBlink )
		_hai_BlinkCaret();
	_hai_BlinkCaret();
}

S_VOID  hai_SetCaretBlinkTime(S_BYTE  TenthSecond)
{
	if (TenthSecond)
		caret.BlinkTime = TenthSecond;
}

S_BYTE  hai_GetCaretBlinkTime(S_VOID)
{
	return caret.BlinkTime;
}

S_WORD HG_SaveCurCaret(S_VOID *Buffer, S_WORD BufSize)
{
	if (BufSize >= sizeof(_S_CARET))
		memcpy(Buffer,  &caret, sizeof(_S_CARET));

	return sizeof(_S_CARET);
}

S_VOID HG_RestoreCurCaret(S_VOID *Buffer)
{
	memcpy(&caret, Buffer, sizeof(_S_CARET));
}

⌨️ 快捷键说明

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