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

📄 haigdi.c

📁 HGui4.1.rar
💻 C
📖 第 1 页 / 共 5 页
字号:
S_BOOL hai_ReleaseDC(SH_DC hDC)
{
	if (!hDC || HAI_GETHDLTYPE(hDC) != HT_DC)
		return S_FALSE;
	return hai_MemFree(hDC);
}

SH_DC hai_SceneDC2ClientDC(SH_DC hDC, S_SHORT x, S_SHORT y, S_SHORT w, S_SHORT h)
{
	_SP_BITMAP pbmp = (_SP_BITMAP)((SP_DC)hDC)->hBitmap;
	
	if (!hDC || HAI_GETHDLTYPE(hDC) != HT_DC)
		return S_NULL;
	if (!pbmp)
		return S_NULL;
	
	if (x < 0) x = 0;
	if (y < 0) y = 0;
	if (x >= pbmp->width) x = pbmp->width - 1;
	if (y >= pbmp->height) y = pbmp->height - 1;
	if (w <= 0 || w > pbmp->width-x) w = pbmp->width - x;
	if (h <= 0 || h > pbmp->height-y) h = pbmp->height - y;

	((SP_DC)hDC)->x = x;
	((SP_DC)hDC)->y = y;
	((SP_DC)hDC)->cx = w;
	((SP_DC)hDC)->cy = h;

	return hDC;
}

SH_GDIOBJ hai_SelectObject(SH_DC hDC, SH_GDIOBJ hobj)
{
	SH_GDIOBJ htmp;

	if (!hobj || !hDC || HAI_GETHDLTYPE(hDC) != HT_DC)
		return S_NULL;

	switch (HAI_GETHDLTYPE(hobj))
	{
	case HT_PEN:
		htmp = (SH_GDIOBJ)(((SP_DC)hDC)->hPen);
		((SP_DC)hDC)->hPen = (SH_PEN)hobj;
		return htmp;

	case HT_BITMAP:
		htmp = (SH_GDIOBJ)(((SP_DC)hDC)->hBitmap);
		((SP_DC)hDC)->hBitmap = (SH_BITMAP)hobj;
		((SP_DC)hDC)->lpImage = ((_SP_BITMAP)hobj)->lpImage;
		((SP_DC)hDC)->OrgX = 0;
		((SP_DC)hDC)->OrgY = 0;
		((SP_DC)hDC)->x = 0;
		((SP_DC)hDC)->y = 0;
		((SP_DC)hDC)->cx = ((_SP_BITMAP)hobj)->width;
		((SP_DC)hDC)->cy = ((_SP_BITMAP)hobj)->height;
		((SP_DC)hDC)->ColorKey = 0;
		((SP_DC)hDC)->TextColor = 0;
		((SP_DC)hDC)->BkColor = ((0xFFFFFFU)<<(sizeof(S_COLOR)-((_SP_BITMAP)hobj)->BitsPixel))>>(sizeof(S_COLOR)-((_SP_BITMAP)hobj)->BitsPixel);
		return htmp;

	case HT_BRUSH:
		htmp = (SH_GDIOBJ)(((SP_DC)hDC)->hBrush);
		((SP_DC)hDC)->hBrush = (SH_BRUSH)hobj;
		return htmp;

	case HT_FONT:
		htmp = (SH_GDIOBJ)(((SP_DC)hDC)->hFont);
		((SP_DC)hDC)->hFont = (SH_FONT)hobj;
		return htmp;

	default:
		return S_NULL;
	}
}

