试验三非标准控件的使用文档格式.docx
《试验三非标准控件的使用文档格式.docx》由会员分享,可在线阅读,更多相关《试验三非标准控件的使用文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
ComponentsAndControls,再选择RegisteredActiveXControls,如下图所示:
这里会列出系统中当前已经注册的所有ActiveX控件,找到所需控件后选中,点击Insert,ClassWizard就会产生一个CWnd的派生类,点击OK即可。
一个尚未注册的ActiveX控件,是不会出现在上图的文件列表中的。
利用系统提供的注册软件regsvr32可以进行注册。
如需注册播放器控件msdxm.ocx,在命令行提示符下键入:
regsvr32msdxm.ocx
该命令有些其它选择:
/u/s/n/I
如在注册表中去掉已注册的控件,用/u,在命令行提示符下键入:
regsvr32/umsdxm.ocx
2、具体步骤
2.1CommandButton对话框
首先创建一个单文档工程(也可分别创建3个基于对话框的工程)。
(1)添加测试菜单,设置图像按钮菜单的属性,见下图:
如下图添加加速健Ctrl+F2:
为项目新建一个对话框,利用ClassWizard创建对话框的生成类,命名为CButtonDlg。
在此对话框中添加控件MicrosoftForms2.0CommandButton。
(2)为菜单添加command消息函数
如下图,在Classname一栏选择视图类,菜单的ID名称ID_BUTTON,COMMAND消息,然后点击添加消息函数:
编辑消息函数:
voidCActivexView:
:
OnButton()
{
//TODO:
Addyourcommandhandlercodehere
CButtonDlgdlg;
dlg.DoModal();
}
添加对话框类头文件:
#include"
ButtonDlg.h"
(3)访问命令按钮
在对话框类CButtonDlg中,为命令按钮添加成员变量m_commandButton,用来改变控件的设置。
ActiveX控件中有一通用成员函数SetPicture(),利用它可以设置ActiveX控件显示的位图;
然后在工程资源中编辑两幅位图以备使用,其ID为IDB_RED_BITMAP及IDB_BLUE_BITMAP,注意:
绘制图片不要在满幅图涂上单色。
首先添加头文件:
afxctl.h"
,就可以用类CPictureHolder。
CPictureHolder类的设计目的是实现ActiveX控件的Picture属性(可由SetPicture函数实现),它可以将一个图像等控件的名称转换成控件指针dispatchpointer,帮助SetPicture函数实现设置。
编写按钮的消息函数如下:
boolbChange;
voidCButtonDlg:
OnClickCommandbutton1()
Addyourcontrolnotificationhandlercodehere
CPictureHolderpictholder;
if(!
bChange)
{
pictholder.CreateFromBitmap(IDB_BLUE_BITMAP);
//从ID到LPDISPATCH的转换
m_commandButton.SetPicture(pictholder.GetPictureDispatch());
//利用ActiveX通用的SetPicture来设置CommandButton的位图
}
else
pictholder.CreateFromBitmap(IDB_RED_BITMAP);
m_commandButton.SetPicture(pictholder.GetPictureDispatch());
}
bChange=!
bChange;
//换另一位图
2.2ActiveMovieControl对话框
1.注册控件:
在命令行运行regsvr32msdxm.ocx。
2.为项目添加控件ActiveMovieControlObject。
3.添加对话框,生成对应类。
放入该控件。
对话框如下图所示:
同样为ActiveMovieControl控件添加成员变量m_ActiveMoive,使用CFileDialog来选择需要打开的文件,通过m_ActiveMovie.SetFileName()及m_ActiveMovie.Run()播放选择的文件。
添加“打开”按钮的click消息函数,编辑代码如下:
voidCMy32Dlg:
OnButton1()
charszFileFilter[]=
"
全部支持类型|*.mp3;
*.wma;
*dat;
*.wav;
*.avi;
*mid;
*.mpeg|"
Mp3File(*.mp3)|*.mp3|"
WmaFile(*.wma)|*.wma|"
VideoFile(*.dat)|*.dat|"
WaveFile(*.wav)|*.wav|"
AVIFile(*.avi)|*.avi|"
MidFile(*.mid;
*,rmi)|*.mid;
*.rmi|"
MPEGFile(*.mpeg)|*.mpeg|"
AllFile(*.*)|*.*||"
;
CFileDialogdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);
if(dlg.DoModal()==IDOK)
{
CStringPathName=dlg.GetPathName();
PathName.MakeUpper();
m_movie.SetFileName(PathName);
}//获取播放文件信息
elsereturn;
m_movie.Run();
//播放文件
SetTimer(0,20,NULL);
//设置定时器
2.3MsFlexGrid对话框
对话框入下图所示:
为MsFlexGrid添加成员变量m_FlexGridData_Ctrl,使用CFileDialog来选择需要打开或保存的数据文件(此处为文本文件)。
需要用到的MsFlexGrid成员函数如下:
m_FlexGridData_Ctrl.SetCol(intCol);
//选择行号
m_FlexGridData_Ctrl.SetRow(intRow);
//选择列号
m_FlexGridData_Ctrl.SetText(CStringText);
//设置Row行,Col列的内容
m_FlexGridData_Ctrl.SetRows(intRows);
//设置总行数
m_FlexGridData_Ctrl.SetCols(intCols);
//设置总列数
m_FlexGridData_Ctrl.GetText();
//得到当前内容
读取数据文件内容时可使用CFile类,用到的成员函数有:
CFile:
Open(LPCTSTRlpszFileName,UINTnOpenFlags,CFileException*pError=NULL)//打开文件
Write(constvoid*lpBuf,UINTnCount);
//写文件
通过Cfile:
Open()将数据文件内容装入CString类型变量内,然后通过各种字符串操作将数据内容写入对应的MsFlexGrid表格内。
使用到的字符串操作函数如下:
CString:
IsEmpty();
//变量是否为空
Mid(intnFirst,intnCount);
//获取nFirst开始之后nCount个字符的内容
Find(LPCTSTRpstr,intnStart);
//在字符串nStart处开始查找pstr指定的内容
以上各函数的定义及使用方法在MSDN中均有详细说明。
编程步骤:
1.在ClassWizard中为控件添加成员变量:
m_FlexGridData_Ctrl;
2.双击“打开”按钮,为其添加消息函数,编码如下:
voidCGridDlg:
CFilemyDataFile;
charDataBuf[1025];
memset(DataBuf,0,1025);
支持类型|*.txt|"
文本文件(*.txt)|*.txt|"
所有文件(*.*)|*.*||"
CStringDataStr;
CStringPathName;
if(dlg.DoModal()==IDOK)
PathName=dlg.GetPathName();
myDataFile.Open(PathName,CFile:
modeRead);
myDataFile.SeekToBegin();
myDataFile.Read(DataBuf,myDataFile.GetLength());
//将数据文件内容保存在字符串中
DataStr=DataBuf;
//char*转换为cstring便于处理
myDataFile.Close();
intpos1=0,pos2=0;
//字符串指针位置
inti=0;
//行号
intj=0;
//列号
intk;
charlpstrRow[100]="
1"
//编号
m_FlexGridData_Ctrl.SetCol(0);
m_FlexGridData_Ctrl.SetRow(0);
m_FlexGridData_Ctrl.SetText("
编号"
);
m_FlexGridData_Ctrl.SetCol
(1);
姓名"
m_FlexGridData_Ctrl.SetCol
(2);
政治"
m_FlexGridData_Ctrl.SetCol(3);
高数"
m_FlexGridData_Ctrl.SetCol(4);
物理"
m_FlexGridData_Ctrl.SetCol(5);
化学"
//初始化FlexGrid
//m_FlexGridData_Ctrl.SetRows((int)(DataStr.GetLength()/18)+2);
m_FlexGridData_Ctrl.SetRows(100);
m_FlexGridData_Ctrl.SetCols(6);
for(i=1;
i<
=(int)(DataStr.GetLength()/18);
i++)
{
m_FlexGridData_Ctrl.SetRow(i);
//需要设置或修改的行号
itoa(i,(char*)lpstrRow,100);
m_FlexGridData_Ctrl.SetText(lpstrRow);
//将第0列作为编号
for(j=1;
j<
=5;
j++)
{
m_FlexGridData_Ctrl.SetCol(j);
//需要设置或修改的列号
if(j==5){pos2=DataStr.Find('
\n'
pos2)+1;
k=2;
}//输出最后一门成绩
else{pos2=DataStr.Find('
'
pos1)+1;
k=1;
}//定位课程成绩
//if(j==5&
&
i==6)pos2=pos2+2;
m_FlexGridData_Ctrl.SetText(DataStr.Mid(pos1,pos2-pos1-k));
//显示数据
pos1=pos2;
//移动位置指针
3.添加“关闭”按钮的消息函数,代码如下:
OnButton2()
//PathName.MakeUpper();
modeCreate|CFile:
modeWrite);
intmaxRow=m_FlexGridData_Ctrl.GetRows();
intmaxCol=m_FlexGridData_Ctrl.GetCols();
CStringdata;
//表格中的数据
char*dataBuf;
//写入数据文件的字符串指针
for(inti=1;
maxRow;
for(intj=1;
j<
maxCol;
m_FlexGridData_Ctrl.SetRow(i);
m_FlexGridData_Ctrl.SetCol(j);
data=m_FlexGridData_Ctrl.GetText();
if(data.IsEmpty())//是否到达表格末尾?
{
gotoend;
}
dataBuf=(char*)(LPCTSTR)data;
//cstring转换为char*,便于写入文件
myDataFile.Write(dataBuf,data.GetLength());
//写入数据
if(j==5)break;
myDataFile.Write("
"
1);
//写入分隔标志
if(i==maxRow-1)break;
myDataFile.Write("
\r\n"
2);
//写入换行
end:
//关闭文件,切记
4.添加控件的KeyPress消息函数,代码如下:
OnKeyPressMsflexgrid1(shortFAR*KeyAscii)
CStringstr;
str=m_FlexGridData_Ctrl.GetText();
//获得当前位置的数据
str+=(char)*KeyAscii;
//添加键入的数据(或字符)
m_FlexGridData_Ctrl.SetText(str);
//再写到同样的位置
四、思考题
1、使用CCommandButton:
SetPicture(LPDISPATCHnewValue)时,如何将位图的nID转换为LPDISPATCH型?
2、当改变对话框窗口大小时,如何使控件大小随之改变?