沥青混合料配合比数据处理系统
1.沥青混合料配合比选择简介
沥青混合料配合比的设计主要是利用马歇尔的试验方法确定沥青混合料的材料品种及配合比、矿料级配、最佳沥青用量。其工艺流程图如下:
沥青混合料配合比设计操作框图
这个软件设计不包括原材料的选定和试验、马歇尔试件的制作。仅仅是针对矿料级配的计算、马歇尔试验以后的步骤。
矿料级配计算主要采用规划求解方法进行。
通过马歇尔试验得出一组数据,然后对数据进行处理,最终得出最佳油石比。 2.人工数据处理过程
2.1矿料级配的计算:列15个方程,求解4个未知数,有不同的结果。
沥青混合料级配设计计算表
2.2本数据处理系统是对马歇尔试验的数据用计算机进行处理,改变以往人工处理效率低,准确性差的特点。
马歇尔试验得出数据汇总如下:
然后将每种试验项目作纵坐标,油石比作横坐标绘制如下表:
1)根据上述的五个曲线图求取相应密度最大值时沥青用量a2、稳定度最大值时沥青用量a1、空隙率范围中值沥青用量a3,求取三者平均值作为最佳沥青用量的初始值OAC1:
OAC1=(a1+a2+a3)/3
2)求出各项指标符合技术要求的沥青用量范围OACMIN—OACmax,其中 OAC2=( OACMIN+OACmax,)/2 3)最佳沥青用量为:
OAC=( OAC1+OAC2)/2 3.计算机数据处理过程
3.1试验参数的输入
3.2马歇尔数据处理
3.3级配设计
4.使用说明
本软件采用VC6.0编写,可在windows环境下运行。
软件采用基于文档的方式来实现,通过处理输入的数据,在文档区显示
数据处理的结果,同时可以通过本地或者网络打印机打印显示的文档。
按数据处理功能来说分为两部分,一部分是沥青混合料最佳用量确定试
验,一部分是沥青混合料集料级配设计试验。
1、 沥青混合料最佳用量确定试验使用说明
1) 打开程序;
2) 点击 菜单——〉参数输入——〉试验参数, 出现参数输入的对话框;
3) 在对话框里分别填写实验信息, 选择道路类型、混凝土类型。然后点击“确定”按钮;
4) 此时 菜单——〉参数输入——〉Mashall参数 激活,点击 菜单——〉参数输入——〉Mashall参数,出现Mashall参数的对话框;
5) 选择试验数据组数(5~8),缺省值为5;然后填入实验数据,如果填错,则会报错。
测试时请选择组数为5,然后点击载入测试数据,则程序自动将一组设定好的数据填入,供测试软件之用。
数据填完则点击“确定”按钮;
6) 点击 菜单——〉结果输出——〉数据分析, 则在文档区出现两页的文档,分别记录着实验信息、试验数据、最佳用量的确定、图表等。
7) 预览:此时可以通过 菜单——〉文件——〉打印预览 观察要
打印的文档。可同时在屏幕中显示一页或两页,也可以放大缩小文档来观看。
8) 打印:可以在预览窗口点击“打印”,也可以通过 菜单——〉文件——〉打印 来完成。(注意:请在打印之前,检查打印机是否装好,或者是否有网络打印机; 打印纸张大小为A4, 方向为纵向,可以在打印设置中检查。)
9) 保存:点击工具栏或者菜单上的“保存”按钮,可以将文档保存下来。
10) 另存为:点击菜单上的“另存为”按钮,可以将文档另保存下来。 11) 打开:点击工具栏或者菜单上的“打开”按钮,可以打开保存过的文档。
2、沥青混合料集料级配设计试验使用说明
1) 打开程序;
2) 点击 菜单——〉参数输入——〉集配设计, 出现级配试验参数输入的对话框;
3) 在对话框中按照筛孔尺寸分别填入4~6种集料的通过百分率,双击表格第一行的单元可以选择或者去除基准列, 然后点击“确定”按钮;也可以通过点击“载入测试数据”来填入测试数据。
4) 点击 菜单——〉结果输出——〉数据分析, 则在文档区出现一页的文档,分别记录试验结果及级配图等信息。
5) 打印、打印预览、保存、另存为、打开同上;
5.下步计划
本软件未设及原材料试验等步骤,下次改进时将进行补充,使软件更加丰富,使用更加方便简洁。
毕业设计论文
沥青混合料配合比数据处理系统
学 生:吴志祥 指导老师:
石家庄铁道学院成教分院 2002级计算机专业
部份代码
MICROSOFT FOUNDATION CLASS LIBRARY : Concrete2
======================================================================== AppWizard has created this Concrete2 application for you. This application not only demonstrates the basics of using the Microsoft Foundation classes but is also a starting point for writing your application.
This file contains a summary of what you will find in each of the files that make up your Concrete2 application.
Concrete2.dsp
This file (the project file) contains information at the project level and is used to build a single project or subproject. Other users can share the project (.dsp) file, but they should export the makefiles locally. Concrete2.h
This is the main header file for the application. It includes other project specific headers (including Resource.h) and declares the
CConcrete2App application class.
Concrete2.cpp
This is the main application source file that contains the application class CConcrete2App.
Concrete2.rc
This is a listing of all of the Microsoft Windows resources that the
program uses. It includes the icons, bitmaps, and cursors that are stored in the RES subdirectory. This file can be directly edited in Microsoft Visual C++.
Concrete2.clw
This file contains information used by ClassWizard to edit existing classes or add new classes. ClassWizard also uses this file to store information needed to create and edit message maps and dialog data maps and to create prototype member functions.
res\Concrete2.ico
This is an icon file, which is used as the application's icon. This icon is included by the main resource file Concrete2.rc.
res\Concrete2.rc2
This file contains resources that are not edited by Microsoft
Visual C++. You should place all resources not editable by
the resource editor in this file.
///////////////////////////////////////////////////////////////////////////// For the main frame window:
MainFrm.h, MainFrm.cpp
These files contain the frame class CMainFrame, which is derived from CFrameWnd and controls all SDI frame features.
res\Toolbar.bmp
This bitmap file is used to create tiled images for the toolbar.
The initial toolbar and status bar are constructed in the CMainFrame class. Edit this toolbar bitmap using the resource editor, and
update the IDR_MAINFRAME TOOLBAR array in Concrete2.rc to add
toolbar buttons.
///////////////////////////////////////////////////////////////////////////// AppWizard creates one document type and one view:
Concrete2Doc.h, Concrete2Doc.cpp - the document
These files contain your CConcrete2Doc class. Edit these files to
add your special document data and to implement file saving and loading (via CConcrete2Doc::Serialize).
Concrete2View.h, Concrete2View.cpp - the view of the document
These files contain your CConcrete2View class.
CConcrete2View objects are used to view CConcrete2Doc objects.
///////////////////////////////////////////////////////////////////////////// Other standard files:
StdAfx.h, StdAfx.cpp
These files are used to build a precompiled header (PCH) file
named Concrete2.pch and a precompiled types file named StdAfx.obj.
Resource.h
This is the standard header file, which defines new resource IDs.
Microsoft Visual C++ reads and updates this file.
///////////////////////////////////////////////////////////////////////////// Other notes:
AppWizard uses "TODO:" to indicate parts of the source code you
should add to or customize.
If your application uses MFC in a shared DLL, and your application is
in a language other than the operating system's current language, you
will need to copy the corresponding localized resources MFC42XXX.DLL
from the Microsoft Visual C++ CD-ROM onto the system or system32 directory, and rename it to be MFCLOC.DLL. ("XXX" stands for the language abbreviation. For example, MFC42DEU.DLL contains resources translated to German.) If you don't do this, some of the UI elements of your application will remain in the language of the operating system.
///////////////////////////////////////////////////////////////////////////// DlgparaJipei(cpp)
// DlgParaJipei.cpp : implementation file
//
#include "stdafx.h"
#include "concrete2.h"
#include "DlgParaJipei.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
///////////////////////////////////////////////////////////////////////////// // CDlgParaJipei dialog
CDlgParaJipei::CDlgParaJipei(CWnd* pParent /*=NULL*/)
: CDialog(CDlgParaJipei::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlgParaJipei)
m_bCheck = FALSE;
m_nRows = 4;
//}}AFX_DATA_INIT
}
void CDlgParaJipei::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgParaJipei)
DDX_Control(pDX, IDC_SPIN_ROW, m_SpinRow);
DDX_GridControl(pDX, IDC_GRID1, m_Grid);
DDX_Text(pDX, IDC_EDIT_ROWS, m_nRows);
DDV_MinMaxInt(pDX, m_nRows, 4, 6);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDlgParaJipei, CDialog)
//{{AFX_MSG_MAP(CDlgParaJipei)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_EN_UPDATE(IDC_EDIT_ROWS, OnUpdateEditRows)
//}}AFX_MSG_MAP
ON_NOTIFY(NM_DBLCLK, IDC_GRID1, OnGridDblClick)
END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////// // CDlgParaJipei message handlers
BOOL CDlgParaJipei::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
int i;
CString str;
m_SpinRow.SetRange(4,6);
m_Grid.SetRowCount(6);
m_Grid.SetColumnCount(14);
m_Grid.SetFixedRowCount(2);
m_Grid.SetFixedColumnCount(1);
m_Grid.SetEditable(TRUE);
//设置选择列的参数
m_nSelectCols[0] = 0; //个数
m_nSelectCols[1] = -1; //列
m_nSelectCols[2] = -1; //列
m_Grid.SetColumnWidth(0, 70);
for(i = 0; i
{
m_Grid.SetRowHeight(i, 25); } for( i = 1; i
m_Grid.SetItem(&item);
item.col = 9;
item.strText = "1.18";
m_Grid.SetItem(&item);
item.col = 10;
item.strText = "0.6";
m_Grid.SetItem(&item);
item.col = 11;
item.strText = "0.3";
m_Grid.SetItem(&item);
item.col = 12;
item.strText = "0.15";
m_Grid.SetItem(&item);
item.col = 13;
item.strText = "*0.075";
m_Grid.SetItem(&item);
//设置第二排的单位
item.row = 1;
item.col = 0;
item.strText = "序号";
m_Grid.SetItem(&item);
for(i = 1; i
{
item.col = i;
str.Format("%d", i);
item.strText = str;
m_Grid.SetItem(&item);
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CDlgParaJipei::OnGridDblClick(NMHDR *pNotifyStruct, LRESULT *)
{
NM_GRIDVIEW* pItem = (NM_GRIDVIEW*) pNotifyStruct;
CString strTemp;
int i;
if(pItem->iRow == 0)
{
BOOL CoreCol;//特殊列
i = pItem->iColumn;
CoreCol = (i == 7) || (i == 8) || (i == 13);
//特殊列
if(CoreCol)
{
AfxMessageBox("不能改动原定基准列");
return;
}
//前4列
else if(pItem->iColumn
{
AfxMessageBox("不能选择前4列作为基准列");
return;
}
//选择的不是基准列
else if(pItem->iColumn != m_nSelectCols[1] && pItem->iColumn != m_nSelectCols[2])
{
//列数已经够了
if((m_nSelectCols[0] + 4) == m_nRows)
{
AfxMessageBox("选择的列数已经达到要求");
return;
}
//还不够
else if((m_nSelectCols[0] + 4)
{
//纪录
m_nSelectCols[0] ++;
m_nSelectCols[m_nSelectCols[0]] = pItem->iColumn;
//显示
strTemp = m_Grid.GetItemText(0, pItem->iColumn);
strTemp = "*" + strTemp;
m_Grid.SetItemText(0, pItem->iColumn, strTemp);
m_Grid.Refresh();
return;
}
}
//选择的是基准列
else if(pItem->iColumn == m_nSelectCols[1] || pItem->iColumn m_nSelectCols[2])
{
//纪录
m_nSelectCols[0] --;
if(pItem->iColumn == m_nSelectCols[1])
{
m_nSelectCols[1] = -1;
}
else
{
m_nSelectCols[2] = -1;
} ==
//显示
strTemp = m_Grid.GetItemText(0, pItem->iColumn);
strTemp.TrimLeft("*");
m_Grid.SetItemText(0, pItem->iColumn, strTemp);
m_Grid.Refresh();
return;
}
/* //删除信息
strTemp = "确实要删除第" + m_Grid.GetItemText(1, pItem->iColumn) + "列"; int i;
BOOL CoreCol;//特殊列
i = atoi(m_Grid.GetItemText(1, pItem->iColumn));
CoreCol = (i == 7) || (i == 8) || (i == 13);
//特殊列
if(CoreCol)
{
AfxMessageBox("不能删除特殊列");
}
//小于8列
else if(m_Grid.GetColumnCount()
{
AfxMessageBox("不能再删除列了!");
}
else if(AfxMessageBox(strTemp, MB_OKCANCEL) == IDOK)
{
//删除
m_Grid.DeleteColumn(pItem->iColumn);
m_Grid.Refresh();
}
*/
}
}
void CDlgParaJipei::GetInput()
{
int i,j;
CString str;
//取得数据
for(i = 2; i
{
for(j = 1; j
{
str = m_Grid.GetItemText(i, j);
m_fPassPercent[i-2][j-1] = (float)atof(str);
}
}
//存储使用的列信息
for(j = 1; j
{
str = m_Grid.GetItemText(1, j);
m_nNum[j-1] = atoi(str);
}
//存储筛孔尺寸
for(j = 1; j
{
str = m_Grid.GetItemText(0, j);
str.TrimLeft("*");
m_fHoleSize[j-1] = atof(str);
}
}
BOOL CDlgParaJipei::CheckData()
{
int i,j,n;
CString str, msg;
//列数不够
if((m_nSelectCols[0] + 4)
{
msg.Format("请再选择%d个基准列,双击第一行的单元进行选取!", m_nRows - (m_nSelectCols[0] + 4));
AfxMessageBox(msg);
return FALSE;
}
//列数多
if((m_nSelectCols[0] + 4) > m_nRows)
{
msg.Format("多选择了%d个基准列,双击第一行的单元去掉基准列!", (m_nSelectCols[0] + 4) - m_nRows);
AfxMessageBox(msg);
return FALSE;
}
for(i = 2; i
{
for(j = 1; j
{
str = m_Grid.GetItemText(i, j);
//数据不能为空
if(str.IsEmpty())
{
msg.Format("第%d排、第%d列数据为空!", i-1, j);
AfxMessageBox(msg);
return FALSE;
}
//数据不能包含非法字符 CString strComp = "+0123456789."; for(n = 0; n 1) { msg.Format("第%d排、第%d列数据多于两个小数点!", i-1, j); AfxMessageBox(msg); return FALSE; } //中间有加号 for(n = 1; n
return FALSE;
}
}
}
return TRUE;
}
void CDlgParaJipei::OnOK()
{
// TODO: Add extra validation here
if(!CheckData())
{
m_bCheck = FALSE;
return;
}
m_bCheck = TRUE;
GetInput();
CDialog::OnOK();
}
void CDlgParaJipei::OnButton1()
{
// TODO: Add your control notification handler code here
int i,j;
int num; //列数
CString str;
//测试数据
float m_fTestData[4][13] =
{
100, 100, 100, 100, 98.58, 53.2, 11.4, 2.42, 1.68, 1.56, 0, 0, 0, 100, 100, 100, 100, 99, 82.2, 38.9, 17, 8.73, 6.61, 3.87, 2.69, 1.67, 100, 100, 100, 100, 100, 100, 94, 74.8, 53, 42.8, 24, 6.7, 1.1, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 99.3, 87.2 };
GV_ITEM item;
item.mask = GVIF_TEXT;
//第一列数值
item.col = 1;
item.row = 2;
item.strText = "5";
m_Grid.SetItem(&item);
//存储使用的列信息
for(i = 1; i
{
str = m_Grid.GetItemText(1, i);
num = atoi(str);
item.col = i;
for(j = 2; j
{
item.row = j;
str.Format("%.1f", m_fTestData[j-2][num-1]);
item.strText = str;
m_Grid.SetItem(&item);
}
}
m_Grid.Refresh();
}
void CDlgParaJipei::OnUpdateEditRows()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog() // function to send the EM_SETEVENTMASK message to the control
// with the ENM_UPDATE flag ORed into the lParam mask.
// TODO: Add your control notification handler code here
if (!::IsWindow(m_Grid.m_hWnd)) return;
UpdateData(TRUE);
if(m_nRows
{
m_nRows = 4;
UpdateData(FALSE);
}
else if(m_nRows > 6)
{
m_nRows = 6;
UpdateData(FALSE);
}
m_Grid.SetRowCount(m_nRows+2);
m_Grid.SetRowHeight(m_nRows+1, 25);
int i;
CString str;
GV_ITEM item;
item.mask = GVIF_TEXT;
for(i = 2; i
{
item.col = 0;
item.row = i;
str.Format("%d", i-1);
item.strText = str;
m_Grid.SetItem(&item);
}
}
沥青混合料配合比数据处理系统
1.沥青混合料配合比选择简介
沥青混合料配合比的设计主要是利用马歇尔的试验方法确定沥青混合料的材料品种及配合比、矿料级配、最佳沥青用量。其工艺流程图如下:
沥青混合料配合比设计操作框图
这个软件设计不包括原材料的选定和试验、马歇尔试件的制作。仅仅是针对矿料级配的计算、马歇尔试验以后的步骤。
矿料级配计算主要采用规划求解方法进行。
通过马歇尔试验得出一组数据,然后对数据进行处理,最终得出最佳油石比。 2.人工数据处理过程
2.1矿料级配的计算:列15个方程,求解4个未知数,有不同的结果。
沥青混合料级配设计计算表
2.2本数据处理系统是对马歇尔试验的数据用计算机进行处理,改变以往人工处理效率低,准确性差的特点。
马歇尔试验得出数据汇总如下:
然后将每种试验项目作纵坐标,油石比作横坐标绘制如下表:
1)根据上述的五个曲线图求取相应密度最大值时沥青用量a2、稳定度最大值时沥青用量a1、空隙率范围中值沥青用量a3,求取三者平均值作为最佳沥青用量的初始值OAC1:
OAC1=(a1+a2+a3)/3
2)求出各项指标符合技术要求的沥青用量范围OACMIN—OACmax,其中 OAC2=( OACMIN+OACmax,)/2 3)最佳沥青用量为:
OAC=( OAC1+OAC2)/2 3.计算机数据处理过程
3.1试验参数的输入
3.2马歇尔数据处理
3.3级配设计
4.使用说明
本软件采用VC6.0编写,可在windows环境下运行。
软件采用基于文档的方式来实现,通过处理输入的数据,在文档区显示
数据处理的结果,同时可以通过本地或者网络打印机打印显示的文档。
按数据处理功能来说分为两部分,一部分是沥青混合料最佳用量确定试
验,一部分是沥青混合料集料级配设计试验。
1、 沥青混合料最佳用量确定试验使用说明
1) 打开程序;
2) 点击 菜单——〉参数输入——〉试验参数, 出现参数输入的对话框;
3) 在对话框里分别填写实验信息, 选择道路类型、混凝土类型。然后点击“确定”按钮;
4) 此时 菜单——〉参数输入——〉Mashall参数 激活,点击 菜单——〉参数输入——〉Mashall参数,出现Mashall参数的对话框;
5) 选择试验数据组数(5~8),缺省值为5;然后填入实验数据,如果填错,则会报错。
测试时请选择组数为5,然后点击载入测试数据,则程序自动将一组设定好的数据填入,供测试软件之用。
数据填完则点击“确定”按钮;
6) 点击 菜单——〉结果输出——〉数据分析, 则在文档区出现两页的文档,分别记录着实验信息、试验数据、最佳用量的确定、图表等。
7) 预览:此时可以通过 菜单——〉文件——〉打印预览 观察要
打印的文档。可同时在屏幕中显示一页或两页,也可以放大缩小文档来观看。
8) 打印:可以在预览窗口点击“打印”,也可以通过 菜单——〉文件——〉打印 来完成。(注意:请在打印之前,检查打印机是否装好,或者是否有网络打印机; 打印纸张大小为A4, 方向为纵向,可以在打印设置中检查。)
9) 保存:点击工具栏或者菜单上的“保存”按钮,可以将文档保存下来。
10) 另存为:点击菜单上的“另存为”按钮,可以将文档另保存下来。 11) 打开:点击工具栏或者菜单上的“打开”按钮,可以打开保存过的文档。
2、沥青混合料集料级配设计试验使用说明
1) 打开程序;
2) 点击 菜单——〉参数输入——〉集配设计, 出现级配试验参数输入的对话框;
3) 在对话框中按照筛孔尺寸分别填入4~6种集料的通过百分率,双击表格第一行的单元可以选择或者去除基准列, 然后点击“确定”按钮;也可以通过点击“载入测试数据”来填入测试数据。
4) 点击 菜单——〉结果输出——〉数据分析, 则在文档区出现一页的文档,分别记录试验结果及级配图等信息。
5) 打印、打印预览、保存、另存为、打开同上;
5.下步计划
本软件未设及原材料试验等步骤,下次改进时将进行补充,使软件更加丰富,使用更加方便简洁。
毕业设计论文
沥青混合料配合比数据处理系统
学 生:吴志祥 指导老师:
石家庄铁道学院成教分院 2002级计算机专业
部份代码
MICROSOFT FOUNDATION CLASS LIBRARY : Concrete2
======================================================================== AppWizard has created this Concrete2 application for you. This application not only demonstrates the basics of using the Microsoft Foundation classes but is also a starting point for writing your application.
This file contains a summary of what you will find in each of the files that make up your Concrete2 application.
Concrete2.dsp
This file (the project file) contains information at the project level and is used to build a single project or subproject. Other users can share the project (.dsp) file, but they should export the makefiles locally. Concrete2.h
This is the main header file for the application. It includes other project specific headers (including Resource.h) and declares the
CConcrete2App application class.
Concrete2.cpp
This is the main application source file that contains the application class CConcrete2App.
Concrete2.rc
This is a listing of all of the Microsoft Windows resources that the
program uses. It includes the icons, bitmaps, and cursors that are stored in the RES subdirectory. This file can be directly edited in Microsoft Visual C++.
Concrete2.clw
This file contains information used by ClassWizard to edit existing classes or add new classes. ClassWizard also uses this file to store information needed to create and edit message maps and dialog data maps and to create prototype member functions.
res\Concrete2.ico
This is an icon file, which is used as the application's icon. This icon is included by the main resource file Concrete2.rc.
res\Concrete2.rc2
This file contains resources that are not edited by Microsoft
Visual C++. You should place all resources not editable by
the resource editor in this file.
///////////////////////////////////////////////////////////////////////////// For the main frame window:
MainFrm.h, MainFrm.cpp
These files contain the frame class CMainFrame, which is derived from CFrameWnd and controls all SDI frame features.
res\Toolbar.bmp
This bitmap file is used to create tiled images for the toolbar.
The initial toolbar and status bar are constructed in the CMainFrame class. Edit this toolbar bitmap using the resource editor, and
update the IDR_MAINFRAME TOOLBAR array in Concrete2.rc to add
toolbar buttons.
///////////////////////////////////////////////////////////////////////////// AppWizard creates one document type and one view:
Concrete2Doc.h, Concrete2Doc.cpp - the document
These files contain your CConcrete2Doc class. Edit these files to
add your special document data and to implement file saving and loading (via CConcrete2Doc::Serialize).
Concrete2View.h, Concrete2View.cpp - the view of the document
These files contain your CConcrete2View class.
CConcrete2View objects are used to view CConcrete2Doc objects.
///////////////////////////////////////////////////////////////////////////// Other standard files:
StdAfx.h, StdAfx.cpp
These files are used to build a precompiled header (PCH) file
named Concrete2.pch and a precompiled types file named StdAfx.obj.
Resource.h
This is the standard header file, which defines new resource IDs.
Microsoft Visual C++ reads and updates this file.
///////////////////////////////////////////////////////////////////////////// Other notes:
AppWizard uses "TODO:" to indicate parts of the source code you
should add to or customize.
If your application uses MFC in a shared DLL, and your application is
in a language other than the operating system's current language, you
will need to copy the corresponding localized resources MFC42XXX.DLL
from the Microsoft Visual C++ CD-ROM onto the system or system32 directory, and rename it to be MFCLOC.DLL. ("XXX" stands for the language abbreviation. For example, MFC42DEU.DLL contains resources translated to German.) If you don't do this, some of the UI elements of your application will remain in the language of the operating system.
///////////////////////////////////////////////////////////////////////////// DlgparaJipei(cpp)
// DlgParaJipei.cpp : implementation file
//
#include "stdafx.h"
#include "concrete2.h"
#include "DlgParaJipei.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
///////////////////////////////////////////////////////////////////////////// // CDlgParaJipei dialog
CDlgParaJipei::CDlgParaJipei(CWnd* pParent /*=NULL*/)
: CDialog(CDlgParaJipei::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlgParaJipei)
m_bCheck = FALSE;
m_nRows = 4;
//}}AFX_DATA_INIT
}
void CDlgParaJipei::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgParaJipei)
DDX_Control(pDX, IDC_SPIN_ROW, m_SpinRow);
DDX_GridControl(pDX, IDC_GRID1, m_Grid);
DDX_Text(pDX, IDC_EDIT_ROWS, m_nRows);
DDV_MinMaxInt(pDX, m_nRows, 4, 6);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDlgParaJipei, CDialog)
//{{AFX_MSG_MAP(CDlgParaJipei)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_EN_UPDATE(IDC_EDIT_ROWS, OnUpdateEditRows)
//}}AFX_MSG_MAP
ON_NOTIFY(NM_DBLCLK, IDC_GRID1, OnGridDblClick)
END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////// // CDlgParaJipei message handlers
BOOL CDlgParaJipei::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
int i;
CString str;
m_SpinRow.SetRange(4,6);
m_Grid.SetRowCount(6);
m_Grid.SetColumnCount(14);
m_Grid.SetFixedRowCount(2);
m_Grid.SetFixedColumnCount(1);
m_Grid.SetEditable(TRUE);
//设置选择列的参数
m_nSelectCols[0] = 0; //个数
m_nSelectCols[1] = -1; //列
m_nSelectCols[2] = -1; //列
m_Grid.SetColumnWidth(0, 70);
for(i = 0; i
{
m_Grid.SetRowHeight(i, 25); } for( i = 1; i
m_Grid.SetItem(&item);
item.col = 9;
item.strText = "1.18";
m_Grid.SetItem(&item);
item.col = 10;
item.strText = "0.6";
m_Grid.SetItem(&item);
item.col = 11;
item.strText = "0.3";
m_Grid.SetItem(&item);
item.col = 12;
item.strText = "0.15";
m_Grid.SetItem(&item);
item.col = 13;
item.strText = "*0.075";
m_Grid.SetItem(&item);
//设置第二排的单位
item.row = 1;
item.col = 0;
item.strText = "序号";
m_Grid.SetItem(&item);
for(i = 1; i
{
item.col = i;
str.Format("%d", i);
item.strText = str;
m_Grid.SetItem(&item);
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CDlgParaJipei::OnGridDblClick(NMHDR *pNotifyStruct, LRESULT *)
{
NM_GRIDVIEW* pItem = (NM_GRIDVIEW*) pNotifyStruct;
CString strTemp;
int i;
if(pItem->iRow == 0)
{
BOOL CoreCol;//特殊列
i = pItem->iColumn;
CoreCol = (i == 7) || (i == 8) || (i == 13);
//特殊列
if(CoreCol)
{
AfxMessageBox("不能改动原定基准列");
return;
}
//前4列
else if(pItem->iColumn
{
AfxMessageBox("不能选择前4列作为基准列");
return;
}
//选择的不是基准列
else if(pItem->iColumn != m_nSelectCols[1] && pItem->iColumn != m_nSelectCols[2])
{
//列数已经够了
if((m_nSelectCols[0] + 4) == m_nRows)
{
AfxMessageBox("选择的列数已经达到要求");
return;
}
//还不够
else if((m_nSelectCols[0] + 4)
{
//纪录
m_nSelectCols[0] ++;
m_nSelectCols[m_nSelectCols[0]] = pItem->iColumn;
//显示
strTemp = m_Grid.GetItemText(0, pItem->iColumn);
strTemp = "*" + strTemp;
m_Grid.SetItemText(0, pItem->iColumn, strTemp);
m_Grid.Refresh();
return;
}
}
//选择的是基准列
else if(pItem->iColumn == m_nSelectCols[1] || pItem->iColumn m_nSelectCols[2])
{
//纪录
m_nSelectCols[0] --;
if(pItem->iColumn == m_nSelectCols[1])
{
m_nSelectCols[1] = -1;
}
else
{
m_nSelectCols[2] = -1;
} ==
//显示
strTemp = m_Grid.GetItemText(0, pItem->iColumn);
strTemp.TrimLeft("*");
m_Grid.SetItemText(0, pItem->iColumn, strTemp);
m_Grid.Refresh();
return;
}
/* //删除信息
strTemp = "确实要删除第" + m_Grid.GetItemText(1, pItem->iColumn) + "列"; int i;
BOOL CoreCol;//特殊列
i = atoi(m_Grid.GetItemText(1, pItem->iColumn));
CoreCol = (i == 7) || (i == 8) || (i == 13);
//特殊列
if(CoreCol)
{
AfxMessageBox("不能删除特殊列");
}
//小于8列
else if(m_Grid.GetColumnCount()
{
AfxMessageBox("不能再删除列了!");
}
else if(AfxMessageBox(strTemp, MB_OKCANCEL) == IDOK)
{
//删除
m_Grid.DeleteColumn(pItem->iColumn);
m_Grid.Refresh();
}
*/
}
}
void CDlgParaJipei::GetInput()
{
int i,j;
CString str;
//取得数据
for(i = 2; i
{
for(j = 1; j
{
str = m_Grid.GetItemText(i, j);
m_fPassPercent[i-2][j-1] = (float)atof(str);
}
}
//存储使用的列信息
for(j = 1; j
{
str = m_Grid.GetItemText(1, j);
m_nNum[j-1] = atoi(str);
}
//存储筛孔尺寸
for(j = 1; j
{
str = m_Grid.GetItemText(0, j);
str.TrimLeft("*");
m_fHoleSize[j-1] = atof(str);
}
}
BOOL CDlgParaJipei::CheckData()
{
int i,j,n;
CString str, msg;
//列数不够
if((m_nSelectCols[0] + 4)
{
msg.Format("请再选择%d个基准列,双击第一行的单元进行选取!", m_nRows - (m_nSelectCols[0] + 4));
AfxMessageBox(msg);
return FALSE;
}
//列数多
if((m_nSelectCols[0] + 4) > m_nRows)
{
msg.Format("多选择了%d个基准列,双击第一行的单元去掉基准列!", (m_nSelectCols[0] + 4) - m_nRows);
AfxMessageBox(msg);
return FALSE;
}
for(i = 2; i
{
for(j = 1; j
{
str = m_Grid.GetItemText(i, j);
//数据不能为空
if(str.IsEmpty())
{
msg.Format("第%d排、第%d列数据为空!", i-1, j);
AfxMessageBox(msg);
return FALSE;
}
//数据不能包含非法字符 CString strComp = "+0123456789."; for(n = 0; n 1) { msg.Format("第%d排、第%d列数据多于两个小数点!", i-1, j); AfxMessageBox(msg); return FALSE; } //中间有加号 for(n = 1; n
return FALSE;
}
}
}
return TRUE;
}
void CDlgParaJipei::OnOK()
{
// TODO: Add extra validation here
if(!CheckData())
{
m_bCheck = FALSE;
return;
}
m_bCheck = TRUE;
GetInput();
CDialog::OnOK();
}
void CDlgParaJipei::OnButton1()
{
// TODO: Add your control notification handler code here
int i,j;
int num; //列数
CString str;
//测试数据
float m_fTestData[4][13] =
{
100, 100, 100, 100, 98.58, 53.2, 11.4, 2.42, 1.68, 1.56, 0, 0, 0, 100, 100, 100, 100, 99, 82.2, 38.9, 17, 8.73, 6.61, 3.87, 2.69, 1.67, 100, 100, 100, 100, 100, 100, 94, 74.8, 53, 42.8, 24, 6.7, 1.1, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 99.3, 87.2 };
GV_ITEM item;
item.mask = GVIF_TEXT;
//第一列数值
item.col = 1;
item.row = 2;
item.strText = "5";
m_Grid.SetItem(&item);
//存储使用的列信息
for(i = 1; i
{
str = m_Grid.GetItemText(1, i);
num = atoi(str);
item.col = i;
for(j = 2; j
{
item.row = j;
str.Format("%.1f", m_fTestData[j-2][num-1]);
item.strText = str;
m_Grid.SetItem(&item);
}
}
m_Grid.Refresh();
}
void CDlgParaJipei::OnUpdateEditRows()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog() // function to send the EM_SETEVENTMASK message to the control
// with the ENM_UPDATE flag ORed into the lParam mask.
// TODO: Add your control notification handler code here
if (!::IsWindow(m_Grid.m_hWnd)) return;
UpdateData(TRUE);
if(m_nRows
{
m_nRows = 4;
UpdateData(FALSE);
}
else if(m_nRows > 6)
{
m_nRows = 6;
UpdateData(FALSE);
}
m_Grid.SetRowCount(m_nRows+2);
m_Grid.SetRowHeight(m_nRows+1, 25);
int i;
CString str;
GV_ITEM item;
item.mask = GVIF_TEXT;
for(i = 2; i
{
item.col = 0;
item.row = i;
str.Format("%d", i-1);
item.strText = str;
m_Grid.SetItem(&item);
}
}