说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

**在线等,救救小弟,郁闷一会儿了** 下了一ActiveX源码,编译成OCX,网页调用显示正常,但怎么调用其属性方法?详情进

编辑:说三道四文库 发布时间:2018-06-24 07:33
HTML文档下载 WORD文档下载 PDF文档下载
近来想学习ACTIVEX的编写,下了一段利用MFC编写的扑克ACTIVEX。  在网页调用显示正常  
<OBJECT  id=sky  classid="clsid:0F968806-D214-11D5-9022-5254AB123A61"  CODEBASE="Cards.ocx">  
<PARAM  NAME="_Version"  VALUE="65536">  
<PARAM  NAME="_ExtentX"  VALUE="10000">  
<PARAM  NAME="_ExtentY"  VALUE="10000">  
<PARAM  NAME="_StockProps"  VALUE="0">  
</OBJECT>  
 
现在我想要修改其属性和方法,应该怎样调用,如果要建立对象是像下面这样吗?我为什么不成功  
<%  
 Dim  obj    
   Set  obj  =  Server.CreateObject("****.****")  
//注意,我的问题在这里,这*的内容应该填什么?  
是这样吗?  Set  obj  =  Server.CreateObject("sky.sky")

还是直接 sky.属性或方法

还是
<script  >  
document.all.sky.方法()  
 </script  >   
 
%> 

为什么都不成,说“对象不支持属性和方法"
扑克控件的说明文件如下

 VCKBASE Online Help Journal No.12  
 


扑克控件制作实例
作者:龙浩天


前言
本文以扑克控件的制作过程为实例,介绍了MFC ActiveX控件的详细制作过程,希望对学习控件编写的朋友有所帮助。

下载扑克控件源代码 大小:92K



一、扑克控件的制作
1、新建一个“MFC ActiveX ControlWizard”工程。为工程名起名为Cards,然后用向导的默认值一路OK生成工程。 
2、为工程中添加五十四张扑克牌位图以及扑克背景位图资源。注意位图中有一张IDB_CARDS位图为控件显示时的图标,可以自行修改成自己喜欢的图样。

3、为控件填加属性值,打开View—>ClassWizard。点击Automation标签。从类名下拉框中选择CCardsCtrl,点击“Add Property”按钮弹出属性添加对话框。在External name中输入value,Type选择为short类型。同时在Implementation一项中选择Get/Set methods,还有两项不管它,就用它自己设置的函数就行了。现在我们已经为控件添加好了一个属性,它是用来处理扑克牌的点数的。

4、按照第三步的方法,我们再依次设置几个属性,分别是backbmp,类型为short,用来处理背景图案是什么;background,类型为BOOL,用来处理显示牌正面还是反面。

5、属性添加好了,下面为这些属性设置初始值:打开CardsCtl.cpp文件,在构造函数CCardsCtrl::CCardsCtrl()中加入代码:value=1;backbmp=1;

6、为了使控件能够在程序中正常显示出来,我们还需要对CCardsCtrl::OnDraw进行修改。修改后的内容如下: 

void CCardsCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
CBitmap *pOldBitmap;
CBitmap bitmap;
CRect rect;
GetClientRect(rect);
CDC ppdc;
CClientDC dc(this);
ppdc.CreateCompatibleDC(&dc);
if(background)//背景图案
{
if(backbmp==1)bitmap.LoadBitmap(255);
if(backbmp==2)bitmap.LoadBitmap(256);
}
else//前景图案
bitmap.LoadBitmap(IDB_BITMAP1+value-1);
pOldBitmap=ppdc.SelectObject(&bitmap);
dc.BitBlt(0,0,rect.Width(),rect.Height(),&ppdc,0,0,SRCCOPY);
ppdc.SelectObject(pOldBitmap);
}
在上面的代码中,要注意的是bitmap.LoadBitmap(IDB_BITMAP1+value-1);语句,一定要保证你在资源中插入的位图资源连续。可以打开Resource.h文件看一看,你的位图资源是否是连续的。

7、接下来要修改属性函数了。修改前在CardsCtl.h中加入成员变量(有些在后面能够用得上): 
protected:
short value,backbmp;
BOOL background;
BOOL IsMove,m_IsMove;
BOOL IsGoHome;
CPoint OldPoint;
CRect rect;
long xx,yy;

修改后的函数如下: 
short CCardsCtrl::GetValue() 
{
return value;
}

void CCardsCtrl::SetValue(short nNewValue) 
{
value=nNewValue;
SetModifiedFlag();
InvalidateControl();//立即刷新
}

BOOL CCardsCtrl::GetBackground() 
{
return background;
}

void CCardsCtrl::SetBackground(BOOL bNewValue) 
{
background=bNewValue;
SetModifiedFlag();
InvalidateControl();
}

short CCardsCtrl::GetBackbmp() 
{
return backbmp;
}

void CCardsCtrl::SetBackbmp(short nNewValue) 
{
backbmp=nNewValue;
SetModifiedFlag();
InvalidateControl();
}
可以看出,这些函数的修改都是大同小异,GetXXXXX()是用来得到属性值,SetXXXXX()用来设置属性值。InvalidateControl()函数用来刷新控件,使修改属性后的控件能立刻反映在屏幕上。 
8、为了能使控件能够被随意拖动,我们还需要做下面的准备工作,首先按照第三步的方法添加两个属性:IsMove,类型为BOOL,用来处理控件是否能被拖动;IsGoHome,类型为BOOL,用来处理控件拖动后是否回到原位置。之后为这两个属性设置初始值,也是在构造函数CCardsCtrl::CCardsCtrl()中增加代码 

