请教自定义控件的缩放问题

xgc2067598 2010-02-17 02:23:35
我定义了一个类ClassA直接继承自CWnd,在上面画了一些东西。
现在在FormView上动态画了多个ClassA的对象时,我希望ClassA能直接被拖动和缩放,现在拖动的问题我解决了(用的CWnd::SetWindowPos),但是缩放的问题,我该怎么做,我现在可以已经达到的效果是 当鼠标经过某个classA对象的四个边角,四条边的中心点和对象内部时鼠标都会改变形状,但是我不知道如何能够实现缩放(虽然知道肯定要用 cwnd::movewindow),请教具体的实现?
...全文
248 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
csl312211865 2010-02-19
  • 打赏
  • 举报
回复
引用 13 楼 xgc2067598 的回复:
但是这样出来的矩形总是会出现一条边缺少的现象,
不明白你说的一条边缺少是怎么样的现象
xgc2067598 2010-02-19
  • 打赏
  • 举报
回复
终于成功了 可以移动和缩放自己的控件了 哈哈 其实想明白了 还真是简单 前面的代码太过复杂了
xgc2067598 2010-02-19
  • 打赏
  • 举报
回复
引用 15 楼 csl312211865 的回复:
引用 13 楼 xgc2067598 的回复:但是这样出来的矩形总是会出现一条边缺少的现象,不明白你说的一条边缺少是怎么样的现象


谢谢这位兄弟 零晨的关注: 缺少边的情况是这样的 你想像一下 因为左上角的原点始终不变,所拖的过程产生的矩形框的左边框和上边框始的位置是不变的只是长度变化,终处于看不见的情况(鼠标的不断move,导致不断的擦除,绘制,所以肉眼根本看不出在绘制,偶尔能看到几次,),下边框和左边框的情况也是如此,但是由于右下角的原点始终在变 所以大部分情况下始终能否看到一条边框,除非往右下方向拖动速度比较快速 ,那下边框和左边框就能够比较连续闪烁的“同时”显示出来
xgc2067598 2010-02-19
  • 打赏
  • 举报
回复
引用 14 楼 yhp1888 的回复:
引用 3 楼 xgc2067598 的回复:只有鼠标不在四个边角和四条边的中心点时 才能够进行拖动,我也在代码里给这几个位置点都做了 flag 以做判断,但是始终都是进入了拖放的代码内

----鼠标要用API函数SetCap....,就是抓住的意思,拖放完成后再释放,我这台电脑是裸的,资料不在身边,忘了函数名了



我现在拖放的动作是没有问题的,但是拖的过程中自己画的矩形框不太对
zhanghaaaa 2010-02-18
  • 打赏
  • 举报
回复
m_pKj[9]->MoveWindow(602,49,51,18,true);
m_pKj[9]->是动态创建对象的指针.
602,49,51,18为控件的左上角坐标x,y和控件的宽度,高度.(应该是像素值)
xgc2067598 2010-02-18
  • 打赏
  • 举报
回复
引用 8 楼 uncleqiong 的回复:
你要的是什么效果,好像没法明白?详细说一说行不?


就是自定义的控件 能够让用户自己缩放大小和调整位置
UncleQiong 2010-02-18
  • 打赏
  • 举报
回复
你要的是什么效果,好像没法明白?详细说一说行不?
yhp1888 2010-02-18
  • 打赏
  • 举报
回复
引用 3 楼 xgc2067598 的回复:
只有鼠标不在四个边角和四条边的中心点时 才能够进行拖动,我也在代码里给这几个位置点都做了 flag 以做判断,但是始终都是进入了拖放的代码内


----鼠标要用API函数SetCap....,就是抓住的意思,拖放完成后再释放,我这台电脑是裸的,资料不在身边,忘了函数名了
xgc2067598 2010-02-18
  • 打赏
  • 举报
回复
不好意思 上面的我知道原因了 自己指定了SWP_NOSIZE参数。。 继续前面的
xgc2067598 2010-02-18
  • 打赏
  • 举报
回复
BOOL SetWindowPos( const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags );


还有这个函数很奇怪 x,y的坐标点我改变了都会出现变化,但是 cx,cy改变宽度和高度,不管我改变什么值都无法改变原有的高度宽度,我是这样写的


((CEditWnd*)GetDlgItem(1))->SetWindowPos(NULL,10,30,40,50,SWP_NOSIZE|SWP_NOZORDER);
xgc2067598 2010-02-18
  • 打赏
  • 举报
