您好,欢迎来到化拓教育网。
搜索
您的当前位置:首页MFC的坐标系

MFC的坐标系

来源:化拓教育网


关于MFC的坐标系MFC和VC++ 2008-08-11 17:08:06 阅读108 评论0 字号:大中小 订阅

建立以左上角为原点,X轴和Y轴为1000的坐标

我们可以用以下代码:

void CTtView::OnDraw(CDC* pDC)

{

CTtDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CRect rect;

GetClientRect(&rect);

pDC->SetMapMode(MM_ANISOTROPIC);

pDC->SetViewportOrg(0,0);

pDC->SetViewportExt(rect.right,rect.bottom);

pDC->SetWindowOrg(0,0);

pDC->SetWindowExt(1000,1000);

pDC->MoveTo(50,50);

pDC->LineTo(50,950);

pDC->LineTo(950,950);

pDC->LineTo(50,50);

}

代码分析:

1. GetClientRect(&rect); 取得客户区矩形区域,将其存放在rect中

2. 用pDC->SetMapMode(MM_ANISOTROPIC); 设置映射模式

3. 通过pDC->SetViewportOrg(0,0);设置逻辑坐标的原点

4. 通过pDC->SetViewportExt(rect.right,rect.bottom);和

pDC->SetWindowExt(1000,1000);来确定逻辑坐标下和设备坐标下的尺寸对应关系

5. 在MM_ANISOTROPIC模式下,X轴单位和Y轴单位可以不相同

6. 坐标方向的确定方法是如果逻辑窗范围和视口范围符号相同,则逻辑坐标的方向和视口的方向相同,即X轴向右为正,Y轴向下为正。

7. 如果将显示模式改为MM_ISOTROPIC,那么X轴单位和Y轴单位一定相同,感兴趣的读者可以自己使一下。

(二) 建立以视窗中心为原点的坐标

用如下代码:

void CTtView::OnDraw(CDC* pDC)

{

CTtDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CRect rect;

GetClientRect(&rect);

pDC->SetMapMode(MM_ANISOTROPIC);

pDC->SetViewportOrg(rect.right/2,rect.bottom/2);

pDC->SetViewportExt(rect.right,rect.bottom);

pDC->SetWindowOrg(0,0);

pDC->SetWindowExt(1000,-1000);

pDC->MoveTo(150,150);

pDC->LineTo(-150,-200);

pDC->LineTo(150,-150);

pDC->LineTo(150,150);

}

代码分析:

1. 用 pDC->SetViewportOrg(rect.right/2,rect.bottom/2); 设置视口的原点。2. 用pDC->SetViewportExt(rect.right,rect.bottom);pDC->SetWindowExt(1000,-1000);来确定设备坐标和逻辑坐标的单位对应关系。 3. 因为逻辑窗范围和视口范围的符号不一致,纵坐标取反,所以Y轴向上为正。参考资料:http://www.1to2.us/VC-a1543.htm

1、添加工具栏资源ID为IDR_TOOLBAR

2、在对话框的类定义中加:

CToolBar m_ToolBar;

3、在OnInitDialog中或其它合适的消息响应中加如下代码:(函数可查看MSDN)

m_ToolBar.Create(this); //创建工具栏

m_ToolBar.LoadToolBar(IDR_TOOLBAR);//加载工具栏

//得出控件条大小.

CRect rect;

CRect rectNow;

GetClientRect(rect);

RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0,reposQuery,rectNow);

//放置控件条位置

CPoint ptOffset(rectNow.left-rect.left,rectNow.top-rect.top);

CRect rcChild;

CWnd* pwndChild=GetWindow(GW_CHILD);

while (pwndChild)

{

pwndChild->GetWindowRect(rcChild);

ScreenToClient(rcChild);

rcChild.OffsetRect(ptOffset);

pwndChild->MoveWindow(rcChild,FALSE);

pwndChild=pwndChild->GetNextWindow();

}

//调整对话框尺寸

CRect rcWindow;

GetWindowRect(rcWindow);

rcWindow.right+=rect.Width()-rectNow.Width();

rcWindow.bottom+=rect.Height()-rectNow.Height();

MoveWindow(rcWindow, FALSE);

//控件条定位

RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);

//对框居中

CenterWindow();

4、手工添加处理函数

afx_msg void OnBtnXXX();//消息响应函数声明

ON_COMMAND(ID_BTN_XXX/*工具按钮ID*/,OnBtnXXX/*函数名*/)//消息映射

void CXXXDlg::OnBtnXXX(){}//消息处理函数

打开对话框 打开多个文件

CString temp;

int i=0;

POSITION pos;

CFileDialog dlg(TRUE,\"\

//下面一行是设置打开文件对话框——使之可以打开多个文件

TCHAR *pszFile = new TCHAR[MAX_PATH*MAX_PATH];

memset(pszFile,0,sizeof(TCHAR)*MAX_PATH*MAX_PATH);

dlg.m_ofn.lpstrFile = pszFile;

dlg.m_ofn.nMaxFile = MAX_PATH*MAX_PATH;

dlg.m_ofn.Flags

OFN_ALLOWMULTISELECT|OFN_EXPLORER|OFN_ENABLEHOOK; if(dlg.DoModal()==IDOK)

{

//把起首位置赋值给pos

pos=dlg.GetStartPosition();

=

//把打开的多个文件名赋值给fname数组

while(pos!=NULL)

{

fname[i]=dlg.GetNextPathName(pos);

i++;

}

temp.Format(\"%d\

temp=\"一共打开了\"+temp+\"个文件\";

AfxMessageBox(temp);

}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo9.cn 版权所有 赣ICP备2023008801号-1

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务