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

📄 gdi.c

📁 Seekfor WinOS的GUI图形界面程序
💻 C
字号:
#ifndef __GDI_C__
#define __GDI_C__
#include "def.h"
#include "GDI.h"
#include "win32.h"
#include "cfg.h"

#ifndef  __C51__
#include <stdio.h>
#endif


typedef struct
{
	COLORREF nWidth;
	COLORREF nHeight;
	COLORREF ccBkColor;
	COLORREF *buffer;
}_HICON_,*_HICON;


typedef DT_XDATA struct _HWND
{
	DT_CHAR style;/*窗口类型,WS_XX|WS_XX*/
	DT_CHAR exstyle;/*窗口扩展类型,BS_XX*/
	DT_CHAR status;/*窗口状态,BS_CHECKED,BS_UNCHECKED or other*/
	DT_INT nCmdID;/*窗口的命令ID*/
	RECT rtRect;/*窗口的区域*/
	RECT rtClient;/*窗口的客户区域*/
	DT_CHAR szCaption[MAX_CAPTION+1];/*窗口标题文本*/

	DT_CHAR index;/*内部使用的索引*/
	DT_CHAR group;/*窗口所在的组(RADIOBOX应用)*/
	HANDLE hIcon;/*窗口的图标*/
	WNDPROC lpfnWndProc;/*窗口的回调喊函数*/
	HANDLE child[MAX_WINDOWS+3];/*该窗口下属的子窗口*/
	HANDLE parent;/*该窗口的父窗口*/
	HANDLE hFocus;/*该窗口下的焦点窗口*/
	DT_INT lpdata;/*私有数据*/
}_HWND_,*_HWND;


static DT_XDATA COLORREF ccTextColor=15;
static DT_XDATA COLORREF ccBkColor=0;
static DT_XDATA DT_CHAR ccBkMode=0;
static DT_XDATA DT_CHAR xScale=2,yScale=1;
static DT_XDATA RECT* rtRect=NULL;
static DT_XDATA RECT* rtClient=NULL;

static DT_XDATA lpfnPIXEL putpoint;
static DT_XDATA lpfnPIXEL getpoint;

static DT_XDATA DT_INT nWidth=0,nHeight=0;
#ifdef __C51__
	static DT_CODE DT_CHAR ASC16[]={0,0,0,0};
	static DT_CODE DT_CHAR HZK16[]={0,0,0,0};
#else
	FILE *pasc=NULL,*phzk=NULL;
#endif


static unsigned char *GetTextFont(unsigned char ch)
{
#ifdef __C51__
	unsigned char *ret=(unsigned char*)((UINT)ASC16+ch*16l);
	return ret;
#else
	static unsigned char ASC16[32];
	unsigned long offset;
	if(!pasc) pasc=fopen("font\\asc16","rb");
	if(!pasc) return NULL;
	offset=ch*16l;
	fseek(pasc,offset,SEEK_SET);
	fread(ASC16,32,1,pasc);
	return ASC16;
#endif
}

static unsigned char *GetHZFont(unsigned char *hz)
{
#ifdef __C51__
	unsigned char *offset=(unsigned char*)HZK16;
	offset+=((hz[0]-0xa1)*94l+(hz[1]-0xa1))*32l;
	return offset;
#else
	static unsigned char HZK16[32];
	unsigned long offset;
	if(!phzk)
		phzk=fopen("font\\hzk16","rb");
	if(!phzk) return NULL;
	offset=((hz[0]-0xa1)*94l+(hz[1]-0xa1))*32l;
	fseek(phzk,offset,SEEK_SET);
	fread(HZK16,32,1,phzk);
	return HZK16;
#endif
}


void GDI_Init(DT_INT x,DT_INT y,lpfnPIXEL lpput,lpfnPIXEL lpget)
{
	nWidth=x;
	nHeight=y;
	putpoint=lpput;
	getpoint=lpget;
	rtRect=NULL;
	rtClient=NULL;
}

void GDI_Quit()
{
	nWidth=0;
	nHeight=0;
	rtRect=NULL;
	rtClient=NULL;
#ifndef __C51__
	if(pasc) fclose(pasc);
	if(phzk) fclose(phzk);
	pasc=NULL;
	phzk=NULL;
#endif
}

#if SetPixel_EN==1
void SetPixel(DT_INT x,DT_INT y,COLORREF color)
{
	PIXEL pixel;
	RECT Rect;
	pixel.color=color;
	if(rtRect) Rect=*rtRect;
	else
	{
		 Rect.left=0;
		 Rect.top=0;
		 Rect.right=nWidth;
		 Rect.bottom=nHeight;
	}
	if(rtClient)
	{
		Rect=*rtClient;
		x+=rtClient->left;
		y+=rtClient->top;
	}
	if(x>=Rect.right||y>=Rect.bottom) return ;
	if(x<Rect.left||y<Rect.top) return ;
	pixel.x=x;
	pixel.y=y;

	if(putpoint)
		putpoint(&pixel);
}
#endif