回复
引用 4 楼 yxwsbobo 的回复:
在 WM_SIZE 消息的时候 使用SetWindowPos 更改大小


这位兄弟肯能误解了我的意思 我要的不是窗体控件随着窗体大小的改变而变化大小 ,虽然这部也是我下一部准备实现的
xgc2067598 2010-02-18
  • 打赏
  • 举报
回复
我在最后 Rectangle( hDc,rcTarget.left,rcTarget.top,rcTarget.right,rcTarget.bottom )前面加了些代码用来保存先前的矩形 然后用inavlidaterect擦除掉 ,但是这样出来的矩形总是会出现一条边缺少的现象,除非我拖动比较快 才显的很连续, 添加的代码如下



::InvalidateRect(GetParent()->m_hWnd,&m_pOldRect,TRUE);
Rectangle( hDc,rcTarget.left,rcTarget.top,rcTarget.right,rcTarget.bottom );
m_pOldRect.left=rcTarget.left;
m_pOldRect.top=rcTarget.top;
m_pOldRect.right=rcTarget.right;
m_pOldRect.bottom=rcTarget.bottom;
xgc2067598 2010-02-18
  • 打赏
  • 举报
回复
我现在可以实现了在classA对象上 某个边角拖动鼠标后边框的对象大小的缩放,但是在 鼠标拖动过程中(鼠标左键弹起之前)我想加一个矩形框 以显示拖动后的大小,但是因为鼠标不停的移动过程中,不断产生画出来的矩形框,但又无法擦除先前的矩形框,导致view上出现很多矩形黑框 ,我画矩形框的代码如下


void CEditWnd::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
CEditViewView *pView=(CEditViewView*)pFrame->GetActiveView();
int j=HitTest(point,pView,TRUE);
HCURSOR x=GetHandleCursor(j);
::SetCursor(x);
if (m_selected==TRUE && m_iFlag==2)
{
//Rectangle()
ClientToScreen(&point);
pView->ClientToDoc(point);
HDC hDc=::GetDC(GetParent()->m_hWnd);
::SetROP2(hDc,R2_NOTXORPEN); //
RECT rcTarget;
if( ( begin_position.x < point.x ) && ( begin_position.y > point.y ) )
SetRect( &rcTarget,begin_position.x,point.y,point.x,begin_position.y );
else if( ( begin_position.x > point.x ) && ( begin_position.y > point.y ) )
SetRect( &rcTarget,point.x ,point.y,begin_position.x,begin_position.y );
else if( ( begin_position.x > point.x ) && ( begin_position.y < point.y ) )
SetRect( &rcTarget,point.x,begin_position.y,begin_position.x,point.y);
else
SetRect( &rcTarget,begin_position.x,begin_position.y,point.x,point.y);

Rectangle( hDc,rcTarget.left,rcTarget.top,rcTarget.right,rcTarget.bottom );


}

//CWnd::OnMouseMove(nFlags, point);
}
xgc2067598 2010-02-18
  • 打赏
  • 举报
回复
引用 10 楼 zhanghaaaa 的回复:
m_pKj[9]->MoveWindow(602,49,51,18,true);
m_pKj[9]->是动态创建对象的指针.
602,49,51,18为控件的左上角坐标x,y和控件的宽度,高度.(应该是像素值)



函数我都理解 我要具体实现的方法,
yxwsbobo 2010-02-17
  • 打赏
  • 举报
回复
在 WM_SIZE 消息的时候 使用SetWindowPos 更改大小
xgc2067598 2010-02-17
  • 打赏
  • 举报
回复
谢谢楼上的回答 我知道这个函数的作用, 我现在遇到的问题是 不管鼠标的classA对象的任何位置 按下鼠标的左键后都是实现的拖动 ,但是按照我原有的思路应该是 只有鼠标不在四个边角和四条边的中心点时 才能够进行拖动,我也在代码里给这几个位置点都做了 flag 以做判断,但是始终都是进入了拖放的代码内
enic 2010-02-17
  • 打赏
  • 举报
回复
答案还是SetWindowPos
int x, int y, int cx, int cy
这四个参数可以决定窗口的大小不是么,根据鼠标消息算出来就ok啦···

如果这还不能满足你,试试SetWindowRgn
xgc2067598 2010-02-17
  • 打赏
  • 举报
回复
自己顶下 ,大家帮下忙了

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