VC6.0,矩形的坐标转换ScreenToClient(&rectStaticScreen);
在对话框上加了一个控件,想用它来定位,在它内部再切分成若干个小矩形,用来模拟窗口的切割分屏:
暂时放到搜索按钮的响应函数中吧:
void CDlgControl::OnButtonSearch()
{
// TODO: Add your control notification handler code here
CRect rectStaticScreen;
this->GetDlgItem(IDC_STATIC_SCREEN)->GetWindowRect(&rectStaticScreen);
CString str;
str.Format("%d,%d;%d,%d",rectStaticScreen.left,rectStaticScreen.top,rectStaticScreen.right,rectStaticScreen.bottom);
// AfxMessageBox(str);
CClientDC dc(this);
dc.Rectangle(rectStaticScreen);
CBrush fillBrush(RGB(122,122,122));
dc.FillRect(&rectStaticScreen,&fillBrush);
dc.TextOut(rectStaticScreen.left,rectStaticScreen.top,"123",sizeof("123")-1);
}
运行得到如下效果:
很明显歪到了一边,把主对话框拉动一下,再单击搜索按钮,会发现一个很有意思的事情:
看到灰色块的位置有了变动,因为一开始就猜到是坐标转换的原因,所以找到一个函数,来试一下:
ScreenToClient(&rectStaticScreen);//转换坐标
把代码重新改写:
void CDlgControl::OnButtonSearch()
{
// TODO: Add your control notification handler code here
CRect rectStaticScreen;
this->GetDlgItem(IDC_STATIC_SCREEN)->GetWindowRect(&rectStaticScreen);
CString str;
str.Format("%d,%d;%d,%d",rectStaticScreen.left,rectStaticScreen.top,rectStaticScreen.right,rectStaticScreen.bottom);
{
// TODO: Add your control notification handler code here
CRect rectStaticScreen;
this->GetDlgItem(IDC_STATIC_SCREEN)->GetWindowRect(&rectStaticScreen);
CString str;
str.Format("%d,%d;%d,%d",rectStaticScreen.left,rectStaticScreen.top,rectStaticScreen.right,rectStaticScreen.bottom);
ScreenToClient(&rectStaticScreen);//转换坐标
CClientDC dc(this);
dc.Rectangle(rectStaticScreen);
CBrush fillBrush(RGB(122,122,122));
dc.FillRect(&rectStaticScreen,&fillBrush);
dc.TextOut(rectStaticScreen.left,rectStaticScreen.top,"123",sizeof("123")-1);
CClientDC dc(this);
dc.Rectangle(rectStaticScreen);
CBrush fillBrush(RGB(122,122,122));
dc.FillRect(&rectStaticScreen,&fillBrush);
dc.TextOut(rectStaticScreen.left,rectStaticScreen.top,"123",sizeof("123")-1);
}
再次运行一下:哇,刚刚好!
接下来,就可以在这个灰色块的内部创建新的矩形了,具体的实现放到下一个文章里,一会儿给出链接
更详细的坐标转换放到其它文章里吧,这个是我实际遇到的一个例子,所以记录下来了,高手们不要拍砖
再比如,下载了个代码,动态创建了一个控件,但是它的位置是用数字指定的,如果要改位置,只能改数字。我就想,创建一个static,用它来定位。
原来的代码:
CRect rcx(50,280,100,300);
m_ShowTextProgressCtrl.Create(WS_CHILD|WS_BORDER|PBS_VERTICAL,rcx,this,55000);
如果要移动它,要修改50,280,100,300这些数字。
现在我创建了一个static,把它拖动到合适的位置:
CRect rcx(50,280,100,300);
GetDlgItem(IDC_STATIC_P)->GetClientRect(&rcx);
m_ShowTextProgressCtrl.Create(WS_CHILD|WS_BORDER|PBS_VERTICAL,rcx,this,55000);
结果移动的位置不理想:
CRect rcx(50,280,100,300);
GetDlgItem(IDC_STATIC_P)->GetWindowRect(&rcx);
m_ShowTextProgressCtrl.Create(WS_CHILD|WS_BORDER|PBS_VERTICAL,rcx,this,55000);
这样就对了: