|
|

楼主 |
发表于 2007-8-19 03:03:00
|
显示全部楼层
Re:如此的焦点矩形
靠人不如靠已,原来也不难呀,我做成了个类:
BOOL CFocusRect: rawFocusRect()
{
extern LPDIRECTDRAWSURFACE7 lpDDSBack;//Back Surface
extern LPDIRECTDRAWSURFACE7 lpDDSFocusRect;//FocusRect Layer
DDBLTFX ddBltFx;
ddBltFx.dwSize = sizeof(DDBLTFX);
ddBltFx.dwFillColor = 0;
if (FAILED(lpDDSFocusRect->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx))) return FALSE;
extern POINT Pt0;//鼠标左键按下去时的坐标
extern HWND hWnd;//主窗口句柄
POINT CutPt;//鼠标当前的坐标
GetCursorPos(&CutPt);
//ScreenToClient(hWnd,&CutPt);
RECT rect;
if (CutPt.x > Pt0.x && CutPt.y < Pt0.y)//移动方向为第一象限
{
SetRect(&rect,Pt0.x,CutPt.y,CutPt.x,Pt0.y);
}
if (CutPt.x < Pt0.x && CutPt.y < Pt0.y)//移动方向为第二象限
{
SetRect(&rect,CutPt.x,CutPt.y,Pt0.x,Pt0.y);
}
if (CutPt.x < Pt0.x && CutPt.y > Pt0.y)//移动方向为第三象限
{
SetRect(&rect,CutPt.x,Pt0.y,Pt0.x,CutPt.y);
}
if (CutPt.x > Pt0.x && CutPt.y > Pt0.y)//移动方向为第四象限
{
SetRect(&rect,Pt0.x,Pt0.y,CutPt.x,CutPt.y);
}
HDC hDC;
if (FAILED(lpDDSFocusRect->GetDC(&hDC))) return FALSE;
for (int tx=rect.left; tx<=rect.right; tx++)//上边框
{
if ( (tx+N) / 5 % 2 == 0) continue;//N增加一个像素,往左流动一个像素
SetPixel(hDC,tx,rect.top,RGB(255,255,255));
}
for (int bx=rect.left; bx<=rect.right; bx++)//下边框
{
if ( (bx-N) / 5 % 2 == 0) continue;//N增加一个像素,往右流动一个像素
SetPixel(hDC,bx,rect.bottom,RGB(255,255,255));
}
for (int ly=rect.top; ly<=rect.bottom; ly++)//左边框
{
if ( (ly-N) / 5 % 2 == 0) continue;//N增加一个像素,往下流动一个像素
SetPixel(hDC,rect.left,ly,RGB(255,255,255));
}
for (int ry=rect.top; ry<=rect.bottom; ry++)//右边框
{
if ( (ry+N) / 5 % 2 == 0) continue;//N增加一个像素,往上流动一个像素
SetPixel(hDC,rect.right,ry,RGB(255,255,255));
}
N >= 9 ? N = 0 : N ++;
lpDDSFocusRect -> ReleaseDC(hDC);
if(FAILED(lpDDSBack->BltFast(0,0,lpDDSFocusRect,NULL,
DDBLTFAST_SRCCOLORKEY|DDBLTFAST_WAIT))) return FALSE;
return TRUE;
}
主窗口中的游戏循环中调用:
POINT pt;
GetCursorPos(&pt);
if (IsClick)//按下鼠标左键时,该值为TRUE,放开时为FALSE
{
if (pt.x != Pt0.x && pt.y != Pt0.y)
{
CFocusRect FocusRect;
FocusRect.DrawFocusRect();
}
}
|
|