随笔-145  评论-173  文章-70  trackbacks-0

发现的一个道理是:
不仅仅是控件可以和值相关联,而且可以建立控件和一个类的关联。
具体来说就是,如果控件和一个值相关联,比如和CString类型的值,或者int,或者float等等,那么就会相应的将控件的内容转化成对应的类型。
但是,如果将控件和类类型关联,就是一种映射,此时,这个关联的名字,就是这个控件的别名,而且,由于对应的控件,所以会有相应的类函数。比如是CEdit类型的控件,对应的就是CEdit类型的变量,此时,就会有相应的方法。而如果是对应的基本类型,比如CString,int,则不会有这个类型的函数可以提供操作。
于是,更多的,就是使用这个别名的类型,因为对于一个类类型的变量,是可以调用相应的很多的方法的,从而利用提供的API函数,完成更多的功能。
不懂的内容可以查MSDN,特别是对于CEdit类型,有很多提供的API可以供查询。
贴代码:

void CTest16Dlg::OnCopy() 
{
 
// TODO: Add your control notification handler code here
 m_edit1.SetSel(0,-1);
 m_edit1.Copy();
 m_edit2.SetSel(
0,-1);
 m_edit2.ReplaceSel(
"");
 m_edit2.Paste();
}


void CTest16Dlg::OnCut() 
{
 
// TODO: Add your control notification handler code here
 m_edit1.SetSel(0,-1);
 m_edit1.Copy();
 m_edit1.ReplaceSel(
"");
 m_edit2.SetSel(
0,-1);
 m_edit2.ReplaceSel(
"");
 m_edit2.Paste();
}


void CTest16Dlg::OnExit() 
{
 
// TODO: Add your control notification handler code here
 CDialog::OnCancel();
}


void CTest16Dlg::OnClear() 
{
 
// TODO: Add your control notification handler code here
 m_edit1.SetSel(0,-1);
 m_edit1.ReplaceSel(
"");
 m_edit2.SetSel(
0,-1);
 m_edit2.ReplaceSel(
"");
}


void CTest16Dlg::OnUndo() 
{
 
// TODO: Add your control notification handler code here
 m_edit1.Undo();
 m_edit2.Undo();
}


主要的几个函数就是如上,关键的要理解控件的关联。。。

第二个就是ListBox地址控件的操作:

void CTest18Dlg::OnAdd() 
{
    
// TODO: Add your control notification handler code here
    int index,test;
    UpdateData(TRUE);    
//将控件的内容写入变量中
    test = m_ListBox.FindStringExact(-1,m_name);    //查找是否有和m_name同名的项
    if(test != LB_ERR)    //含有同名的,返回值test为索引值,否则为LB_ERR
        return ;    //此处返回的如果不是LB_ERR,那么就含有同名的,添加失败,直接返回
    index = m_ListBox.AddString(m_name);
    m_ListBox.SetItemData(index,m_id);    
//将相应的索引值和一个id绑定关联
    UpdateData(FALSE);    //变量的内容写入控件    
    GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);    //使删除键可以用
}


void CTest18Dlg::OnDelete() 
{
    
// TODO: Add your control notification handler code here
    int index;
    index 
= m_ListBox.GetCurSel(); //获得当前的索引项
    m_ListBox.DeleteString(index); //删除这个索引项
    index = m_ListBox.GetCurSel();
    
if(index == LB_ERR)    //如果为空,则使得删除键不可用
        GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);
}


void CTest18Dlg::OnExit() 
{
    
// TODO: Add your control notification handler code here
    CDialog::OnCancel();
}
    



void CTest18Dlg::OnSelchangeList() //响应鼠标选择ListBox控件的动作,
                                
//具体来说就是当选择了某一项的时候,在姓名和对于的对话框中显示信息,对于的姓名和id。
{
    
// TODO: Add your control notification handler code here
    int nIndex = m_ListBox.GetCurSel();
    m_ListBox.GetText(nIndex,m_name);
    m_id 
= m_ListBox.GetItemData(nIndex);
    UpdateData(FALSE);
}

功能就是:
一个是使用ListBox,通过添加姓名和学号来向表项中添加姓名,同时,对于一个对应的姓名,当选择的时候,显示对应的ID和姓名。
实现ListBox和右边的编辑框的同步。

最后一个就是IP控件的使用:
void CTest17Dlg::OnButton1() 
{
    
// TODO: Add your control notification handler code here
    BYTE nField0;
    BYTE nField1;
    BYTE nField2;
    BYTE nField3;
    CString show_IP;
    
int num;
    
if(m_IPCtrl.IsBlank())
        MessageBox(
"请输入IP地址");
    
else{
        num 
= m_IPCtrl.GetAddress(nField0,nField1,nField2,nField3);
        
if(num == 4){
            show_IP.Format(
"%d.%d.%d.%d.",nField0,nField1,nField2,nField3);
            MessageBox(show_IP);
        }

        
else{
            MessageBox(
"请输入完整的IP地址!");
        }

    }

}


void CTest17Dlg::OnButton2() 
{
    
// TODO: Add your control notification handler code here
    CDialog::OnCancel();
}

其实控件的使用,API的查询,很大程度上都是需要自己去摸索的,于是,很多时候不是什么记忆,而是练习才是最重要的。
这里写下来这些,一则是为了熟悉,二则是为了怕以后忘记而写下点体会。虽然很浅陋,不过作为学习过程的体会,还是多多益善啊!




阅读MFC程序的几点体会:

首先,切换到类属性图中,看看有那些成员,此时特别要注意的就是没有见过的成员,因为这个很可能就是用户添加的,进入到这些函数,就可以弄清楚他们的具体作用。
其次,看看里面有哪些成员,就是以m_开头的成员变量,因为它们很可能就是用户添加的标志位,或者是为控件捆绑的变量名,要么是值捆绑(value),要么是控制捆绑(control)
此时如果相确认,就要到ClassWizard中查看。
至于具体的函数,则可以查询API,不要看程序很多,实际的代码,用户添加的代码,不是很多的。。。。


posted on 2010-02-06 18:18 deercoder 阅读(587) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理