📄 gdi.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=▭
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 + -