经过一个礼拜的捣鼓还是用MFC做出来一个界面,说实话这个时间有点长了,因为没有系统的学习所以造成中间操作的时候因为某些问题而急躁了,所以我要告诫后来者程序员切记急躁,急躁解决不了问题反而是自己的自信心一个劲儿的下滑,遇到问题我们只有勇敢面对静心去找解决的办法才能走出困境。自己的一点感悟,有则改之,无则加勉。
下边我写一些做的过程中遇到的一些不好解决的问题,C++的语法那些东西就不写了
首先建立工程
我建立了一个基本对话框,结束后是这样的
将那些不用的按钮删掉,或者换成自己需要的按钮或者对话框
下边就开始代码的部分了,首先做的是将需要定义的变量先加到Cstudent_scoreDlg这个类里,中间的student_score是我的工程名
public:
CStudent_scoreDlg(CWnd* pParent = NULL);
// standard constructor
OCIEnv *env; //环境句柄
OCIServer *ser; //服务句柄
OCIError * err; //错误句柄
OCISession * user; //用户句柄
OCISvcCtx * svc; //服务上下文句柄
OCIStmt *stmt;//句子句柄
OCIBind * bpa[5];
OCIDefine * para[5];
char sql[255];
ub4 num;//统计数据库的总条数
CString name;
我是用OCI连数据库的,要用到这些句柄,就都一并写到这里了
接下来我就说一下按钮、Edit Box、Static Box、List Box的使用
先说按钮,这个简单,将按钮控件拖到对话框后点击右键选择属性进行修改按钮的名字
效果图:
完成之后将窗口关闭再在你要操作的按钮上点击右键选择Classwizard
点击Messages下的第一个,这个表示单击的操作,然后点右边的Add Function进行添加功能函数,先给函数命名,然后点击Edit Code进行代码编辑
Static Box也简单,直接拖过来重新命名一下就好了
Edit Box有点小复杂,添加了编辑框后每一个编辑框都对应一个变量,这些变量用来接受来自编辑框输入的数据,操作和按钮大同小异,点击编辑框——右键,对编辑框的标识进行修改,当然也可以不改,只是为了自己方便寻找
关闭窗口,再点击编辑框——右键,弹出的窗口选择成员变量
然后添加变量,变量名和类型根据自己需要进行选择和命名,我操作的这个编辑框是要输入名字的,所以我将其类型定义为CString,变量名为m_name1,对所有的输入编辑框都执行着样的操作
接下来就是对编辑框里的数据进行操作,我在这里的操作是将编辑框中的内容添加到数据库中,所以我对添加按钮添加功能操作如下
void CStudent_scoreDlg::OnAdd()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
GetDlgItemText(IDC_NAME1,m_name1);
m_en1=GetDlgItemInt(IDC_EN1);
m_ma1=GetDlgItemInt(IDC_MA1);
m_ph1=GetDlgItemInt(IDC_PH1);
m_ch1=GetDlgItemInt(IDC_CH1);
sprintf(sql,"insert into stu_score values('%s',%d,%d,%d,%d)",m_name1,m_en1,m_ma1,m_ph1,m_ch1);
OCIBindByPos(stmt,&bpa[0],err,1, (dvoid *)&st2.StudentName, sizeof(st2.StudentName),SQLT_CHR, (dvoid *) 0, (ub2 *)0,(ub2 *)0,(ub4) 0, (ub4 *) 0,OCI_DEFAULT);
OCIBindByPos(stmt,&bpa[1],err,2, (dvoid *)&st2.En_score, sizeof(int),SQLT_INT, (dvoid *) 0, (ub2 *)0,(ub2 *)0,(ub4) 0, (ub4 *) 0,OCI_DEFAULT);
OCIBindByPos(stmt,&bpa[2],err,3, (dvoid *)&st2.Ma_score, sizeof(int),SQLT_INT, (dvoid *) 0, (ub2 *)0,(ub2 *)0,(ub4) 0, (ub4 *) 0,OCI_DEFAULT);
OCIBindByPos(stmt,&bpa[3],err,4, (dvoid *)&st2.Ph_score, sizeof(int),SQLT_INT, (dvoid *) 0, (ub2 *)0,(ub2 *)0,(ub4) 0, (ub4 *) 0,OCI_DEFAULT);
OCIBindByPos(stmt,&bpa[4],err,5, (dvoid *)&st2.Ch_score, sizeof(int),SQLT_INT, (dvoid *) 0, (ub2 *)0,(ub2 *)0,(ub4) 0, (ub4 *) 0,OCI_DEFAULT);
//OCIBindByPos(stmt,&bpa[5],err,6, (dvoid *)&st2.id, sizeof(int),SQLT_INT, (dvoid *) 0, (ub2 *)0,(ub2 *)0,(ub4) 0, (ub4 *) 0,OCI_DEFAULT);
execution(sql);
sprintf(sql,"%s","commit");
execution(sql);
}
这里有几个函数需要说明一下,UpdateData(TRUE)此函数是用来刷新编辑框的数据
GetDlgItemText(IDC_NAME1,m_name1);对编辑框的字符串进行操作,将其赋到m_name1中
m_en1=GetDlgItemInt(IDC_EN1);这句是对编辑框中的数据操作,从函数的名字也可以看出来,也就是将编辑框输入的数据赋给其刚才定义的变量m_en1.
后边的操作是将这些数据放到数据库中,也就是我添加的按钮的操作。
接下来是list box,这个操作起来倒是有点不容易,首先把表头的名称写出来,这个是在初始化函数BOOL CStudent_scoreDlg::OnInitDialog()里操作的,添加如下代码:
SetIcon(m_hIcon, TRUE);
// Set big icon
SetIcon(m_hIcon, FALSE);
// Set small icon
LONG lStyle;
lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口style
lStyle &= ~LVS_TYPEMASK; //清除显示方式位
lStyle |= LVS_REPORT; //设置style
SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置style
DWORD dwStyle = m_list.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)
dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
m_list.SetExtendedStyle(dwStyle); //设置扩展风格
m_list.InsertColumn(0,_T(" "));
m_list.InsertColumn(1,_T("姓名"));
m_list.InsertColumn(2,_T("英语"));
m_list.InsertColumn(3,_T("数学"));
m_list.InsertColumn(4,_T("物理"));
m_list.InsertColumn(5,_T("化学"));
for(int j=0;j<6;j++)
m_list.SetColumnWidth(j ,84); //改变每一列宽度
效果图:
这样的一个表格样的框如何进行操作呢,首先是将各项数据显示在表格中,整个List Box也需要定义一个变量m_list,显示部分:
int i=1;
char ch1[5];
char ch2[5];
char ch3[5];
char ch4[5];
do
{
_itoa(st1.En_score,ch1,10);
_itoa(st1.En_score,ch2,10);
_itoa(st1.En_score,ch3,10);
_itoa(st1.En_score,ch4,10);
int nIndex=m_list.InsertItem(i,"");// 插入行
m_list.SetItemText(nIndex,1,st1.StudentName);
m_list.SetItemText(nIndex,2,ch1);
m_list.SetItemText(nIndex,3,ch2);
m_list.SetItemText(nIndex,4,ch3);
m_list.SetItemText(nIndex,5,ch4);
i++;
}
while(OCIStmtFetch(stmt, err, 1, OCI_FETCH_NEXT, OCI_DEFAULT) != OCI_NO_DATA);
SetItemText此函数是向表格中输出数据,但是都是以字符串的形式输出的,所以要将数据进行转换,使用_itoa
int nIndex=m_list.InsertItem(i,"");这条语句很关键,它的作用似乎是申请要写入的行,返回来的值就是申请到的行,申请之后就占用了一列,此列为第0列,接下来就用SetItemText输出后边的列
获取列的内容和状态:
我们要达到的效果就是点击一列要有反应,然后对这一列进行操作
if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED)
{
name=m_list.GetItemText(i,1);
m_list.DeleteItem(i);
sprintf(sql,"delete from stu_score where 姓名='%s'",name);
execution(sql);
}
这段代码的意思就是如果点击了一行,此行的状态就为已选择,这里的i我们就可以进行使用
m_list.GetItemText(i,1)这个函数是提取行内信息,这里提取的是选中的行,第1列的内容,注意列是从0开始的。
m_list.DeleteItem(i);此函数的作用是删除选中的行,注意这只是从表中删除,只是表面上的删除,要从数据库中删除还需要下边的那几句,到此为止就是我学习MFC的一些心得。