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

📄 gui.c

📁 一个操作系统的源码部分
💻 C
📖 第 1 页 / 共 3 页
字号:
  {
            rc[nCount].left  =  pOldRect->left;
            rc[nCount].top   =  pOldRect->top;
            rc[nCount].right =  pNewRect->left;
            rc[nCount].bottom = pOldRect->bottom;
            nCount++;
  }

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

  if (nCount == 0) return FALSE;

	ResRng->rcNum=nCount;
	return TRUE;
}

//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
BOOL FindClipRect(CLIPRGN* pRgn,HWND hWnd)
{
	int i;
	for(i=0;i<pRgn->ClipNum;i++)
	{
		if(pRgn->ClipArray[i].hWnd==hWnd)
		return TRUE;
	}

	return FALSE;
}



//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
BOOL AddClipRect(CLIPRGN* pRgn,CLIPRECT ClipRect)
{
	if(pRgn->ClipNum>=64) return FALSE;

	pRgn->ClipArray[pRgn->ClipNum]=ClipRect;
	pRgn->ClipNum++;
	return TRUE;
}

//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
BOOL EditClipRect(CLIPRGN* pRgn,HWND hWnd,CLIPRECT ClipRect)
{
	int i;
	for(i=0;i<pRgn->ClipNum;i++)
		if(pRgn->ClipArray[i].hWnd==hWnd)
		{
        pRgn->ClipArray[i]=ClipRect;
				return TRUE;
		}
	return FALSE;
}

//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
BOOL DelClipRect(CLIPRGN* pRgn,HWND hWnd)
{
	int  aPos,i;

	if(pRgn->ClipNum==0) return FALSE;

	for(i=0;i<pRgn->ClipNum;i++)
		if(pRgn->ClipArray[i].hWnd==hWnd) break;

	if(i==pRgn->ClipNum) return FALSE;
  aPos=i;

	for(i=aPos;i<pRgn->ClipNum-1;i++)
  pRgn->ClipArray[i]=pRgn->ClipArray[i+1];

	memset(&pRgn->ClipArray[i],0,sizeof(CLIPRECT));

	pRgn->ClipNum--;

	return TRUE;
}

//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
BOOL ClipRectLoop(RECTRGN* pInvRgn,RECT* pClipRect)
{
	RECT                       ISRect;                          //相交矩形
	RESIDUALRGN     ResRng;                                     //残余矩形
	RECTRGN              tempRng;
	int     i,j;

	tempRng.rcNum=0;

	for(i=0;i<pInvRgn->rcNum;i++)
	if(IntersectRect(&ISRect,&(pInvRgn->rc[i]),pClipRect))
	{
		 InciseClipRect(&ResRng,&(pInvRgn->rc[i]),pClipRect);
   
     for(j=0;j<ResRng.rcNum;j++)
		 {
			    tempRng.rc[tempRng.rcNum]=ResRng.rc[j];
		      tempRng.rcNum++;
		 }

		 if(ResRng.rcNum<=0)                                        //相交且不剩余则为全部遮挡区
		 {
		    pInvRgn->rc[i]=SetRect(0,0,0,0);
		 }
	}
	else 
	{
		 tempRng.rc[tempRng.rcNum]=pInvRgn->rc[i];
		 tempRng.rcNum++;
	}

	if(tempRng.rcNum!=0)
	{
	   memcpy(pInvRgn,&tempRng,sizeof(RECTRGN));
	}

	return TRUE;
}

//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
void InvalidRectToVram(HDC hdc,RECT* pInvRect)
{
	
	int i;
	RECTRGN aInvRect;
	RECT    aClipRect,eRect;
  CLIPRGN* pRgn=&(hdc->ecrgn);


	aInvRect.rcNum=1;
	memcpy(&aInvRect.rc[0],pInvRect,sizeof(RECT));
	aInvRect.rc[0]=DCRectToScreen(hdc,&aInvRect.rc[0]);

	for(i=0;i<pRgn->ClipNum;i++)
	{
		aClipRect=pRgn->ClipArray[i].rc;
		ClipRectLoop(&aInvRect,&aClipRect);
	}

	for(i=0;i<aInvRect.rcNum;i++)
	{
		    if(!IsNullRect(aInvRect.rc[i]))
				{
				    eRect=ScreenRectToDC(hdc,&aInvRect.rc[i]);
		        HdcRefreshVramRect(hdc,&eRect);
						RefreshMsBuf(aInvRect.rc[i]);
				}
	}


}

//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
void MoveWindows(HWND hWnd,int x,int y,int w,int h)
{
	RECT InvRect;

	GetWndRect(hWnd,&InvRect);

	SetWndPos(hWnd,x,y);
	SetWndSize(hWnd,w,h);

	SetBelowClipRgn(hWnd);
	SetAboveClipRgn(hWnd);
	SetBelowInvalidRgn(hWnd,&InvRect);

	InvRect=SetRect(0,0,w,h);
	SendInvalidRect(hWnd,InvRect);
}


