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

📄 gui.c

📁 一个操作系统的源码部分
💻 C
📖 第 1 页 / 共 3 页
字号:
void HdcSetBkColor(HDC hdc,unsigned long color)
{
	hdc->bkColor=color;
}

//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
void HdcSetBrushColor(HDC hdc,unsigned long color)
{
	hdc->brushColor=color;
}

//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
void HdcSetPenColor(HDC hdc,unsigned long color)
{
	hdc->penColor=color;
}

//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
void HdcSetTextColor(HDC hdc,unsigned long color)
{
	hdc->textColor=color;
}

//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
void HdcFillRect(HDC hdc,int x,int y,int w,int h)
{
	int i;
	HdcSetPenColor(hdc,hdc->brushColor);
	for(i=y;i<y+h;i++)
	HdcDrawVline(hdc,x,x+w,i);
}


//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
void HdcOutAsc(HDC hdc,unsigned short x, unsigned short y, unsigned char ch)
{
  int i,j;
	unsigned long penColor=hdc->penColor;
	hdc->penColor=hdc->textColor;
  for (i = 0; i < CHAR_HEIGHT; i++)
	for (j=0;j<ASC_WIDTH;j++)
	if((ASC[ch][i]>>(ASC_WIDTH-j-1))&1)
	HdcSetPixel(hdc,x+j,y+i);
	hdc->penColor=penColor;
}

//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
unsigned char GetRGBr(RGB aRGB)
{
	aRGB = aRGB & 0xFF0000;
	aRGB = aRGB >> 16;
  return (unsigned char)aRGB;
}

//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
unsigned char GetRGBg(RGB aRGB)
{
	aRGB = aRGB & 0x00FF00;
	aRGB = aRGB >> 8;
  return (unsigned char)aRGB;
}

//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
unsigned char GetRGBb(RGB aRGB)
{
	aRGB = aRGB & 0x0000FF;
  return (unsigned char)aRGB;
}


//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
void HdcRefreshVramRect(HDC hdc,RECT* aRect)
{
	register unsigned int j,i;
	register unsigned long StartPos1,StartPos2;
	int  x1=hdc->Bounds.left+aRect->left;
	int  y1=hdc->Bounds.top+aRect->top;
	int  x2=aRect->left;
	int  y2=aRect->top;
	int  hdcW=hdc->Bounds.right-hdc->Bounds.left;
	int  hdcH=hdc->Bounds.bottom-hdc->Bounds.top;
	int  w=aRect->right-aRect->left;
	int  h=aRect->bottom-aRect->top;


	StartPos1=y1*VESA_X_MAX+x1;
	StartPos2=y2*hdcW+x2;

	LockProc(TRUE);

	for(j=0;j<h;j++)
	{
	   for(i=0;i<w;i++)
			 if((x1+i>=0) && (x1+i)<VESA_X_MAX && (y1+j)>=0 && (y1+j)<VESA_Y_MAX)
			 if((x2+i>=0) && (x2+i)<hdcW && (y2+j)>=0 && (y2+j)<hdcH)
			 {
	           VGAMEM[StartPos1+i]=hdc->mBuf[StartPos2+i];
			 }

		 StartPos1+=VESA_X_MAX;
		 StartPos2+=hdcW;
	}

	LockProc(FALSE);

}



//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
void DrawFadeColor(HDC hdc,int x,int y,int w,int h,RGB FromColor)
{
	 int i;
	 int scale;
	 unsigned char FR;
	 unsigned char FG;
	 unsigned char FB;

	 FR = GetRGBr(FromColor);
   FG = GetRGBg(FromColor);
   FB = GetRGBb(FromColor); 

	 scale=12*w/255;
	 for(i=0;i<w;i++)
	 {
	    HdcSetPenColor(hdc,GetRGB(FR+2*(i/scale),FG+2*(i/scale),FB+2*(i/scale)));
	    HdcDrawHline(hdc,y,y+h,x+i);
	 }
}

//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
void DrawWinTitleBar(HDC hdc,int x,int y,int w,int h,RGB aColor)
{

	RGB FromColor=aColor;
	DrawFadeColor(hdc,x,y,w,h,FromColor);

}

//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
void DrawWinUpFram(HDC hdc,int x,int y,int w,int h)
{
	HdcSetPenColor(hdc,0xFFFFFF);
	HdcDrawHline(hdc,y,y+h,x);
	HdcDrawVline(hdc,x,x+w,y);
	HdcSetPenColor(hdc,0x000000);
	HdcDrawHline(hdc,y,y+h-1,x+w-1);
	HdcDrawVline(hdc,x,x+w-1,y+h-1);
}

//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
void DrawWinCloseBtnA(HDC hdc,unsigned int x,unsigned int y)
{
	 int i,j;
	 unsigned long color=0;
	 for(j=0;j<16;j++)
	 for(i=0;i<16;i++)
	 {
		   if(ws_btn_close_A[j*16+i]==0x0F) color=0xFFFFFF;
			 else if(ws_btn_close_A[j*16+i]==0x00) color=0x000000;
			 else if(ws_btn_close_A[j*16+i]==0x07) color=GetRGB(230,230,230);
		   HdcSetPenColor(hdc,color);
	     HdcSetPixel(hdc,x+i,y+j);
	 }
}

