📄 9924.txt
字号:
Declare Function BitBlt% Lib "GDI" (ByVal hDestDC%, ByVal x%, ByVal y%,
ByVal nWidth%, ByVal nHeight%, ByVal hSrcDC%, ByVal XSrc%, ByVal YSrc%,
ByVal dwRop&)
Declare Function DeleteDC% Lib "GDI" (ByVal hDC%)
Declare Function DeleteObject% Lib "GDI" (ByVal hObject%)
Declare Function FindResource% Lib "Kernel" (ByVal hInstance%, ByVal lpName$,
ByVal lpType As Any)
Declare Function LockResource& Lib "Kernel" (ByVal hResData%)
Declare Function LoadResource% Lib "Kernel" (ByVal hInstance%, ByVal hResInfo%)
Declare Function GlobalUnlock% Lib "Kernel" (ByVal hMem%)
Declare Function sndPlaySound% Lib "MMSYSTEM" (ByVal lpszSoundName As Any,
ByVal uFlags%)
'位图数据结构类型
Type BITMAP
bmType As Integer
bmWidth As Integer
bmHeight As Integer
bmWidthBytes As Integer
bmPlanes As String * 1
bmBitsPixel As String * 1
bmBits As Long
End Type
'光栅操作代码常量
Public Const SRCCOPY = &HCC0020
'声音播放状态常量
Public Const SND_SYNC = &H0
Public Const SND_MEMORY = &H4
'调用位图资源子例程
Sub load_pic(picName As String)
Dim hDLL As Integer
Dim hdcMemory, hLoadedbitmap, hOldBitmap As Integer
Dim retVal As Integer
Dim bmpInfo As BITMAP
'安装动态链接库DEMO.DLL
hDLL = LoadLibrary(App.Path & "\DEMO.DLL")
'根据资源名从动态链接库中加载相应的位图资源
hLoadedbitmap = LoadBitmap(hDLL, picName)
'获取位图信息
retVal = GetObj(hLoadedbitmap, Len(bmpInfo), bmpInfo)
'创建一个与图片框控件的设备描述表兼容的内存设备描述表
hdcMemory = CreateCompatibleDC(Form1.Picture1.hDC)
'将位图选入内存设备描述表
hOldBitmap = SelectObject(hdcMemory, hLoadedbitmap)
'将位图从内存设备描述表中拷入图片框控件的设备描述表中
retVal = BitBlt(Form1.Picture1.hDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight,
hdcMemory, 0, 0, SRCCOPY)
'将原始位图选入内存设备描述表
retVal = SelectObject(hdcMemory, hOldBitmap)
'删除加载的位图,释放其占用的所有系统资源
retVal = DeleteObject(hLoadedbitmap)
'删除内存设备描述表
retVal = DeleteDC(hdcMemory)
'释放动态链接库
FreeLibrary (hDLL)
End Sub
'调用声音资源子例程
Sub load_sound(wavName As String)
Dim hDLL As Integer
Dim hloadwave As Integer
Dim hwaveres As Integer
Dim hsound As Long
Dim hrelease As Integer
Dim resVal As Integer
hDLL = LoadLibrary(App.Path & "\DEMO.DLL")
'在动态链接库中查找资源类型为WAVE,资源名为wavName的资源
hwaveres = FindResource(hDLL, wavName, "WAVE")
'将该资源装入内存
hloadwave = LoadResource(hDLL, hwaveres)
'锁定该资源
hsound = LockResource(hloadwave)
'以同步方式播放内存中的声音资源
resVal = sndPlaySound(hsound, SND_SYNC + SND_MEMORY)
'释放该资源占用的内存
hrelease = GlobalUnlock(hloadwave)
FreeLibrary (hDLL)
End Sub
※FORM1.FRM代码清单
Private Sub cmdBitmap_Click(Index As Integer)
Picture1.Picture = LoadPicture("") '清空图片框控件
Select Case Index
Case 0
load_pic ("B1")
Case 1
load_pic ("B2")
End Select
End Sub
Private Sub cmdSound_Click(Index As Integer)
Select Case Index
Case 0
load_sound ("S1")
Case 1
load_sound ("S2")
End Select
End Sub
本实例程序已在Windows 3.X环境下通过测试。程序中的某些参数设置与特定需求
(如资源动态库的内容等)有关,读者在开发实际应用时应做相应的改动。
****************************************************************
****************************************************************
◆有问必答◆
★本期回答★
●067. 回答请mailto: yaozheng@kali.com.cn?subject=067
各位好!我是一名VC初学者,在数据库方面有几个问题想向大家请教:
1).如何遍历一个打开于使一个CDaoRecordset记录数据库?
2).如何实现类似Access中的自动填充字段的功能(即一个能自动按某种
规则自动产生并填充的字段)?用COleVariant类么?
请各位不吝赐教,谢谢!!
cbl@trigold.cngb.com
答:
想不到还有这么多人在用VC6写数据库的程序。
我用VC6写过两个数据库的程序,全部是用MFC的ODBC类(CRecordSet和CDataBase),
感觉很不好。理由如下:
用VC写数据库的程序有以下一些方法:
ODBC MFC,DAO,ADO,ODBC API,OLE DB,也可以写SQL,
分析与比较:
ODBC MFC:属高层应用,主要是用MFC中的CRecordSet类和CDataBase类,
使用非常方便,但功能不强,只适合写很简单的程序,如用
ACCESS97的库,且一般只能操作单表(是不是很臭啊)ODBC
的最大的卖点在于只要有相应的数据源的ODBC driver,就可
以操作这个数据源。如.DBF, .MDB等等。但同时也出现了它
的弱点,一旦机器上没有该driver,就无法操作,这一点DAO
就比ODBC好。但这还不是最大的弱点,它的最大的弱点是速
度慢,可能在这些介绍的方法中,ODBC MFC是最慢的。
DAO :属高层应用,与ODBC MFC差不多,只要把CRecordSet改成
CDaoRecordSet,CDataBase改成CDaoDataBase就行了。功能跟
ODBC MFC完全一样,连成员函数名都是一样的。速度比ODBC
MFC要略快。
ADO :属低层应用,不方便。用这个技术写数据库的程序,要一定的
水平。
ODBC API:属低层应用,很不方便,MS出版了一套(两本)《ODBC 程序
员参考手册...》,专门讲的ODBC API。如果是VC高手,且有
耐性的话,可以用它写出任意的数据库程序,但工作量极大。
OLE DB :其实叫它COM DB更合适,这才是MS主推的大方向。如果要用
OLE DB,首先要学会COM :(
它比较适合写数据库接口,功能强大,有COM的优点,但难度
也最大。
忠告:
用以上所有的方法,都不太可能写出功能强大,且界面华丽的应用程序。
除非写很简单的程序或数据库接口。如果想用很快的时间写出过得去的数
据库应用程序,恐怕还得用PB或Delphi。
推荐一本书:
《轻轻松松掌握用VC6写数据库程序》,美,Lyn Robison,电子工业出版社出版。
以上是我用了半年的时间摸索的一些经验和感想。可能有不对的地方,请
您提出保贵的意见和我一起讨论。
_____________________________________________________________
★本期提问★
072. 回答请mailto: yaozheng@kali.com.cn?subject=072
我用c++ build 编写一个小型的CAD,有几个问题百思不得其解
1、怎样用c++ build 读AUTOCAD 的文件 *。dwg?
2、我在Image上画线,当鼠标画线超过屏幕时,如何让Image自动翻屏?
孙建民 sunjm@trigold.cngb.com
073. 回答请mailto: yaozheng@kali.com.cn?subject=073
在DELPHI中使用数据库,由于DELPHI支持多种数据库,
请问我该选哪种数据库较好。
我是开发单机版的程序。ACCESS的MDB好吗?
若需要在数据库中存图像、声音,又该选哪种较好呢?
恳请帮助。 bingji@sonic.net.cn
074. 回答请mailto: yaozheng@kali.com.cn?subject=074
我用VB6编了一个MDI程序, 在MDI父窗体上有一个工具条。我希望在显示
其它子窗体时, 该工具条能被相应的子窗体的工具条所替换。(就像MDI
子窗体显示时, 子窗体的菜单替换MDI父窗体的菜单一样)。不知如何才
能实现。 chcw@263.net
提问信箱: yaozheng@kali.com.cn?subject=question
如果您有什么疑难问题,请发到上面的信箱里,我会及时把您的问题放在
杂志上的,希望编程高手们能不吝赐教,也希望这个栏目能成为大家交流
的场所。
****************************************************************
****************************************************************
◆编者的话◆
本刊已加入【CHINA-EZL】中国电子杂志联盟
联盟主页地址 http://china-ezl.yeah.net
◆欢迎光临我的个人主页
●《编程技术》 http://person.zj.cninfo.net/~yao
本刊的同名主页,主要以收集各类编程工具和程序源代码为主。
●《C++ Builder世界》 http://cppbuilder.soim.net
本人最新制作的个人主页,是一个探讨C++ Builder编程的专题
网站,为广大的C++ Builder爱好者搜集关于C++ Builder的一切。
◆《编程技术》订、退方法:
请到本刊主页进行订退工作 http://person.zj.cninfo.net/~yao
如果您觉得这份刊物还不错的话,欢迎把它介绍给您的朋友.
不知道您看了这期刊物有什么想法或者是意见,欢迎向我提出来.
本人感激不尽,我的联系方法如下:
E-mail:yaozheng@kali.com.cn
ICQ#: 43260473
**************************THE END**************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -