📄 gui.c
字号:
{
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 + -