某某茶叶有限公司欢迎您!
金沙棋牌在线 > 金沙棋牌在线 > VC/MFC如何自动更新用户界面对象

VC/MFC如何自动更新用户界面对象

时间:2019-12-25 09:06

通情况菜单项工具栏按钮具状态例菜单项前文用则变灰选或取消选菜单项工具栏按钮用其禁用;否则选程序条件更改谁更新些项状态逻辑菜单项由某象处理命令让文档更新菜单项合情理文档能包含更新所依据信息命令具用户界面象则两者都传送同处理函数封装单位置所等效用户界面象用户界面更新代码框架提供用于自更新用户界面象便利接口您选择其式进行更新框架提供接口效率高且容易使用列主题解释何使用更新处理程序:调用更新处理程序机ON_UPDATE_COMMAND_UI宏CCmdUI类使用例://文件MainFrm.h添加:#include"afxwin.h"//函数名OnUpdateAudioState自定义要注意与面消息映射致afx_msgvoidOnUpdateAudioState(CCmdUI*pCmdUI);//源文件ManiFrm.cpp添加://添加位置BEGIN_MESSAGE_MAP与END_MESSAGE_MAP()间:BEGIN_MESSAGE_MAP(CMainFrame,CCaptionBarMainFrame)//参数二与前面函数名致:OnUpdateAudioStateON_UPDATE_COMMAND_UI(IDC_TOOL_AUDIO,OnUpdateAudioState)END_MESSAGE_MAP()同源文件ManiFrm.cpp实现函数voidCMainFrame::OnUpdateAudioState(CCmdUI*pCmdUI){if(ToolAvailable())}该处理程序调用访问菜单项象Enable员函数Enable使菜单项用

图片 1

 

数据库:

       一个程序的最基本功能有输入、查询、修改、删除、保存、打印,均与数据库有关。而对数据库的基本操作使用最频繁,以Access 为例:

1、用程序创建Access 数据库文件:

手工创建数据文件的方法大家并不陌生,如果用程序创建有时候也需要,下面就是其中一种方法,可以使用ADOX::CatalogPtr来创建mdb文件。用下面“配置设置文件”文件方法设置数据库的参数,配置数据文件的名称、密码、ID和路径,在有安装程序的情况下需要它。

ADOX的建库,它是在没有数据库文件的情况下,用ADOX的目录指针CatalogPtr来创建ACCESS数据库文件,如下:

BOOLCRecord::UseADOXCatalogPtrCreatAccessDB()

