📄 9935.txt
字号:
(lpDrawItemStruct->itemAction & ODA_SELECT)){
//按下鼠标
mBtnStats=BTN_DOWN;
dc.Draw3dRect(&rect,RGB(128,128,128),RGB(192,192,192));
rect.top=rect.top+1;rect.bottom=rect.bottom-1;
rect.left=rect.left+1;rect.right=rect.right-1;
dc.Draw3dRect(&rect,RGB(0,0,0),RGB(255,255,255));
}
if(!(lpDrawItemStruct->itemState & ODS_SELECTED) &&
(lpDrawItemStruct->itemAction & ODA_SELECT)){
//释放鼠标或鼠标进入按键区域
mBtnStats=BTN_UP;
dc.Draw3dRect(&rect,RGB(255,255,255),RGB(0,0,0));
rect.top=rect.top+1;rect.bottom=rect.bottom-1;
rect.left=rect.left+1;rect.right=rect.right-1;
dc.Draw3dRect(&rect,RGB(192,192,192),RGB(128,128,128));
}
dc.Detach();
}
接着就必须一些初始化工作,其中最关键就是把被按键覆盖了的区域保
存进CBitmap类中,我们知道CDC::StretchBlt()函数可以把位图的指定
区域从一个设备拷贝到另一个设备中,这样可以很方便地把窗口或对话
框的某个区域保存,条件是获得其DC:
void CDrawButton::LoadBack(CWnd *pParent)
{
ASSERT(GetStyle() & BS_OWNERDRAW);
if (m_pBitmap!=0) return;
CRect rect;
GetWindowRect(&rect);
pParent->ScreenToClient(&rect);//获得按键区域
CPaintDC dc(pParent);
if (m_pBitmap==0) m_pBitmap=new CBitmap;//初始化位图
m_pBitmap->CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());
CDC memDC;
memDC.CreateCompatibleDC(&dc);
memDC.SelectObject(m_pBitmap);
memDC.StretchBlt(0, 0, rect.Width(),rect.Height(), &dc,
rect.left, rect.top, rect.Width(),rect.Height(), SRCCOPY);//保存
memDC.DeleteDC();
m_pFont=pParent->GetFont();//获得窗口或对话框的字体
ModifyStyle(0,WS_VISIBLE);//显示按键
SetBitmapMode(ODA_DRAWENTIRE,0);//绘制按键
}
而使这个类和对话框上的按键产生联系还必须调用一下SubclassDlgItem():
BOOL CDrawButton::AutoLoad(UINT nID, CWnd *pParent)
{
// first attach the CDrawButton to the dialog control
if (m_pBitmap!=0) return FALSE;
if (!SubclassDlgItem(nID, pParent)) return FALSE;
LoadBack(pParent);
return TRUE;
}
这个类还必须具有三个成员变量:
CFont* m_pFont;
CBitmap* m_pBitmap;
UINT mBtnStats;
在构造函数中初始化这些变量
m_pBitmap=0;
m_pFont=0;
//赋予0是可以的
mBtnStats=BTN_NORMAL;
在折构函数中拆除位图
if(m_pBitmap!=0) delete m_pBitmap;
这样,一个透明的浮动式按键类就做好了,具体实现方法以下:
1.接管对话框的BUTTON,首先在对话框上画一个BUTTON,再加一个PICTURE
图片,BUTTON的风格必须加入OWNER DRAW及去掉VISIBLE,把BUTTON移
到PICTURE上适当的位置,在对话框类加入CDrawButton类成员m_myButton,
由于按键初始化时必须保存对话框的图象,而对话框在运行InitDialog()
或第一次运行OnPaint()时对话框的控件还没有真正显示出来,我们只好
在OnMouseMove()中进行初始化:
m_myButton.AutoLoad(IDC_BUTTON1,this);
AutoLoad()只运行一次。
2.动态建立CDrawButton,在对话框类或CxxxView类加入CDrawButton类成
员m_myButton,可以在对话框的InitDialog()或CxxxView类的InitialUpdate()
中加入:m_myButton.Create()函数,必须包含BS_OWNERDRAW而不能有
WS_VISIBLE风格,然后在OnMouseMove()或OnDraw()中进行初始化:
m_myButton.LoadBack(this);注意应加在OnDraw()的最后。
同样地,LoadBack()只运行一次。
(如果按键比背景的图片迟建立而具有可见(Visible)属性,则会把图片抹
掉,所以必须去掉VISIBLE属性或不能加入WS_VISIBLE风格)
当鼠标移到按键区域时,改变鼠标
这个很容易实现,不在这里多说了。
****************************************************************
用Visual Basic与MS-Draw开发通用作图软件
南京农业大学信息管理系(210095) 龚建新
一、OLE技术介绍
OLE和DDE,是支持Windows应用之间相互通讯的一种机制。OLE技术通过
"对象"集成win dows应用程序,它采用图象、图表、数据库、声音、文本
等构成复合对象(也称复合文档)。 OLE技术是在复合文档中实现链接对
象或嵌入对象的一组协议,该技术首先由Aldus公司在1 988年提出,后被
Microsoft公司引进到Windows中。使用OLE,一个应用程序可以和其他应
用程序合作,以产生包含有不同种类对象的复合文档,并且文档中所包含
的对象易于被用户操作。
支持OLE调用的Windows软件,在Windows中会有注册登记信息,查看WIN.INI
中[embeddi ng]节的内容,可知道Windows中包含哪些可以调用的OLE对
象。画笔(PBRUSH.EXE)、统计图 (Microsoft Graph)、对象包装程序
(PACKGER.EXE)和录音机(SOUNDREC.EXE)是Windows环境下常用的OLE嵌
入对象。
Windows环境下的大部分开发工具(如C、C++、PASCAL、Visual Basic 3.0、
CA-Reali zer、FoxPro for Windows、Visual FoxPro for Windows等)
大都支持开发具有调用OLE对象能力的应用程序,相比之下,Visual Basic
3.0开发OLE调用程序更容易。
Windows环境下采用OLE技术开发应用程序有许多优点:
(1)、提高软件开发效率:通过OLE的嵌入其它WINDOWS应用程序,应用程
序员所进行的软件开发工作实际上变成了软件集成(或称"软件组合"),
这样就比逐个开发软件功能模块要快得多,应用软件的开发周期大大缩短;
(2)、性能稳定、可靠:由于OLE嵌入对象程序都是经过严格测试过的商品
软件,因此,经过"组合"的软件,只要经过对"组合过程"部分进行严格测试
(测试的工作量相对来说较小), 就能成为性能稳定可靠的高质量软件;
(3)、功能完善:OLE嵌入其它WINDOWS应用程序,不仅"嵌入"了其它应用程
序的数据,同时也"嵌入"了其它应用程序的功能。应用软件中能够"嵌入
"所有的WINDOWS OLE嵌入对象, 例如,你通过Word,Excel,Mail,Microsoft
Graph等建立起一个包含文字处理、电子报表、电子邮件和统计图形的综
合性办公自动化系统软件;
(4)、开发人员不再需要是编程专家:Visual Basic 3.0中提供了OLE 2.0
调用功能,大大降低了OLE调用的难度,一般的软件开发人员即可开发出调
用Windows OLE对象的应用程序。
Visual Basic for Windows 3.0(以下简称VB)是一个面向Windows的高级
开发系统,它采用事件驱动机制、可视化界面设计及集成化的开发、调试、
编译环境,VB同时还提供DDE 、OLE程序开发功能。VB既适合于初级程序
员,又适合于高级程序员编写功能强大的应用软件。
二、通用作图系统的设计
1、在Windows中添加Microsoft Draw OLE工具:
(1)修改win.ini:
[embedding]
MSDraw=MicrosoftDrawing,MicrosoftDrawing,c:\yzgraph\msdraw.exe,picture
(2)创建MSDRAW.REG:
REGEDIT
HEKY_CLASSES_ROOT\MSDraw=Microsoft Drawing
HKEY_CLASSES_ROOT\MSDraw\protocol\StdFileEditing\server=c:\yzgraph\msdraw. exe
(3)运行REGEDIT.EXE MSDRAW.REG,屏幕上会出现"c:\yzgraph\msdraw.exe
中的信息已成功地登录在登录数据库中"。
(4)从Microsoft Word 5.0中文版中\windows\msapps\msdraw子目录中拷贝
MSDRAW.EXE、MS-DRAW.HLP至c:\yzgraph子目录下。
2、在VB中创建一个FORM1:启动Visual BASIC 3.0,选File-NEW Project菜单;
3、在FORM1上创建"存盘""打印""退出"三个按钮对象;
4、在FORM1上创建一个OLE2对象:在Toolbox窗口选OLE2.0控件,移动鼠标至
Forml窗口上,按下左鼠标同时移动鼠标光标拖出一个小小的矩形。松开左鼠
标,这时,屏幕上会出现" insert object"对话窗口,选择Create New-Microsoft
Drawing-ok,这时Microsoft Drawi ng就会启动,退出Microsoft Drawing;
5、在Visual Basic 3.0中增加一个图形存盘及打印控件(mhoutbx.vbx):
mhoutbx.vbx是MicroHelp公司提供的具有图形显示打印功能的通用VBX控件。
在Visua l Basic 3.0中选File-Add File菜单,选中mhoutbx.bx;
AutoSize =-1 'True
EraseForRead = -1'True
6、在FORM1上创建一个图形存盘及打印的mhoutbx对象(用于Microsoft Draw的
结果存盘、打印输出);
7、使FORM1始终处于"最上层"(即不被其它窗口覆盖):
Global.bas:
Global Const SWP_MOVE=2
Global Const SWP_NOSIZE=1
Global Const FLAGS=SWP_MOVE Or SWP_NOSIZE
Global Const HWND_TOPMOST=-1
Global Const HWND_NOTOPMOST=-2
Declare Function SetWindowsPos Lib"user"(ByVal h%,ByVal hb%,ByVal X%,
ByVal y%,ByVal cx%,ByVal cy%,By-Val f%)As Integer
Declare Function GetSystemMetrics% Lib"user"(ByVal nIn-dex%)
Global Const
NILL=0&
Global Const WM_SYSCOMMAND=&H112
Global Const WM_LBUTTONDBLCLK=&H203
Global Const SC_CLOSE=&HF06O
Global Const WM-CLOSE=&H10
Global Const WM_GETMINMAXINFO=&H24
Declare Function FindWindows Lib "User"(ByVal lpClassName As Any,
ByVal lpW indowsName As Any)
As Integer
Declare Function sendmessage& Lib "user"(ByVal hWnd%,ByVal wmsg%,
ByVal wpa ram%,ByVal Iparam As Long)
Global Const SW_SHOWMAXIMIZED=3
Declare Function ShowWindows Lib "User"(ByVal hWnd As Integer,
ByVal nCmd S how As Integer)As Integer
8、激活MSDraw,并使其最大化:
Sub Form_Load()
Dim rc%,msdraw_h,Ipclass$,lpcaption$
form1,Width=Pane13D1.Width
rc%=SetWindowPos(form1.hWnd,HWND
_TOPMOST,0,0,0,0,Flags)
rc%=sendmessage(form1,OLE1.hWnd,WM
_LBUTTONDBLCLK,0,NILL)
AppActivate"Microsoft Draw-绘图"
SendKeys"%F",True
SendKeys"{LEFT}X",True
form1.Show
End Sub
9、图形存盘:
Sub Panel3D1_Click()
a$="c:\test.wmf"
AppActivate"Microsoft Draw-绘图"
SendKeys "%FU",True
FORM1.MhOutbox1.MetaFileName=a$
FORM1.MhOutbox1.SaveMetaFile=True
End Sub
10、图形打印:
Sub Panel3D2_Click()
AppActivate"Microsoft Draw-绘图"
SendKeys"%FU",True
MhOutboxl.OutContext=1
MhOutbox.EndPage=True
End Sub
11、退出:
Sub Panel3D3_Click()
Unload form1
End
End Sub
****************************************************************
ASP页面内VBScript和JScript的交互
ASP具备管理不同语言脚本程序的能力,能够自动调用合适的脚本引擎
以解释脚本代码和执行内置函数。ASP开发环境提供了两种脚本引擎,即
VBScript(缺省)和JScript。不过,开发者并没有被限制于只能使用这
两种语言,只要能够提供合适的ActiveX脚本引擎就能使用任何脚本语言。
脚本语言的选择往往基于许多不同原因:它可能是开发者最为熟悉
的语言,可能是对给定工程来说能够提供最多特色支持的,也有可能是最
具效率的。不同的环境和要求使得我们在选择脚本语言时注重不同的因素,
同时也使得我们在某些时候面临选定的脚本语言不能直接提供其它语言固
有的函数这一问题,或某个脚本已经写成但用的却是另外一种脚本语言。
此时应该怎么办?是否需要用当前所用的脚本语言重写这些脚本?
或者说,是否有可能在一种脚本语言中调用其它脚本语言的内置函数?本
文要说明的就是在ASP应用中如何让VBScript脚本和JScript脚本交互以最
大限度地获得两种脚本语言的特色支持。
一、VBScript和JScript的内置函数
在VBScript和JScript中,有大量的内置函数功能是相同或类似的。
然而,在一种脚本语言中内置的函数并非总是在另外一种脚本语言中也有
对应的函数。例如,VBScript提供了许多用于操作字符串和格式化数据的
函数,这些函数在JScript中并不存在。这些函数包括StrReverse()、
Filter()以及FormatCurrency()等。在另一方面,JScript所提供的用于
管理数组、字符串编码等的函数在VBScript中也没有定义,如join()、
reverse()、pow()、位操作、escape()和unescape()等。
那么,如果在JScript程序中需要一个VBscript函数该怎么办呢?
二、异种脚本的互相调用
如果需要在JScript脚本中调用一个VBScript中内置的函数,则应
该写一个VBScript用户定义函数(在这里调用VBScript内置函数),然
后在JScript脚本中象调用公用JScript函数一样调用这个用户定义函数。
例如,如果要调用的VBSCript内置函数是FormatCurrency(),则可
以声明如下自定义函数:
< SCRIPT LANGUAGE="VBSCRIPT" RUNAT="SERVER">
Function FormatValue(Value)
FormatValue = FormatCurrency(Value)
End Function
< /SCRIPT>
接下来在JScript代码中就可以象普通JScript函数一样调用
FormatValue()了。用类似的方法也可以实现VBScript代码调用JScript
函数。
应用同样的规则,我们可以在任何脚本内调用任何用户定义函数。
不过,从JScript脚本内调用一个不带参数的VBScript过程(Sub)时应
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -