没有现成的成员函数可以完成这个功能,可以用下面迂回的办法:(假设要获得一个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单文档怎么获取列表控件的行数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)