S_WORD hai_GetObject(SH_GDIOBJ hobj, S_WORD cbBuffer, S_VOID *pObject)
{
	if (!hobj)
		return 0;

	switch (HAI_GETHDLTYPE(hobj))
	{
	case HT_PEN:
		if (pObject && cbBuffer >= sizeof(S_PEN))
		{
			_SP_PEN pobj = (_SP_PEN)hobj;
			SP_PEN pPen  = (SP_PEN)pObject;
			pPen->width = pobj->width;
			pPen->color = pobj->color;
			pPen->style = pobj->style;
		}
		return sizeof(S_PEN);

	case HT_BITMAP:
		if (pObject && cbBuffer >= sizeof(S_BITMAP))
		{
			_SP_BITMAP pobj = (_SP_BITMAP)hobj;
			SP_BITMAP pBmp  = (SP_BITMAP)pObject;
			pBmp->width = pobj->width;
			pBmp->height = pobj->height;
			pBmp->BitsPixel = pobj->BitsPixel;
			pBmp->WidthBytes = pobj->WidthBytes;
			pBmp->lpImage = pobj->lpImage;
		}
		return sizeof(S_BITMAP);

	case HT_BRUSH:
		if (pObject && cbBuffer >= sizeof(S_BRUSH))
		{
			_SP_BRUSH pobj = (_SP_BRUSH)hobj;
			SP_BRUSH pBrush  = (SP_BRUSH)pObject;
			pBrush->style = pobj->style;
			pBrush->color = pobj->color;
			pBrush->hatch = pobj->hatch;
		}
		return sizeof(S_BRUSH);

	case HT_FONT:
		if (pObject && cbBuffer >= sizeof(S_FONT))
		{
			_SP_FONT pobj = (_SP_FONT)hobj;
			SP_FONT pFont  = (SP_FONT)pObject;
			pFont->FontID = pobj->FontID;
			pFont->style = pobj->style;
			pFont->width = pobj->width;
			pFont->height = pobj->height;
		}
		return sizeof(S_FONT);

	case HT_ICON:
		if (pObject && cbBuffer >= sizeof(S_FONT))
		{
			_SP_ICON pobj = (_SP_ICON)hobj;
			SP_ICON pIcon  = (SP_ICON)pObject;
			pIcon->width = pobj->width;
			pIcon->height = pobj->height;
			pIcon->BitsPixel = pobj->BitsPixel;
			pIcon->WidthBytes = pobj->WidthBytes;
			pIcon->lpImage = pobj->lpImage;
			pIcon->lpMask = pobj->lpMask;
		}
		return sizeof(S_ICON);
	default:
		return 0;
	}
	return 0;
}

S_BOOL hai_DeleteObject(SH_GDIOBJ hObj)
{
	if (hObj == (SH_GDIOBJ)&_gPen || hObj == (SH_GDIOBJ)&_gBrush 
		|| hObj == (SH_GDIOBJ)&_gFont || hObj == (SH_GDIOBJ)&_gBitmap)
		return S_FALSE;
	return hai_MemFree(hObj);
}

SH_DC  hai_CreateCompatibleDC(SH_DC hDC)
{
	SP_DC pDC;

	if (!hDC || HAI_GETHDLTYPE(hDC) != HT_DC)
		return S_NULL;

	pDC = (SP_DC)hai_MemAlloc(sizeof(S_DC));
	if (!pDC)
		return S_NULL;

	*pDC = *((SP_DC)hDC);
//	pDC->lpImage = S_NULL;
	
	return (SH_DC)pDC;
}

S_BOOL	hai_DeleteDC(SH_DC hDC)
{
	if (!hDC || HAI_GETHDLTYPE(hDC) != HT_DC)
		return S_FALSE;
	return hai_MemFree(hDC);
}

SH_DC  hai_BeginPaint(SP_PAINTSTRUCT pPaint)
{
	SH_DC hDC = hai_GetSceneDC();
	SP_RECT pRect = hai_GetInvalidRect();

	pPaint->hDC = hDC;
	pPaint->rcPaint.x = pRect->x;
	pPaint->rcPaint.y = pRect->y;
	pPaint->rcPaint.w = pRect->w;
	pPaint->rcPaint.h = pRect->h;
	pPaint->CaretShow = _hai_HideCaret();//hai_HideCaret();

	return hDC;
}