//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
void SetWindowDC(HDC hdc,int x,int y,int w,int h,EnumWinStyle winStyle)
{
  FILE* fp;
	unsigned char* buf;

	hdc->textColor=0x000000;
	hdc->bkColor=GetRGB(230,230,230);
  hdc->Bounds=SetRect(x,y,x+w,y+h);

	if(winStyle==eWinNormal)
	{
	   hdc->brushColor=GetRGB(230,230,230);
		 HdcFillRect(hdc,0,0,w,h);
	}
	else if(winStyle==eWinDesktop)
	{
	   //hdc->brushColor=GetRGB(230,230,230);
		 //HdcFillRect(hdc,0,0,w,h);
		 fp=OpenFile("WALLPAGE");
	   buf=(unsigned char*)kmalloc(fp->f_size);
	   ReadFile(fp,buf,fp->f_size);
		 HdcShowBmp(hdc,0,0,(unsigned long)buf);
		 kfree((unsigned long)buf,fp->f_size);
	}
	else if(winStyle==eWinTaskBar)
	{
		 hdc->brushColor=GetRGB(230,230,230);
		 HdcFillRect(hdc,0,0,w,h);
		 //hdc->brushColor=0x3A6EA5;
		 fp=OpenFile("TASKBARA");
	   buf=(unsigned char*)kmalloc(fp->f_size);
	   ReadFile(fp,buf,fp->f_size);
		 HdcShowBmp(hdc,0,0,(unsigned long)buf);
		 kfree((unsigned long)buf,fp->f_size);
	}


	if(winStyle==eWinNormal)
	{
     DrawWinUpFram(hdc,0,0,w,h);		
	   DrawWinTitleBar(hdc,2,2,w-4,20,GetRGB(128,128,128));	
		 DrawWinCloseBtnA(hdc,w-20,4);
	}
	else if(winStyle==eWinTaskBar)
	{
		 DrawWinUpFram(hdc,0,0,w,h);		
	}
}


//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
void SendInvalidRect(HWND hWnd,RECT InvRect)
{									
	S_Mes mes;
	HINSTANCE hInstance;

	hInstance=GetWndInstance(hWnd);
	mes.MessageType=MES_ERASE;
	mes.Param1=SETLONGWORD(InvRect.left,InvRect.top);
	mes.Param2=SETLONGWORD(InvRect.right-InvRect.left,InvRect.bottom-InvRect.top);
	mes.hWnd= (unsigned long)(hWnd);
	mes.hInstance=hInstance;
	SendMessage(hWnd,&mes);
}


//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
RECT   ScreenRectToDC(HDC hdc,RECT* sRect)
{
	RECT   rc;
	rc.left=sRect->left-hdc->Bounds.left;
	rc.top=sRect->top-hdc->Bounds.top;
	rc.right=sRect->right-hdc->Bounds.left;
	rc.bottom=sRect->bottom-hdc->Bounds.top;

	//if(rc.left<0 && rc.right<0) {rc=SetRect(0,0,0,0);return rc;}
	//if(rc.top<0 && rc.bottom<0) {rc=SetRect(0,0,0,0);return rc;}
	//if(rc.left<=0) rc.left=0;
	//if(rc.top<=0) rc.top=0;
	return rc;
}

//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
RECT  DCRectToScreen(HDC hdc,RECT* dRect)
{
   RECT   rc;
	 rc.left=hdc->Bounds.left+dRect->left;
	 rc.top=hdc->Bounds.top+dRect->top;
	 rc.right=hdc->Bounds.left+dRect->right;
   rc.bottom=hdc->Bounds.top+dRect->bottom;
	 return rc;
}

//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
BOOL IntersectRect(RECT* pdrc, const RECT* psrc1, const RECT* psrc2)
{
    pdrc->left = (psrc1->left > psrc2->left) ?    psrc1->left : psrc2->left;
    pdrc->top  = (psrc1->top > psrc2->top) ?      psrc1->top  : psrc2->top;
    pdrc->right = (psrc1->right < psrc2->right) ? psrc1->right : psrc2->right;
    pdrc->bottom = (psrc1->bottom < psrc2->bottom) ? psrc1->bottom : psrc2->bottom;

    if(pdrc->left >= pdrc->right || pdrc->top >= pdrc->bottom)
    return FALSE;

    return TRUE;
}

//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
BOOL InciseClipRect(RESIDUALRGN* ResRng,const RECT* pOldRect, const RECT* pNewRect)
{
	RECT* rc=&(ResRng->rc[0]);
	int nCount=ResRng->rcNum=0;


	if((pNewRect->top) > (pOldRect->top))
  {
            rc[nCount].left  =  pOldRect->left;
            rc[nCount].top   =  pOldRect->top;
            rc[nCount].right =  pOldRect->right;
            rc[nCount].bottom = pNewRect->top;
						nCount++;
  }

  if((pNewRect->bottom) < (pOldRect->bottom))
  {
            rc[nCount].top  =   pNewRect->bottom;
            rc[nCount].left   = pOldRect->left;
            rc[nCount].right =  pOldRect->right;
            rc[nCount].bottom = pOldRect->bottom;
            nCount++;
  }

  if((pNewRect->left) > (pOldRect->left))

⌨️ 快捷键说明

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