游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2035|回复: 5

如此的焦点矩形

[复制链接]

6

主题

15

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2007-8-17 21:18:00 | 显示全部楼层 |阅读模式
鼠标左键按下拖拽时,生成如此的焦点矩形,如何做?边框不好描述,所以我只抓了两个图,边框样式如下:
sf_2007817211747.gif

1

主题

149

帖子

149

积分

注册会员

Rank: 2

积分
149
QQ
发表于 2007-8-17 21:56:00 | 显示全部楼层

Re:如此的焦点矩形

D3D画线啊```

6

主题

15

帖子

19

积分

新手上路

Rank: 1

积分
19
 楼主| 发表于 2007-8-18 13:47:00 | 显示全部楼层

Re:如此的焦点矩形

是不是ddraw中用GDI画线?D3D中难道有专门的画线函数,我这个线是流动的呀,能做到?

1

主题

149

帖子

149

积分

注册会员

Rank: 2

积分
149
QQ
发表于 2007-8-18 15:04:00 | 显示全部楼层

Re:如此的焦点矩形

pD3DDevice->DrawPrimitive(D3DPT_LINELIST.......);
所谓流动,只是动画效果而已`~自己想想怎么做动画就行了.

4

主题

23

帖子

23

积分

注册会员

Rank: 2

积分
23
发表于 2007-8-18 15:45:00 | 显示全部楼层

Re:如此的焦点矩形

高手就是不同,楼主应该是我认识的吧,呵呵
又学到东西了.

6

主题

15

帖子

19

积分

新手上路

Rank: 1

积分
19
 楼主| 发表于 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();
                }
        }
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 10:32

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表