S_BOOL  hai_EndPaint(SP_PAINTSTRUCT pPaint)
{
	SP_SCENE pScene = hai_GetCurSceneAddr();
	SP_CTRL pCtrl = hai_GetCurSceneCtrlListEnd();

	hai_ReleaseDC(pPaint->hDC);
	while (pCtrl)
	{
		pCtrl->CtrlProc((SH_CTRL)pCtrl, EVT_PAINT, 0, 0);
		pCtrl = pCtrl->prev;
	}
	if (pCtrl = pScene->pInputMethod)
		pCtrl->CtrlProc((SH_CTRL)pCtrl, EVT_PAINT, 0, 0);
	if (pPaint->CaretShow)
		_hai_ShowCaret();//hai_ShowCaret();
	_hai_UpdateRect();

	return S_TRUE;
}

S_COLOR hai_SetPixel(SH_DC hDC, S_SHORT x, S_SHORT y, S_COLOR color)
{
	S_COLOR c;
	_SP_BITMAP pbmp;
	S_BYTE *pImage;

	if (!hDC || HAI_GETHDLTYPE(hDC) != HT_DC)
		return 0x0;
	pbmp = (_SP_BITMAP)(((SP_DC)hDC)->hBitmap);
	pImage = (S_BYTE *)(((SP_DC)hDC)->lpImage);
	if (!pImage || !pbmp)
		return 0x00;
	if (x < 0 || x >= ((SP_DC)hDC)->cx || y < 0 || y >= ((SP_DC)hDC)->cy)
		return 0x00;

	x += ((SP_DC)hDC)->x;//conver absolute
	y += ((SP_DC)hDC)->y;

	switch (pbmp->BitsPixel)
	{
	case 4:
		color &= 0xF;
		pImage += y * pbmp->WidthBytes+ (x>>1);
		c = (S_COLOR)*pImage;
		*pImage = (S_BYTE)((x&0x1) ? (c&0xF0 | color) : (c&0xF | color<<4));
		c = (S_COLOR)((x&0x1) ? (c&0xF) : (c>>4&0xF));
		break;
	case 8:
		color &= 0xFF;
		pImage += y * pbmp->WidthBytes+ x;
		c = (S_COLOR)*pImage;
		*pImage = (S_BYTE)color;
		break;
	case 16:
		color &= 0xFFFF;
		pImage += y * pbmp->WidthBytes+ (x<<1);
		c = (S_COLOR)*(S_WORD *)pImage;
		*(S_WORD *)pImage = (S_WORD)color;
		break;
	case 24:
		color &= 0xFFFFFF;
		pImage += y * pbmp->WidthBytes+ x*3;
		c = (S_COLOR)(*pImage | (*(pImage+1)<<8) | (*(pImage+2)<<16));
		*(pImage+0) = (S_BYTE)color;
		*(pImage+1) = (S_BYTE)(color>>8);
		*(pImage+1) = (S_BYTE)(color>>16);
		break;
	default:
		c = 0x00;
		break;
	}
	return c;
}

S_COLOR hai_GetPixel(SH_DC hDC, S_SHORT x, S_SHORT y)
{
	S_COLOR c;
	_SP_BITMAP pbmp;
	S_BYTE *pImage;

	if (!hDC || HAI_GETHDLTYPE(hDC) != HT_DC)
		return 0x00;
	pbmp = (_SP_BITMAP)(((SP_DC)hDC)->hBitmap);
	pImage = (S_BYTE *)(((SP_DC)hDC)->lpImage);
	if (!pImage || !pbmp)
		return 0x00;
	if (x < 0 || x >= ((SP_DC)hDC)->cx || y < 0 || y >= ((SP_DC)hDC)->cy)
		return 0x00;

	x += ((SP_DC)hDC)->x;
	y += ((SP_DC)hDC)->y;

	
	switch (pbmp->BitsPixel)
	{
	case 4:
		c = (S_COLOR)*(pImage + y * pbmp->WidthBytes + (x>>1));
		c = (x&0x1) ? (c&0xF) : (c>>4&0xF);
		break;
	case 8:
		c = (S_COLOR)*(pImage + y * pbmp->WidthBytes + x);
		break;
	case 16:
		pImage += y * pbmp->WidthBytes+ (x<<1);
		c = (S_COLOR)*(S_WORD *)pImage;
		break;
	case 24:
		pImage += y * pbmp->WidthBytes+ x*3;
		c = (S_COLOR)(*pImage | (*(pImage+1)<<8) | (*(pImage+2)<<16));
		break;
	default:
		c = 0x00;
		break;
	}
	
	return c;
}