#if GetPixel_EN==1
COLORREF GetPixel(DT_INT x,DT_INT y)
{
	PIXEL pixel;
	RECT Rect;
	pixel.x=x;
	pixel.y=y;
	pixel.color=0;
	if(rtRect)
		Rect=*rtRect;
	else
	{
		Rect.left=0;
		Rect.top=0;
		Rect.right=nWidth;
		Rect.bottom=nHeight;
	}
	if(rtClient)
	{

		x+=rtClient->left;
		y+=rtClient->top;
		Rect=*rtClient;
	}
	if(x>=Rect.right||y>=Rect.bottom) return 0;
	if(x<Rect.left||y<Rect.top) return 0;
	if(getpoint)
		getpoint(&pixel);
	return pixel.color;

}
#endif

#if SetTextColor_EN==1
void SetTextColor(COLORREF color)
{
	ccTextColor=color;
}
#endif

#if SetBkColor_EN==1
void SetBkColor(COLORREF color)
{
	ccBkColor=color;
}
#endif

#if SetBkMode_EN==1
void SetBkMode(DT_CHAR mode)
{
	ccBkMode=mode;
}
#endif

#if Rectangle_EN==1
void Rectangle(DT_INT x1,DT_INT y1,DT_INT x2,DT_INT y2,COLORREF color)
{
	Line(x1,y1,x2,y1,color);
	Line(x2,y1,x2,y2,color);
	Line(x1,y2,x2,y2,color);
	Line(x1,y1,x1,y2,color);
}
#endif

#if Line_EN==1
void Line(DT_INT x,DT_INT y,DT_INT m,DT_INT n,COLORREF ccColor)
{
	DT_INT x1=x,y1=y,x2=m,y2=n;
	DT_INT dx,dy,e;

	dx=x2-x1;
	dy=y2-y1;

	if(dx>=0)
	{
		if(dy >= 0)
		{
			if(dx>=dy)
			{
				e=dy-dx/2;
				while(x1<=x2)
				{
					SetPixel(x1,y1,ccColor);
					if(e>0){y1+=1;e-=dx;}
					x1+=1;
					e+=dy;
				}
			}
			else
			{
				e=dx-dy/2;
				while(y1<=y2)
				{
					SetPixel(x1,y1,ccColor);
					if(e>0){x1+=1;e-=dy;}
					y1+=1;
					e+=dx;
				}
			}
		}
		else
		{
			dy=-dy;

			if(dx>=dy)
			{
				e=dy-dx/2;
				while(x1<=x2)
				{
					SetPixel(x1,y1,ccColor);
					if(e>0){y1-=1;e-=dx;}
					x1+=1;
					e+=dy;
				}
			}
			else
			{
				e=dx-dy/2;
				while(y1>=y2)
				{
					SetPixel(x1,y1,ccColor);
					if(e>0){x1+=1;e-=dy;}
					y1-=1;
					e+=dx;
				}
			}
		}
	}
	else
	{
		dx=-dx;
		if(dy >= 0)
		{
			if(dx>=dy)
			{
				e=dy-dx/2;
				while(x1>=x2)
				{
					SetPixel(x1,y1,ccColor);
					if(e>0){y1+=1;e-=dx;}
					x1-=1;
					e+=dy;
				}
			}
			else
			{
				e=dx-dy/2;
				while(y1<=y2)
				{
					SetPixel(x1,y1,ccColor);
					if(e>0){x1-=1;e-=dy;}
					y1+=1;
					e+=dx;
				}
			}
		}
		else
		{
			dy=-dy;

			if(dx>=dy)
			{
				e=dy-dx/2;
				while(x1>=x2)
				{
					SetPixel(x1,y1,ccColor);
					if(e>0){y1-=1;e-=dx;}
					x1-=1;
					e+=dy;
				}
			}
			else
			{
				e=dx-dy/2;
				while(y1>=y2)
				{
					SetPixel(x1,y1,ccColor);
					if(e>0){x1-=1;e-=dy;}
					y1-=1;
					e+=dx;
				}
			}
		}
	}


}
#endif

#if Polygon_EN==1
void Polygon(POINT *pt,DT_CHAR nCount,COLORREF ccColor)
{
	DT_CHAR i;
	for(i=0;i<nCount-1;i++)
	{
		Line(pt[i].x,pt[i].y,pt[i+1].x,pt[i+1].y,ccColor);
	}
	Line(pt[0].x,pt[0].y,pt[nCount-1].x,pt[nCount-1].y,ccColor);
}
#endif

#if FillRect_EN==1
void FillRect(RECT *lpRect,COLORREF color)
{
	DT_INT i;
	if(!lpRect) return;
	for(i=lpRect->top;i<=lpRect->bottom;i++)
	{
		Line(lpRect->left,i,lpRect->right,i,color);
	}

}
#endif