{

       CString str=DBPath + DBName;         //数据库的路径和名称

       CString strPassword=DBPasswd;         //数据库的密码

       CStringstrcnn=_T("Provider=Microsoft.JET.OLEDB.4.0;Data source ="+str+";

              Jet OLEDB:DatabasePassword="+strPassword); //数据库的字串

             

       //使用ADOX::CatalogPtr来创建mdb文件:

       HRESULT hr = S_OK;

       hr=::CoInitialize(NULL);

       if(SUCCEEDED(hr))

       {

              HRESULT hr = S_OK;

              try

              {

                     ADOX::_CatalogPtrm_pCatalog = NULL;

                     hr=m_pCatalog.CreateInstance(__uuidof(ADOX::Catalog));

                     if(FAILED(hr))

                     {

                            _com_issue_error(hr);

}else

                     {

                            m_pCatalog->Create(_bstr_t(strcnn));//Create MDB

                     }

              }catch(_com_error e)  //异常处理

{//错误显示}

       }

       ::CoUninitialize();

       return TRUE;

}

2、用程序在系统中创建Access的数据源名称DSN:

手工配置ODBC的数据源名称,大家也不陌生。而通过程序动态建立ODBC的DSN,在有安装程序的情况下也需要它。它是在已有数据库文件的情况下建立数据源名称。

       BOOLCRecord::CreatAccessDSN()

{

              CString DBID ,lpszFile=DBPath+DBName;

              int mlen;

              char* szDesc=new char[512];

              sprintf(szDesc,"DSN=%s?UID=%s?;PWD=%s?;DESCRIPTION=;?DBQ=%s?

FIL=MicrosoftAccess?DEFAULTDIR=%s??"

                     ,DBName,DBID,DBPasswd,lpszFile,DBPath);

              mlen=strlen(szDesc);

              for(int i=0;i<mlen;i++)

              {

                     if(szDesc[i]=='?')    szDesc[i]='';

              }

              if(SQLConfigDataSource(NULL,ODBC_ADD_DSN,"MicrosoftAccess

                    Driver (*.mdb)", (LPCSTR)szDesc)) return TRUE;

              ……

}

3、动态建数据库表

       一种方法可以通过一个配置数据库表的txt文件,它包括创建数据表的SQL语句,程序读入该文件的,并分析该文件的内容,得到一SQL字串,进行创建,这种方法建表比较灵活;另一种方法也可以通过有包括创建Access数据表SQL语句的程序代码创建。两种创建方法都要注意在字段名与它的字段类型之间必需用tab键隔开。如下,采用后者:

       try

       {

              VARIANT* RecordsAffected=0;

              CStringstrSQL=

"CREATE TABLE accesstable(ID  longinteger ID ENTITY(1,1) not null,";

              strPSW=strPSW+"name        text(10)not null,";

              strPSW=strPSW+"cash  DOUBLE,remark   text(100));";   //SQL字串

              m_pCon->Execute((_bstr_t)(LPCTSTR)strSQL,NULL,adExecuteNoRecords);

       }

       catch(_com_error&e)    { …… }

       用VC++程序来动态建库很多数据类型不支持,但表名、字段名可以是变量。

4、数据库的连接和关闭

       boolCRecordSonPrg::CreatConnect()   //数据库的连接

{

CStringstr="Provider=MSDASQL.1;Password='"+DBPasswd+"';

              PersistSecurity Info=True;Data Source="+DBName;  //连接字串

              try

              {

                     m_pCon.CreateInstance(__uuidof(Connection));

                     m_strConnection = _T(str);  

                     intbCon=m_pCon->Open(_bstr_t(m_strConnection),"","",adConnectUnspecified);

              }

              catch(_com_error &e)    { ……    }

              return true;

}

voidCRecordSonPrg::CloseConnect()  //数据库的关闭

{

       try

       {

              m_pCon->Close();  //关闭连接

              m_pCon.Release(); //释放

       }

       catch(_com_error &e){ ……       }

}

5、用ADO对数据库记录的增、删、改、存、查、排序、过滤、打印

       //打开一个数据表DBtable

       m_pRs.CreateInstance(__uuidof(Recordset));

       m_strCmdText= _T("DBtable");

       m_pRs->Open((LPCTSTR)m_strCmdText,(LPCTSTR)m_strConnection,adOpenStatic,adLockOptimistic,adCmdTable);

       ①增加记录:

       try

       {

              if(!m_pRs->Supports(adAddNew))return false;

              m_pRs->AddNew();

       m_pRs->Fields->GetItem("user")->Value=(_variant_t)strm_newuser;

              ……

             m_pRs->Update();

       }

       ②删除记录:

       try

       {    

              m_pRs->Delete(adAffectCurrent );      //删除当前记录

       }

       ③改动、保存记录:

       voidCRsCgDlg::SaveModifiedRecord()       //记录修改后保存

       {

              ……       //拷贝对话框数据到ADOC++ 绑定成员

              //调用ADO数据绑定更新模式的接口

              HRESULThr = m_piAdoRecordBinding->Update( (CADORecordBinding*)this );

       }

       ④查找记录:

       CStringtemp ="user='"+m_FindUserName+"'";  

//查找字串

       _bstr_ttemp1=(_bstr_t)temp;                                  

//类型转换为_bstr_t

       m_pRs->Find(temp1,0,adSearchForward,"");

       ⑤排序记录:

CString temp="’user,"+m_FindUserName+"'";  

//排序字串

       _bstr_ttemp1=(_bstr_t)temp;                                  

//类型转换为_bstr_t

m_pRs->Sort=(temp1);

m_pRs->Sort=("");                                          

//取消排序

⑥过滤记录:

CStringstrfilter = _T("name = '"+m_strFilter+"'");    

//过滤字串

m_pRs->Filter= (_variant_t)strfilter;

m_pRs->Filter= (long) adFilterNone;        

//取消过滤

       ⑦打印记录:

       打印记录可以采用CDocument类的serialize()文档类的方式,也可以借助显示控件实现。这里是用FlexGrid控件编写的打印代码。

       voidCMyApp::PrintToText()

{

              CStringcFilePath = "C:\Documents and Settings\Administrator\";

              CString cFileName = "打印统计表.txt";

              CString cFile = cFilePath+cFileName;

CStdioFile file; 

//CStdioFile类是CFile类的派生类,它是以流方式操作文本

              file.Open(cFile,CFile::modeCreate|CFile::modeWrite|CFile::typeText)

CString str;

              str.Format("%snn",cFileName);      

//格式化文件主题

              file.WriteString(str);                   

//写入文件主题

              int RowCount = m_MSFGrid.GetRows();   

//从FlexGrid控件表取行数

              int ColCount = m_MSFGrid.GetCol();       

//从FlexGrid控件表取列数

              for(long r=0;r<RowCount;r++)     //行循环

              {

                     for(long c=0;c<ColCount;c++)     //列循环

                     {

                            CString Matrix =m_MSFGrid.GetTextMatrix(r,c);

//得到r行c列的文本

                            switch(c)

                            { str.Format( …… );//产生打印格式 }

                            file.WriteString(str);

                     }

              }

              file.SetLength(file.GetPosition());     

//设置文件长度

              file.Close();                      

//关闭文件

              str="notepad "+cFile;

              WinExec(str,SW_SHOW);            

//利用记事本打开生成的文本文件

}

6、配置设置文件:

为了增加程序的灵活性,对配置文件的读、写也是必要的。Windows操作系统专门为此提供了6个API函数来对配置设置文件进行读、写:  

GetPrivateProfileInt()               

//从私有初始化文件获取整型数值  

GetPrivateProfileString()  

//从私有初始化文件获取字符串型值  

GetProfileInt                    

//从win.ini获取整数值  

GetProfileString                      

//从win.ini获取字符串值  

WritePrivateProfileString  

//写字符串到私有初始化文件  

WriteProfileString      

//写字符串到win.ini 

下面采用私有初始化文件获取或写入字符串型值的函数来读写配置文件:

       读文件:

       CStringCMyApp::GetOneIniData(CString sFilePath)

{

              CString str;

              char buf[256] =NULL;

              int len=0;

              len = GetPrivateProfileString(

                     "Custom",      //节名

                     "UserName"   //项名

                     "No",             //没找到此项时的返回值

                     buf,               //目标缓冲区地址

                     256,               //目标缓冲区长度

                     sFilePath        //配置文件的准确路径

              );

              str=buf;

              return str;

}

写文件:

BOOLCKaApp::WriteIniData(CString cstr,CString strUserName)

{

       CString sFile = cstr;

       CFileStatus status;  

       BOOL RetUser=WritePrivateProfileString(

              "Custom",             //节名

              "UserName",         //项名

              strUserName,         //内容

              sFile                            //配置文件的准确路径

              );

              returnTRUE;

       }

对于SQL Server的操作类似。