void SetActiveWindow(HWND hWnd);
//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
void ShowWindows(HWND hWnd,BOOL bShow)
{
	RECT WinRect,InvRect;
	int  w,h;

  GetWndRect(hWnd,&WinRect);

	w=WinRect.right-WinRect.left;
	h=WinRect.bottom-WinRect.top;

	SetBelowClipRgn(hWnd);
	InvRect=SetRect(0,0,w,h);
	SendInvalidRect(hWnd,InvRect);
}

//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
HWND WinCreate(int x,int y,int w,int h,HINSTANCE hInstance,WNDPROC winproc,EnumWinStyle winStyle)
{
	WINSTRUCT ws;
	S_Mes*    MesArray;
	S_Mes     mes;

	LockProc(TRUE);
  memset(&ws,0,sizeof(WINSTRUCT));
	ws.hWnd=CurrentWinNum++;
	ws.WindowProc=winproc;
	ws.winStyle=winStyle;
	ws.hInstance=hInstance;
	ws.winRect=SetRect(x,y,x+w,y+h);
	ws.winOldRect=SetRect(x,y,x+w,y+h);
	ws.winHDC=(HDC)kmalloc(sizeof(DC));
	ws.winHDC->mBuf=(unsigned long*)kmalloc(w*h*sizeof(unsigned long));
	SetWindowDC(ws.winHDC,x,y,w,h,winStyle);
  MesArray=(S_Mes*)kmalloc(MesMaxLength*sizeof(S_Mes));
	ws.MessageQueue=(S_Queue*)kmalloc(sizeof(S_Queue));
	SetQueue(ws.MessageQueue,MesArray,MesMaxLength);
	ws.hWnd=RegisterWin(&ws);
	mes.MessageType=MES_WND_CREATE;
	mes.hWnd= (unsigned long)(ws.hWnd);
	mes.hInstance=hInstance;
	SendMessage(ws.hWnd,&mes);
	LockProc(FALSE);
	return ws.hWnd;
}

//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
void SetActiveWindow(HWND hWnd)
{

	int  w,h;
	HDC  hdc;
	RECT WinRect,InvRect;

  GetWndRect(hWnd,&WinRect);

	w=WinRect.right-WinRect.left;
	h=WinRect.bottom-WinRect.top;

	hdc=GetDC(hWnd);

	DrawWinUpFram(hdc,0,0,w,h);		
  DrawWinTitleBar(hdc,2,2,w-4,20,GetRGB(39,126,204));
	DrawWinCloseBtnA(hdc,w-20,4);

	InvRect=SetRect(0,0,w,h);
	SendInvalidRect(hWnd,InvRect);
}


//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
void KillActiveWindow(HWND hWnd)
{

	int  w,h;
	HDC  hdc;
	RECT WinRect,InvRect;

  GetWndRect(hWnd,&WinRect);

	w=WinRect.right-WinRect.left;
	h=WinRect.bottom-WinRect.top;

	hdc=GetDC(hWnd);

	DrawWinUpFram(hdc,0,0,w,h);		
  DrawWinTitleBar(hdc,2,2,w-4,20,GetRGB(128,128,128));
	DrawWinCloseBtnA(hdc,w-20,4);

	InvRect=SetRect(0,0,w,h);
	SendInvalidRect(hWnd,InvRect);
}

//--------------------------------------------------------------------------------------------
//
//
//
//
//--------------------------------------------------------------------------------------------
int DefWindowProc(HWND hwnd,int message, WPARAM wParam, LPARAM lParam)
{
    int           eX,eY,eW,eH;
	  RECT          eRect;
		HDC           hdc;
		S_Mes         mes;

		switch(message)		{			case MES_KEYUP:			break;			case MES_KEYDOWN:							break;			case MES_ERASE:				eX=LWORD(wParam);
				eY=HWORD(wParam);
				eW=LWORD(lParam);
				eH=HWORD(lParam);
        hdc=GetDC(hwnd);
				eRect=SetRect(eX,eY,eX+eW,eY+eH);
				InvalidRectToVram(hdc,&eRect); 				mes.MessageType=MES_PAINT;
				mes.hWnd= (unsigned long)(hwnd);
	      SendMessage(hwnd,&mes);			break;			case MES_PAINT:				break;			case MES_WND_MOVE:				eX=LWORD(wParam);
				eY=HWORD(wParam);
				eW=LWORD(lParam);
				eH=HWORD(lParam);				MoveWindows(hwnd,eX,eY,eW,eH);			break;			case MES_WND_ACTIVE:				SetActiveWindow(hwnd);			break;			case MES_WND_KILL_ACTIVE:				KillActiveWindow(hwnd);			break;		
		}

		return 0;
		
}

⌨️ 快捷键说明

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