基于VC界面的输电线路模型建立课案Word文档格式.docx
《基于VC界面的输电线路模型建立课案Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于VC界面的输电线路模型建立课案Word文档格式.docx(27页珍藏版)》请在冰点文库上搜索。
在正常设
计荷载作用下,即使材料应力没有超过弹性范围,也会由于结构的有限变形而表
现出一定的几何非线性行为。
从有限位移理论的角度来分析,引起大跨度悬索输电线路的几何非线性的因素主要
有三个:
①缆索垂度效应;
②梁柱效应:
③大位移。
下面的设计将围绕此部分内容展开,是此部分内容的实现。
2.方案设计
输电线路模型的建立需要在一个界面输入输电线路的长度、高度、间距等参数,同时在输入各项参数后,需要生成一个输电线路的模型,用户可根据情况选择保存或不保存所生成的图形。
根据设计要求,采用的方案如下。
利用VC界面编程技术实现各项要求,包含用户登录界面、参数输入界面、图形生成及保存功能。
主要设计思想是自顶向下的编程思想。
3.软件编程
输电线路模型的建立采用自顶向下的设计思想,根据建模的需求来设计程序。
首先需要设计一个用户登录界面,在这个子程序中,我将用户名设为sau,密码为2012040702078,当用户在没有输入用户名和密码的情况下按确定键,程序将提示“用户名或密码不能为空”,当用户输入的用户名或密码错误时,程序将显示“用户名或密码输入错误”,当用户输入正确的用户名和密码,程序将跳转到参数输入界面。
登录界面程序的源代码如下:
#include"
stdafx.h"
DrawWire.h"
LoginDlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CLoginDlgdialog
CLoginDlg:
:
CLoginDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CLoginDlg:
IDD,pParent)
{
//{{AFX_DATA_INIT(CLoginDlg)
m_strPassword=_T("
"
);
m_strUserName=_T("
//}}AFX_DATA_INIT
}
voidCLoginDlg:
DoDataExchange(CDataExchange*pDX)
CDialog:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CLoginDlg)
DDX_Control(pDX,IDC_EDIT_PASSWORD,m_editPassword);
DDX_Control(pDX,IDC_EDIT_USERNAME,m_editUserName);
DDX_Text(pDX,IDC_EDIT_PASSWORD,m_strPassword);
DDV_MaxChars(pDX,m_strPassword,32);
DDX_Text(pDX,IDC_EDIT_USERNAME,m_strUserName);
DDV_MaxChars(pDX,m_strUserName,32);
//}}AFX_DATA_MAP
BEGIN_MESSAGE_MAP(CLoginDlg,CDialog)
//{{AFX_MSG_MAP(CLoginDlg)
//}}AFX_MSG_MAP
ON_EN_CHANGE(IDC_EDIT_PASSWORD,&
OnEnChangeEditPassword)
ON_EN_CHANGE(IDC_EDIT_USERNAME,&
OnEnChangeEditUsername)
END_MESSAGE_MAP()
BOOLCLoginDlg:
OnInitDialog()
OnInitDialog();
m_editUserName.SetFocus();
returnFALSE;
/////////////////////////////////////////////////////////////////////////////
//CLoginDlgmessagehandlers
OnOK()
UpdateData();
m_strUserName="
sau"
;
//设置用户名
m_strPassword="
2012040702078"
//设置密码
if(m_strUserName.IsEmpty()||m_strPassword.IsEmpty())//检查用户输入是否有效
{
AfxMessageBox("
用户名和密码不能为空!
return;
}
if(m_strUserName=="
&
&
m_strPassword=="
78"
)
CDialog:
OnOK();
else
用户名或密码输入错误"
当用户输入了正确的用户名和密码,此时应显示出参数输入界面,根据输电线路建模的需要,我将输入的参数设定为电线杆的个数、高度、间距以及输电线路的总长度。
程序运行时默认电线杆的数量为3,高度为140米,间距为150米,输电线路的总长为360米,即每两个电线杆之间的线路长度为180米。
用户可根据自己的需要更改任意参数。
同时,程序还要考虑到实际情况,当用户输入的间距大于两个电线杆之间线路的长度时,此时明显不符合实际,系统将提示“长度不能小于间距”。
参数输入界面程序的源代码如下:
//DrawWireDlg.cpp:
implementationfile
DrawWireDlg.h"
DrawPicDlg.h"
//CDrawWireDlgdialog
CDrawWireDlg:
CDrawWireDlg(CWnd*pParent/*=NULL*/)
CDialog(CDrawWireDlg:
//{{AFX_DATA_INIT(CDrawWireDlg)
m_dDistance=150.0;
m_dHeight=140.0;
m_dLength=340.0;
m_iCount=3;
m_hIcon=AfxGetApp()->
LoadIcon(IDR_MAINFRAME);
voidCDrawWireDlg:
//{{AFX_DATA_MAP(CDrawWireDlg)
DDX_Text(pDX,IDC_EDIT_DISTANCE,m_dDistance);
DDX_Text(pDX,IDC_EDIT_HEIGHT,m_dHeight);
DDX_Text(pDX,IDC_EDIT_LENGTH,m_dLength);
DDX_Text(pDX,IDC_EDIT_COUNT,m_iCount);
DDV_MinMaxInt(pDX,m_iCount,2,20);
DDX_Control(pDX,IDC_LIST,m_lstInput);
//DDX_Control(pDX,IDC_EDIT_COUNT,m_editcount);
DDX_Control(pDX,IDC_EDIT_COUNT,m_editCount);
BEGIN_MESSAGE_MAP(CDrawWireDlg,CDialog)
//{{AFX_MSG_MAP(CDrawWireDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUILD,OnBuild)
ON_EN_CHANGE(IDC_EDIT_COUNT,&
OnChangeEditCount)
ON_EN_KILLFOCUS(IDC_EDIT_COUNT,&
OnKillfocusEditCount)
ON_EN_CHANGE(IDC_EDIT_LENGTH,&
OnEnChangeEditLength)
ON_EN_CHANGE(IDC_EDIT_HEIGHT,&
OnEnChangeEditHeight)
//CDrawWireDlgmessagehandlers
BOOLCDrawWireDlg:
SetIcon(m_hIcon,TRUE);
//Setbigicon
SetIcon(m_hIcon,FALSE);
//Setsmallicon
m_lstInput.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
//TODO:
Addextrainitializationhere
intiIndex=0;
m_lstInput.InsertColumn(iIndex++,"
名称"
0,120);
间距"
0,100);
长度"
OnKillfocusEditCount();
returnTRUE;
//returnTRUEunlessyousetthefocustoacontrol
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
OnPaint()
if(IsIconic())
CPaintDCdc(this);
//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&
rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//Drawtheicon
dc.DrawIcon(x,y,m_hIcon);
OnPaint();
HCURSORCDrawWireDlg:
OnQueryDragIcon()
return(HCURSOR)m_hIcon;
OnBuild()
if(UpdateData()&
CDrawPicDlg:
CheckDataValid(this))
//更新Data
m_data.clear();
for(inti=0;
i<
m_lstInput.GetItemCount();
++i)
{
CStringstrDistance=m_lstInput.GetItemText(i,1);
CStringstrLength=m_lstInput.GetItemText(i,2);
ITEMitem=ITEM(atoi(strDistance),atoi(strLength));
if(item.iLength<
item.iDistance)
{
strDistance.Format("
[%s]的长度不能小于间距!
m_lstInput.GetItemText(i,0));
AfxMessageBox(strDistance);
return;
}
m_data.push_back(item);
}
CDrawPicDlgdlgPic(this);
dlgPic.DoModal();
OnOK()
SetFocus();
doubleCDrawWireDlg:
GetDistance()
returnm_dDistance;
GetLength()
returnm_dLength;
GetHeight()
returnm_dHeight;
GetTotalDistance()
returnm_dTotalDistance;
intCDrawWireDlg:
GetCount()
returnm_iCount;
constDatas&
CDrawWireDlg:
GetDatas()
returnm_data;
OnChangeEditCount()
OnKillfocusEditCount()
if(UpdateData())
intiSub=m_iCount-m_lstInput.GetItemCount()-1;
if(iSub==0)
return;
CStringstrText;
abs(iSub);
if(iSub>
0)
intiIndex=m_lstInput.GetItemCount();
strText.Format("
%d-%d"
iIndex+1,iIndex+2);
m_lstInput.InsertItem(iIndex,strText);
m_lstInput.SetItemText(iIndex,1,"
150"
m_lstInput.SetItemText(iIndex,2,"
180"
else
m_lstInput.DeleteItem(m_lstInput.GetItemCount()-1);
m_lstInput.UpdateLength();
SetLength(doubledLength,doubledDistance)
m_dLength=dLength;
m_dTotalDistance=dDistance;
UpdateData(FALSE);
参数输入完毕,当用户点击“建立模型”时,程序应建立出输电线路的模型并将其显示出来,同时,当模型建立后,用户可根据自己的需求选择是否保存图像。
相关程序的源代码如下:
//DrawPicDlg.cpp:
//
drawwire.h"
//CDrawPicDlgdialog
CDrawPicDlg:
CDrawPicDlg(CDrawWireDlg*pParent)
CDialog(CDrawPicDlg:
IDD,NULL)
//{{AFX_DATA_INIT(CDrawPicDlg)
//NOTE:
theClassWizardwilladdmemberinitializationhere
m_pMainDlg=pParent;
m_dP=0;
m_bruBack.CreateSolidBrush(RGB(255,255,255));
m_bruBarBack.CreateSolidBrush(RGB(0,0,0));
voidCDrawPicDlg:
//{{AFX_DATA_MAP(CDrawPicDlg)
DDX_Control(pDX,IDC_STATIC_PIC,m_wndPic);
BEGIN_MESSAGE_MAP(CDrawPicDlg,CDialog)
//{{AFX_MSG_MAP(CDrawPicDlg)
ON_BN_CLICKED(IDC_SAVE,OnSave)
//CDrawPicDlgmessagehandlers
BOOLCDrawPicDlg:
OnSave()
//调用保存对话框
CFileDialogdlgSave(FALSE,"
bmp"
"
保存的图像"
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"
图像文件|*.bmp||"
if(dlgSave.DoModal()==IDOK)
//生成文件
GeneratePic(dlgSave.GetPathName());
CDCmdc;
CRectrectPic;
CBitmapbitmap;
CPaintDCdc(this);
//获取画图区域
rectPic=GetPicRect();
//创建双缓冲DC
mdc.CreateCompatibleDC(&
dc);
bitmap.Cr