#if SetTextStyle_EN==1
void SetTextStyle(DT_CHAR nXScale,DT_CHAR nYScale,DT_CHAR nMode)
{
	xScale=nXScale>1?nXScale:2;
	yScale=nYScale?nYScale:1;
	ccBkMode=nMode?1:0;
}
#endif

#if TextOut_EN==1
void TextOut(DT_INT x,DT_INT y,LPCTSTR lpszText,DT_INT ccCount)
{
	RECT Rect;
	DT_CODE DT_CHAR MASK[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
	DT_CHAR *Font;
	DT_INT i,j;
	DT_INT k,m,n;
	DT_INT nx,ny;
	DT_CHAR item;
	DT_CHAR *MAT;
	if(!lpszText) return ;
	if(rtRect) Rect=*rtRect;
	else
	{
		 Rect.left=0;
		 Rect.top=0;
		 Rect.right=nWidth;
		 Rect.bottom=nHeight;
	}
	if(rtClient)
	{
		Rect.left=0;
		Rect.top=0;
		Rect.right=rtClient->right-rtClient->left;
		Rect.bottom=rtClient->bottom-rtClient->top;
	}

	while(*lpszText&&ccCount--)
	{
		if(*lpszText=='\r')
		{
			x=Rect.left;
		}
		else if(*lpszText=='\n') y+=16*yScale;
		else if(*lpszText=='\t'||*lpszText==' ')
		{
			if(xScale==2) x+= 16;
			else x+=32;
		}
		else if(*lpszText>0xa0&&*(lpszText+1)>0xa0)
		{
			MAT=GetHZFont(lpszText);
			nx=x;
			ny=y;
			for(i=0;i<16;i++)
			{
				for(n=0;n<yScale;n++)
				{
					nx=x;
					for(j=0;j<2;j++)
					{
						item=MAT[i*2+j];
						for(k=0;k<8;k++)
						{
							for(m=0;m<xScale/2;m++)
							{
								if(item&MASK[7-k]) SetPixel(nx,ny,ccTextColor);
								else if(ccBkMode==0) SetPixel(nx,ny,ccBkColor);
								nx++;
							}
						}

					}
					ny++;
				}
			}
			lpszText+=2;
			x=nx;
			if(nx>=Rect.right)
			{
				x=Rect.left;
				y+=16*yScale;
			}
			continue;
			}
		else
		{
			if(x>=Rect.right)
			{
				x=Rect.left;
				if(rtClient) x=0;
				y+=16*yScale;
			}
			Font=GetTextFont(*(lpszText));
			for(i=0;i<16;i++)
			{
				for(m=0;m<yScale;m++)
				{
					for(j=0;j<8;j++)
					{
						for(k=0;k<xScale;k++)
						{
							if(Font[i]&MASK[7-j]) SetPixel(x+j*xScale+k,y+i*yScale+m,ccTextColor);
							else if(ccBkMode==0) SetPixel(x+j*xScale+k,y+i*yScale+m,ccBkColor);
						}
					}
				}
			}
			x+=8*xScale;
		}
		lpszText++;
	}
	rtRect=NULL;
}
#endif

#if DrawText_EN==1
void DrawText(LPCTSTR lpszText,DT_INT nCount,RECT* lpRect)
{
	if(!lpRect||!lpszText) return;
	rtRect=lpRect;
	TextOut(lpRect->left,lpRect->top,lpszText,nCount);
}
#endif

#if BeginPaint_EN==1
HDC BeginPaint(HWND item,PAINTSTRUCT*ps)
{
	_HWND hWnd=item;
	static RECT rect={0,0,0,0};
	if(!hWnd) hWnd=GetDesktopWindow();
	if(rtClient)
		*ps=*rtClient;
	if(IsWindowVisible(hWnd))
		rtClient=&hWnd->rtClient;
	else
		rtRect=rtClient=&rect;
	return ps;
}
#endif

#if EndPaint_EN==1
BOOL EndPaint(HWND hWnd,PAINTSTRUCT*ps)
{
	rtClient=NULL;
	rtRect=NULL;
	hWnd=hWnd;
	ps=ps;
	return 1;
}
#endif

#if LoadIcon_EN==1
HICON LoadIcon(DT_CHAR hInst,HANDLE item)
{
	_HICON hIcon=(HICON)item;
	hIcon->buffer=(COLORREF*)item+3*sizeof(COLORREF);
	hInst=hInst;
	return hIcon;
}
#endif

#if DrawIcon_EN==1
BOOL DrawIcon(HDC hDC,DT_INT x,DT_INT y,HICON icon)
{
	DT_INT i,j;
	DT_INT k;
	_HICON hicon=icon;
	for(i=0;i<hicon->nWidth;i++)
		for(j=0;j<hicon->nHeight;j++)
		{
			k=j*hicon->nHeight+i;
			if(hicon->buffer[k]!=hicon->ccBkColor)
				SetPixel(x+i,y+j,hicon->buffer[k]);
		}
	hDC=hDC;
	return 1;
}
#endif




#endif

⌨️ 快捷键说明

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