S_BOOL hai_MoveTo(SH_DC hDC,S_SHORT x, S_SHORT y, SP_POINT pPoint)
{
	if (!hDC || HAI_GETHDLTYPE(hDC) != HT_DC)
		return S_FALSE;
	if (x < 0 || x >= ((SP_DC)hDC)->cx || y < 0 || y >= ((SP_DC)hDC)->cy)
		return S_FALSE;

	if (pPoint)
	{
		pPoint->x = ((SP_DC)hDC)->OrgX;
		pPoint->y = ((SP_DC)hDC)->OrgY;
	}
	((SP_DC)hDC)->OrgX = x;
	((SP_DC)hDC)->OrgY = y;

	return S_TRUE;
}

#define HAI_DRAWPIXEL(pImage, x, y, bits, width, color, color4b)   \
{\
	S_BYTE *pTemp;\
	switch (bits)\
	{\
	case 4:\
		pTemp = pImage+y*width+(x>>1);\
		*pTemp = *pTemp&mask[x&0x1] | color4b[x&0x1];\
		break;\
	case 8:\
		*(pImage+y*width+x) = (S_BYTE)color;\
		break;\
	case 16:\
		*((S_WORD*)(pImage+y*width+(x<<1))) = (S_WORD)color;\
		break;\
	case 24:\
		pTemp = pImage+y*width+x*3;\
		*(pTemp+0) = (S_BYTE)color;\
		*(pTemp+1) = (S_BYTE)(color>>8);\
		*(pTemp+2) = (S_BYTE)(color>>16);\
		break;\
	default:\
		break;\
	}\
}