IsMove=false;
m_IsMove=false;
IsGoHome=true;
9、使控件能被拖动,需要处理鼠标左键按下、鼠标拖动以及鼠标左键抬起三个消息。在ClassWizard的“Message Maps”标签中,为WM_LBUTTONDOWN、WM_MOUSEMOVE、WM_LBUTTONUP增加消息处理函数,然后修改这三个函数如下: 
void CCardsCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
{
if(IsMove)//是否是允许拖动鼠标
{
m_IsMove=true;
SetCapture();//捕获鼠标
xx=point.x;//得到鼠标(相对于控件左上角)的坐标
yy=point.y;

GetClientRect(&rect);//保存拖动前的扑克位置
::ClientToScreen(m_hWnd,&rect.TopLeft());
OldPoint=rect.TopLeft();

MoveWindow(0,0,0,0);//得到相对量
GetClientRect(&rect);
::ClientToScreen(m_hWnd,&rect.TopLeft());
}
COleControl::OnLButtonDown(nFlags, point);
}

void CCardsCtrl::OnMouseMove(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
CPoint MyPoint=point;
if(m_IsMove)
{
ClientToScreen(&MyPoint);
      MoveWindow(MyPoint.x-xx-rect.left,MyPoint.y-yy-rect.top,71,96);
}
COleControl::OnMouseMove(nFlags, point);
}

void CCardsCtrl::OnLButtonUp(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
if(m_IsMove)
{
ReleaseCapture();
m_IsMove=false;
if(IsGoHome)
    MoveWindow(OldPoint.x-rect.left,OldPoint.y-rect.top,71,96);//还原到扑克牌拖动前的位置
}
COleControl::OnLButtonUp(nFlags, point);
}
10、到了这一步,此控件的主要工作已经完成了,现在我们为控件添加属性页,以使它和用户的交流更友好。首先在ResourceView中修改默认的属性页对话框为你需要的(详见程序源代码)。然后在ClassWizard的“Member Variables”中。从类中选择CCardsPropPage,点击“Add Variable…”按钮分别为你加入在属性页中的控件添加变量。这里添加变量的方法大致和为普通对话框添加变量相同,唯一有区别的是这里多了一项可选属性名(Optional property name),用于选择和变量相连的属性。具体设置详见下表: 

控件名 变量名 组件 变量类型 可选属性名 
IDC_CHECK1 m_check1 value BOOL background 
IDC_CHECK2 m_check2 value BOOL IsMove 
IDC_CHECK4 m_check4 value BOOL IsGoHome 
IDC_EDIT1 m_edit1 value short value 
IDC_EDIT2 m_edit2 value short backbmp 

11、最后,为了使属性页和控件关联起来,我们再在void CCardsCtrl::DoPropExchange(CPropExchange* pPX)函数中添加代码: 
PX_Short(pPX,"value",value,1);
PX_Short(pPX,"backbmp",backbmp,1);
PX_Bool(pPX,"background",background,false);
PX_Bool(pPX,"IsMove",IsMove,false);
PX_Bool(pPX,"IsGoHome",IsGoHome,false);
补充:控件中的右键单击处理因为和制作此控件无关,这里没有解释,若想知详情请看源代码。 
二、控件测试
1、新建一“MFC AppWizard(exe)”工程,取名为test,建立完毕,在Project(工程)中选择“Add Project(添加工程)”,再选“Components and Controls…”选项。 之后从弹出的对话框中双击“Registered ActiveX Controls”目录。从目录中选择刚才我们编的控件“Cards Control”,点“Insert”按钮把此控件插入到test工程中。
2、打开对话框资源,把控件拖动至对话框中,用鼠标右键单击Cards控件,进行属性设置,完毕后就可以运行了。
另外你也可以通过调用SetValue(short propVal)来手工设置扑克点数。好了,一切都OK了! 


 

--------------------------------------------------------------------------------

&copy;1997-2001 VCKBASE.COM All Rights Reserved.
=================================================================
<%  
 Dim  obj    
   Set  obj  =  Server.CreateObject("****.****")  
//注意,我的问题在这里,这*的内容应该填什么?  
是这样吗?  Set  obj  =  Server.CreateObject("sky.sky")
还是直接 sky.属性或方法
=================================================================
这种方式用于创建服务器端对象,而你的控件是用来客户端当然不能调了

=================================================================
还是
<script  >  
document.all.sky.方法()  
 </script  >   
 
%> 
=================================================================
用sky.method(...)吧
你先搞清楚你的控件是在服务器端还是客户端的,
<OBJECT  id=sky  classid="clsid:0F968806-D214-11D5-9022-5254AB123A61"  CODEBASE="Cards.ocx">  这样创建的是客户端。

<%  
   Dim  obj    
   Set  obj  =  Server.CreateObject("****.****")  
%>创建的是服务器端的

****.****对应的是“供应商.组件(.版本)”供应商和版本是可选的。

如果你要创建服务器端的控件还能这样写
,<OBJECT  id=sky  classid="clsid:0F968806-D214-11D5-9022-5254AB123A61"  
RUNAT="SERVER" >  

修改属性时用
<PARAM  NAME="param1"  VALUE="value1"> 
<PARAM  NAME="param2"  VALUE="value2">  

修改方法用
document.sky.方法()


俺不会脚本的编写,郁闷,哈哈,我只会写组件
唉,还是不能,是不是我这个ACTIVEX有问题,不能用在网页中????
请问ACTIVEX要用在网页中要有特别的设置或程式代码吗??
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