有一段程序,我改后无法达到效果,请大侠进来看看,很急切!!!!!!!!!

popyyb 2003-10-17 10:25:58
尝试一个基于对话框的程序,

void CResizeDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
if (m_tracker)
{
CDC* pDC = GetDC();
m_tracker->Draw(pDC);
}
CDialog::OnPaint();
}
}

// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CResizeDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}

void CResizeDlg::OnStart()
{
CDC* pDC = GetDC();
if (m_tracker)
{
delete m_tracker;
m_tracker = NULL;
}
LPRECT rect = new RECT;
CWnd* wnd = (CWnd*)(GetDlgItem(IDC_EDIT1));

wnd->GetWindowRect(rect) ;
ScreenToClient(rect) ;
//pDC->LPtoDP(rect);
m_tracker = new CRectTracker(rect,CRectTracker::dottedLine | CRectTracker::resizeOutside | CRectTracker::hatchedBorder );
m_tracker->Draw(pDC) ;
delete rect;
rect = NULL;

}

void CResizeDlg::OnStop()
{
if (m_tracker)
{
delete m_tracker;
m_tracker = NULL;
Invalidate(TRUE);
}

}

BOOL CResizeDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (m_tracker)
if (pWnd == this && m_tracker->SetCursor(this, nHitTest))
return TRUE;


return CDialog::OnSetCursor(pWnd, nHitTest, message);
}

void CResizeDlg::OnLButtonDown(UINT nFlags, CPoint point)
{

if (m_tracker)
{
m_tracker->Track(this, point, TRUE);
Invalidate(FALSE);
CDC* pDC = GetDC();
m_tracker->Draw(pDC);

LPRECT rect = new RECT;
CWnd* wnd = (CWnd*)(GetDlgItem(IDC_EDIT1));
rect = LPRECT(m_tracker->m_rect);
wnd->MoveWindow(rect,TRUE) ;
rect = NULL;
delete rect;
rect = NULL;
}
CDialog::OnLButtonDown(nFlags, point);
}

CRectTracker* m_tracker;

IDC_EDIT1是在对话框上放置的一个Edit,以上的程序实现当实现OnStart()时,该edit可以被Resize,现在的问题是如果在这个Edit(或者其他的控件上)在增加一个控件,如何用以上的方法来移动这个控件?

十分急切希望得到答案,我尝试了一下,不能正确定位。。。。
...全文
33 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
popyyb 2003-10-21
  • 打赏
  • 举报
回复
up
arvid_gs 2003-10-21
  • 打赏
  • 举报
回复
kankan
popyyb 2003-10-21
  • 打赏
  • 举报
回复
up again
popyyb 2003-10-20
  • 打赏
  • 举报
回复
up
popyyb 2003-10-20
  • 打赏
  • 举报
回复
真的没有办法,不能在控件类中处理自己的移动?
popyyb 2003-10-20
  • 打赏
  • 举报
回复
up,楼上的怎么乱发帖子啊

高手呢?
Darlinton 2003-10-20
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2358/2358992.xml?temp=.9543726
popyyb 2003-10-20
  • 打赏
  • 举报
回复
thanks and up
popyyb 2003-10-20
  • 打赏
  • 举报
回复
up
beyondtkl 2003-10-20
  • 打赏
  • 举报
回复
给你顶 楼主.
popyyb 2003-10-20
  • 打赏
  • 举报
回复
up
popyyb 2003-10-20
  • 打赏
  • 举报
回复
我的思路如下:

因为CRectTracker的m_rect是clientRect,因此它的坐标是(0,0,right,bottom),因此在Track函数执行后可能会出现负数,我想先处理负数,把Track得到的m_rect转换为(0,0, right, bottom),然后这个矩形的左上角点为原点,让控件移动到这里,不知道我的想法是否可行,因为没有做过这样的坐标转换。

我班门弄斧了,还请各位大侠指点。最上面的程序是可以运行的程序,实现了基于父窗体的子控件的移动。

因为我想这样做的好处是可以使得程序的耦合性降低,更加利于重用,因为以后可以很方便地写成一个模板吧,让控件的移动在自己类中完成,而不用依赖父窗体(控件),谢谢


请大家多关注了,谢谢!
孤必有邻 2003-10-20
  • 打赏
  • 举报
回复
这里提供一个示例程序,可以参考一下:
http://www.yangning.com/cgi-bin/topic.cgi?forum=1&topic=98&show=0
bluebohe 2003-10-20
  • 打赏
  • 举报
回复
mark
popyyb 2003-10-19
  • 打赏
  • 举报
回复
楼上批评的是,多谢大侠对我的鞭策,我诚心接受,谢谢!
lop5712 2003-10-19
  • 打赏
  • 举报
回复
我都无语了,楼主的程序也太多错误了
第一个OnLButtonDown
rect = LPRECT(m_tracker->m_rect);
m_tracker->m_rect是一个RECT的实例,rect是一个RECT*,右边是一个32字节长的结构,将其赋值给左边的4个字节长的指针,将会用m_tracker->m_rect.left作为地址赋到rect中,但竟能够成功,可能m_tracker->m_rect是一个CRect的实例,重载了LPRECT操作符,以至MoveWindow尚能正确,但delete rect时将会出现错误,因为rect已经不是new RECT所得到的地址了(而是&m_tracker->m_rect),内存泄露。
猜测因此楼主在delete rect;的上下各加了个rect = NULL;楼主应改成
wnd->MoveWindow( &m_tracker->m_rect, TRUE ); // 即将rect的这个指针去掉

第二个OnLButtonDown中同样,对于RECT *rect的使用简直就是乱用,严重的内存泄露。
除去这个小问题不说,楼主如何认为应该效果一样?楼主先通过
wnd->GetWindowRect(rect);//取得控件的屏幕坐标
那么rect中装的就是控件未移动前的坐标和尺寸了,紧接着,楼主通过
m_tracker->m_rect.SetRect(rect->left,rect->top,rect->right,rect->bottom);
将m_tracker->m_rect赋为控件移动前的坐标和尺寸,再通过
wnd->MoveWindow(m_tracker->m_rect, TRUE);//Move
让控件移动到控件移动前的坐标和尺寸,看起来就跟没效果一样,改为如下:

if( m_tracker )
{
m_tracker->Track(this, point, TRUE);
Invalidate(FALSE);
CDC* pDC = GetDC();
m_tracker->Draw(pDC);
pDC->ReleaseDC();

RECT rect = m_tracker->m_rect;
ScreenToClient( &rect );
GetDlgItem( IDC_EDIT1 )->MoveWindow( &m_rect, TRUE );
}
popyyb 2003-10-19
  • 打赏
  • 举报
回复
up
popyyb 2003-10-19
  • 打赏
  • 举报
回复
up
lop5712 2003-10-19
  • 打赏
  • 举报
回复
算了,楼主就是想编一个用伸缩框(CRectTracker)来实现动态改变控件的尺寸及位置
楼主请把电子邮箱地址用短信发给我,明天给你个例子。
popyyb 2003-10-19
  • 打赏
  • 举报
回复
自己再次up
加载更多回复(14)

15,979

社区成员

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

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