S_BOOL hai_LineTo(SH_DC hDC, S_SHORT EX, S_SHORT EY)
{
	S_BYTE  style;
	S_BYTE  mode;
	S_SHORT W,H,Ha,dY,f;
	S_SHORT SX, SY;
	S_BYTE  fgcolor4bit[2], bkcolor4bit[2], mask[2] = {0xF, 0xF0};
	S_WORD BitsPixel, BmpWidth;
	S_COLOR fgcolor, bkcolor;
	S_BYTE  *pDis;

	if (!hDC || HAI_GETHDLTYPE(hDC) != HT_DC)
		return S_FALSE;
	if (!((SP_DC)hDC)->lpImage || !((SP_DC)hDC)->hBitmap)
		return S_FALSE;

	if (EX < 0) EX = 0;//revise coordinate
	if (EX >= ((SP_DC)hDC)->cx) EX = ((SP_DC)hDC)->cx-1;
	if (EY < 0) EY = 0;
	if (EY >= ((SP_DC)hDC)->cy) EY = ((SP_DC)hDC)->cy-1;

	SX = ((SP_DC)hDC)->OrgX + ((SP_DC)hDC)->x;//client to screen
	SY = ((SP_DC)hDC)->OrgY + ((SP_DC)hDC)->y;
	((SP_DC)hDC)->OrgX = EX;
	((SP_DC)hDC)->OrgY = EY;

	EX = EX + ((SP_DC)hDC)->x;//client to screen
	EY = EY + ((SP_DC)hDC)->y;

	style = ((_SP_PEN)(((SP_DC)hDC)->hPen))->style;
	mode  = ((SP_DC)hDC)->BkMode;
	pDis    = (S_BYTE*)(((SP_DC)hDC)->lpImage);
	BmpWidth = ((_SP_BITMAP)(((SP_DC)hDC)->hBitmap))->WidthBytes;
	BitsPixel = ((_SP_BITMAP)(((SP_DC)hDC)->hBitmap))->BitsPixel;
	fgcolor = ((_SP_PEN)(((SP_DC)hDC)->hPen))->color;
	bkcolor = ((SP_DC)hDC)->BkColor;
	fgcolor4bit[1] = (S_BYTE)fgcolor;
	fgcolor4bit[0] = fgcolor4bit[1]<<4;
	bkcolor4bit[1] = (S_BYTE)bkcolor;
	bkcolor4bit[0] = bkcolor4bit[1]<<4;

	if (SX>EX)
	{
		f=EX, EX=SX, SX=f;
		f=EY, EY=SY, SY=f;
	}

	W = (EX-SX); H = (EY-SY);
	Ha= H<0 ? -H : H;
	dY= H<0 ? -1 : 1;

	if (Ha>W)
	{
		/* Y-majored */
		f = Ha>>1;
		while (1)
		{
			switch (style)
			{
				case PS_NONE:
					break;
				case PS_DOT://broken line
					if (SY % 2)
						HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, fgcolor, fgcolor4bit)
					else if (mode == BKM_OPAQUE)
						HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, bkcolor, bkcolor4bit)
					break;
				case PS_DASH://两点实,一点虚
					if (SY % 3)
						HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, fgcolor, fgcolor4bit)
					else if (mode == BKM_OPAQUE)
						HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, bkcolor, bkcolor4bit)
					break;
				case PS_DASHDOT:
					switch (SY % 5)
					{
					case 0:
					case 1:
					case 3:
						HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, fgcolor, fgcolor4bit)
						break;
					default:
						if (mode == BKM_OPAQUE)
							HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, bkcolor, bkcolor4bit)
						break;
					}
					break;
				case PS_DASHDOTDOT:
					switch (SY % 7)
					{
					case 0:
					case 1:
					case 3:
					case 5:
						HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, fgcolor, fgcolor4bit)
						break;
					default:
						if (mode == BKM_OPAQUE)
							HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, bkcolor, bkcolor4bit)
						break;
					}
					break;
				case PS_DASHDASHDOT:
					switch (SY % 9)
					{
					case 0:
					case 1:
					case 2:
					case 3:
					case 6:
						HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, fgcolor, fgcolor4bit)
						break;
					default:
						if (mode == BKM_OPAQUE)
							HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, bkcolor, bkcolor4bit)
						break;
					}
					break;
				default:
					HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, fgcolor, fgcolor4bit)
					break;
			}
			if (SY==EY) break;
			if ((f+=W)>=Ha)
				f-=Ha,SX++;
			SY+=dY;
		}
	}
	else
	{
		/* X-majored */
		f = W>>1;
		while (1)
		{
			switch (style)
			{
				case PS_NONE:
					break;
				case PS_DOT:
					if (SX % 2)
						HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, fgcolor, fgcolor4bit)
					else if (mode == BKM_OPAQUE)
						HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, bkcolor, bkcolor4bit)
					break;
				case PS_DASH:
					if (SX % 3)
						HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, fgcolor, fgcolor4bit)
					else if (mode == BKM_OPAQUE)
						HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, bkcolor, bkcolor4bit)
					break;
				case PS_DASHDOT:
					switch (SX % 5)
					{
					case 0:
					case 1:
					case 3:
						HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, fgcolor, fgcolor4bit)
						break;
					default:
						if (mode == BKM_OPAQUE)
							HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, bkcolor, bkcolor4bit)
						break;
					}
					break;
				case PS_DASHDOTDOT:
					switch (SX % 7)
					{
					case 0:
					case 1:
					case 3:
					case 5:
						HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, fgcolor, fgcolor4bit)
						break;
					default:

⌨️ 快捷键说明

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