mfc中控件移动的问题

mfc中控件移动的问题,第1张

没有现成的成员函数可以完成这个功能,可以用下面迂回的办法:(假设要获得一个CButton but控件的位置)

RECT rectBut;

butGetWindowRect( &rectBut); //获取按钮控件的屏幕坐标

RECT rectParent;

(butGetParent())->GetWindowRect( &rectParent ); //获取按钮父窗口的屏幕坐标

RECT rect; //开始计算按钮相对于父窗口的坐标

rectleft = rectButleft - rectParentleft;

rectright = rectButright - rectParentleft;

recttop = rectButtop - rectParenttop;

rectbottom = rectButbottom - rectParenttop;

经过这段代码后,rect里面就是按钮空间相对于其所在窗口的坐标。这段代码有两点要特别注意:

1)butGetParent()可能返回NULL,这在按钮是桌面上的按钮时发生,此时(butGetParent())->GetWindowRect( &rectParent )将导致访问违例异常,程序会崩溃,但鉴于一般程序不会在桌面窗口上添加控件,因此不必作额外的检测。

2)这段代码获得的是按钮相对于整个父窗口的坐标,包括菜单和标题栏,而不是相对于父窗口客户区的坐标。若要获得相对于父窗口客户区的坐标则要做更多处理。

先得到控件的窗口坐标再转换成相对于对话框的坐标即可。代码如下:

CRect r;

GetDlgItem(IDC_BUTTON1)->GetWindowRect(&r);

ScreenToClient(r);

望采纳

这是我的程序代码片段,有关获取鼠标点到列表框行列的代码,发给你参考下:

typedef pair<int,int> CellIndex; // Row, Column

// 当鼠标右键点击时有一个CPoint传给你,然后根据CPoint来获取列表框的行和列。

// 用HitTest函数即可获取。

CListCtrlEx::CellIndex CListCtrlEx::PointToIndex(const CPoint&point)

{

LVHITTESTINFO lvHitTestInfo;

CRect rect;

lvHitTestInfopt=point;

if(HitTest(&lvHitTestInfo)>=0||(SubItemHitTest(&lvHitTestInfo)>=0)&&lvHitTestInfoiItem>=0)

{

intnRow =lvHitTestInfoiItem;

intnColumnCount =GetColumnCount();

for(intnColumn=0;nColumn<nColumnCount;++nColumn)

{

if(GetCellRect(nRow,nColumn,rect))

{

if(rectPtInRect(point))

{

return make_pair(nRow,nColumn);

}

}

}

}

return make_pair(-1,-1);

}

实际用到的就是GetWindowRect和MoveWindow两个函数。

计算过程中,既然是相对底部,那么获取窗口大小和控件位置后,先计算rectbottom和窗口高度的差值,加上一个底部正常距离,获取一个int值 iMove; 将rect的top和bottom分别减去这个iMove,调用MoveWindow即可。

以上就是关于mfc中控件移动的问题全部的内容,包括:mfc中控件移动的问题、MFC如何获取控件在对话框上的位置坐标、MFC单文档怎么获取列表控件的行数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9818864.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存