BCG使用的经验总结
一、怎样生成一个BCG的树形列表
首先,在需要生成BCG树形列表的界面所在的“.H”文件中加入下面这句话:CBCGPGridCtrl * m_zbxn;
其次,在对应的“.CPP”文件中加入下面的这句话:
将m_zbxn = NULL;这是初始化,必须的,防止野指针的出现。
二、将界面嵌入到当前的DLG窗口的方法
三、需要加入“行选择变化消息响应函数”
在对应的“.H”文件中加入下列标黑的代码
在对应的“.CPP”代码中加入下列标黑的代码
其中的BLJD_ZBXN,为create语句中的最后一个参数,必须保持一致,同时要在H或CPP文件中用#define BLJD_ZBXN 1002,定义一下这个宏,这才能保证嵌入的正确性。
/************************************************************************/ /* 菜单调用函数
*/ /************************************************************************/ UINT CPlugBLJD::GetMenu(CMenu * menu, UINT ChildID, char * MenuName) { HMODULE hDLL=GetModuleHandle(_T(PLUG_BLJD_NAME)); HINSTANCE hexe=AfxGetResourceHandle(); AfxSetResourceHandle((HINSTANCE)hDLL);
UINT uResID = ChildID; menu->LoadMenu(IDR_BLJD); int iMenuCnt = menu->GetMenuItemCount(); for(int i=0; i
char str[255]={0};
UINT id = 0;
id = menu->GetMenuItemID(i);
//-
//如果id=0,就判断为分割线
//-
if(id != 0)
{
if(id>1000000)
{
CMenu * pSubMenu = menu->GetSubMenu(i);
int iSubMenuCnt = pSubMenu->GetMenuItemCount();
for(int n=0; n
{
id = pSubMenu->GetMenuItemID(n);
if(id!=0)
{
pSubMenu->GetMenuString(id, str, 255, MF_BYCOMMAND);
m_uRes = ChildID;
pSubMenu->ModifyMenu(id, MF_BYCOMMAND, uResID, str);
uResID++;
}
}
}
else
{
menu->GetMenuString(id, str, 255, MF_BYCOMMAND);
m_uRes = ChildID;
menu->ModifyMenu(id, MF_BYCOMMAND, uResID, str);
uResID++;
}
} } memcpy(MenuName, \"兵力机动(&D)\", 12); AfxSetResourceHandle(hexe); return uResID; } 附录:
需要注意的事情:在COPY代码的时候,一定要注意,最好将原来的代码重新动手打一下。
/************************************************************************/ /* 取下一个装备内码 (当期最大的加一)
/************************************************************************/ BOOL CZbxn::GetNextFACode(CString& maxCode) { CADORecordset adoRecordSet(CBLJDProject::m_adoConn);
CString strSQL; COleDateTime currentTime = COleDateTime::GetCurrentTime(); strSQL.Format(\"select max(ZBNM) as ZBNM from BLJD_JCSJ_ZBXN where ZBNM like \'ZB%d%s\'\",
currentTime.GetYear(), \"%\");
if ( ! adoRecordSet.Open(strSQL, CADORecordset.openQuery) ) {
return FALSE; }
CString strMaxCode; adoRecordSet.GetFieldValue(\"ZBNM\", strMaxCode); if (strMaxCode.GetLength()) {
maxCode.Format(\"ZB%d%04d\", currentTime.GetYear(), atoi(strMaxCode.Mid(6))+1); } else {
maxCode.Format(\"ZB%d%04d\", currentTime.GetYear(), 1); }
adoRecordSet.Close(); return TRUE;
}
/************************************************************************/ /* BCG树形控件初始化,同时加载相应的列值
*/ /************************************************************************/ void CZbxn::ONINT() { int nIndex = 0; m_zbxn->InsertColumn(nIndex, \"名称\", 75); m_zbxn->SetHeaderAlign(nIndex, HDF_CENTER);
nIndex++; m_zbxn->SetHeaderAlign(nIndex, HDF_CENTER); m_zbxn->SetColumnAlign(nIndex, HDF_RIGHT); m_zbxn->SetColumnVisible(nIndex, FALSE);
nIndex++; m_zbxn->InsertColumn(nIndex, \"速度\", 75); m_zbxn->SetHeaderAlign(nIndex, HDF_CENTER); m_zbxn->InsertColumn(nIndex, \"桥梁最小宽度\", 75); m_zbxn->SetHeaderAlign(nIndex, HDF_CENTER); m_zbxn->SetColumnVisible(nIndex, FALSE);
nIndex++; m_zbxn->InsertColumn(nIndex, \"最小转弯半径\", 75); m_zbxn->SetHeaderAlign(nIndex, HDF_CENTER); m_zbxn->SetColumnVisible(nIndex, FALSE);
nIndex++; m_zbxn->InsertColumn(nIndex, \"内码\", 75); m_zbxn->SetHeaderAlign(nIndex, HDF_CENTER); m_zbxn->SetColumnVisible(nIndex, FALSE);
nIndex++; m_zbxn->AdjustLayout();
/********************************************************************** /* 调整树形控件的颜色
CBCGPGridColors colors; colors.m_LeftOffsetColors.m_clrBackground = globalData.clrWindow;
m_zbxn->SetColorTheme (colors); }
//从数据库中查询相应的值,并且以无根节点的形式显示,关键代码为标红的部分
CADORecordset * m_adoRS; strSQL.Format(\"select MC, XH, ZZXL, XZXL, ZDPD, JDSD, HYL, CD, XDJJ, DLZXKD,\\
QLZDCZ, QLZXKD, ZXZWBJ, HDZDCZ, SDZXKD, SDZDGD, ZBNM from BLJD_JCSJ_ZBXN\"); m_adoRS = new CADORecordset(CBLJDProject::m_adoConn);
if (!m_adoRS->Open(strSQL,CADORecordset.openQuery)) {
return FALSE; } int nCount = m_adoRS->GetRecordCount(); if (!m_adoRS->IsBOF())
{
//将数据库中的装备名称插入到列表中
while (! m_adoRS->IsEOF()) { CBCGPGridRow *pRow = m_zbxn->CreateRow(m_zbxn->GetColumnCount());
ASSERT_VALID (pRow); m_adoRS->GetFieldValue(\"MC\",strMC);
//装备名称
m_adoRS->GetFieldValue(\"XH\",strXH);
//序号 m_adoRS->GetFieldValue(\"ZZXL\", strZZXL); //装载效率 m_adoRS->GetFieldValue(\"XZXL\", strXZXL); //卸载效率 m_adoRS->GetFieldValue(\"ZDPD\", strZDPD); //最大坡度 m_adoRS->GetFieldValue(\"JDSD\", strJDSD); //机动速度 m_adoRS->GetFieldValue(\"HYL\", strHYL); //耗油量 m_adoRS->GetFieldValue(\"CD\", strCD); //长度 m_adoRS->GetFieldValue(\"XDJJ\", strXDJJ); //行动间距
m_adoRS->GetFieldValue(\"DLZXKD\", strDLZXKD);//道路最小宽度 m_adoRS->GetFieldValue(\"QLZDCZ\", strQLZDCZ);//桥梁最大承重
m_adoRS->GetFieldValue(\"QLZXKD\", strQLZXKD);//桥梁最小宽度 m_adoRS->GetFieldValue(\"ZXZWBJ\", strZXZWBJ);//最下转弯半径 m_adoRS->GetFieldValue(\"HDZDCZ\", strHDZDCZ);//涵洞最大承重 m_adoRS->GetFieldValue(\"SDZXKD\", strSDZXKD);//隧道最小宽度 m_adoRS->GetFieldValue(\"SDZDGD\", strSDZDGD);//隧道最大高度 m_adoRS->GetFieldValue(\"ZBNM\",strZBNM); pRow->GetItem(0)->SetValue((LPCTSTR)strMC); pRow->GetItem(1)->SetValue((LPCTSTR)strXH); pRow->GetItem(2)->SetValue(strZZXL); pRow->GetItem(3)->SetValue(strXZXL); pRow->GetItem(4)->SetValue(strZDPD); pRow->GetItem(5)->SetValue(strJDSD); pRow->GetItem(6)->SetValue(strHYL); pRow->GetItem(7)->SetValue(strCD); pRow->GetItem(8)->SetValue(strXDJJ); pRow->GetItem(9)->SetValue(strDLZXKD); pRow->GetItem(10)->SetValue(strQLZDCZ); pRow->GetItem(11)->SetValue(strQLZXKD); pRow->GetItem(12)->SetValue(strZXZWBJ); pRow->GetItem(13)->SetValue(strHDZDCZ); pRow->GetItem(14)->SetValue(strSDZXKD); pRow->GetItem(15)->SetValue(strSDZDGD); pRow->GetItem(16)->SetValue((LPCTSTR)strZBNM);
pRow->AllowSubItems(); m_zbxn->AddRow(pRow,FALSE);
m_adoRS->MoveNext();
} }
将数据从列表树总移除出去的代码如下:
m_zbxn->RemoveRow(row->GetRowId());//将数据从列表树中移除出去
/************************************************************************/ /* 数字类型检查
*/ /************************************************************************/ BOOL CZbxn::IsNumber(LPCTSTR lpsCaption, CEdit* edt) { ASSERT(edt);
CString strData; // 读取控件中的数据
edt->GetWindowText(strData);
// 只允许输数据
int nStringLength = strData.GetLength(); int nDotCount = 0; // 点字符不能多于1个
for ( int nIndex = 0; nIndex
if ( strData.GetAt(nIndex) == \'.\' )
{
nDotCount++;
if ( nDotCount > 1 )
{
CString csTmp;
csTmp = strData.Left( nIndex );
csTmp += strData.Right( strData.GetLength()1 );
edt->SetWindowText( csTmp );
return FALSE;
}
} }
// 不允许输入数字和点以外的字符
for ( int nnIndex = 0; nnIndex
if ( strData[ nnIndex ] != \'.\' && ( strData[ nnIndex ] > \'9\' || strData[ nnIndex ]
{
strData = strData.Left( nnIndex ) + strData.Right( strData.GetLength()1 );
MeageBox(\"数据类型不匹配\", lpsCaption, MB_ICONERROR);
edt->SetWindowText(_T(\"\"));
edt->SetFocus();
return FALSE;
} } return TRUE; }
要使用BCG界面首先要在初始化中加入这样一句话: m_LXPG = new CBCGPGridCtrl(); 其中m_LXPG 为CBCGPGridCtrl类型的控制型变量