【www.xzxrv.com--唯美的句子】
API实现完美的图片出现效果
作者:罗玉强
在用Visual Basic编程的时候,通常要调用图片,如果图片出现的时候是以各种完美的效果出现的,(如马赛克效果,百叶窗效果等)则你的程序就会显得更加灵活,你的程序就会更加专业化。本文讲述了Visual Basic中如何调用API函数,以及用API函数中的BitBlt函数实现各种完美的图片出现效果的过程。
1 一般的图片出现效果
一般情况下,要使Visual Basic中的图片出现,例如,要显示Picture1中的图片,只需一句代码:
Picture1.Visible=True
使用以上方法时,图片是突然出现的。也可以编复杂一点的代码,使图片从左到右、从上到下或从中间向四周扩大。例如,使Picture1中的图片从左到右出现,其代码为:
Picture1.Width = 0
Picture1.Visible = True
For i = 0 To 5000 Step 50 注释:5000代表图片的高度
Picture1.Width = i
Next i
使Picture1中的图片从上到下出现的代码为:
Picture1.Height = 0
Picture1.Visible = True
For i = 0 To 4000 Step 40 注释:4000代表图片的宽度
Picture1.Height = i
Next i
使Picture1中的图片从中间向四周扩大的代码为:
Picture1.Width = 0
Picture1.Height = 0
Picture1.Visible = True
For i = 0 To 100
Picture1.Width = Picture1.Width + 50
Picture1.Height = Picture1.Height + 40
Picture1.Left = Picture1.Left - 100
Picture1.Top = Picture1.Top - 80
Next i
当然,你可以灵活地应用以上办法实现其他更加好看的图片出现效果。然而,同Authorware等其他软件编制的程序相比,你的图片出现效果仍然会黯然失色,因为Authorware编程时,可以很容易地实现从上到下、从左到右、百叶窗、开门、关门等完美的图片出现效果,要在Visual Basic中做到这些效果并非易事。
但“天无绝人之路”,强大的Windows API函数中的BitBlt函数将帮助您实现这一愿望。
2 BitBlt函数
一、 BitBlt函数的功能
BitBlt API函数的功能是将屏幕上任何一块拷贝到屏幕上其它任何一个地方。
二、 声明BitBlt函数
1. 运行Visual Basic4.0程序组中的API Text Viewer程序项。
2. 在API Text Viewer中,单击File菜单下的Load Text File...命令。
3. 在出现的Select a Text API File对话框中,选择Win32api.txt文件。
4. 为了使以后拷贝Windows API函数更快,你可以将Win32api.txt文件转换成为一个数据库。如图,单击“是(Y)”。
5. 在API Type下拉框中选择Declare。
6. 在Available Items中选择BitBlt,如图,单击Add按纽,于是BitBlt便出现在Selected Items框中,单击Copy按纽。BitBlt函数变拷贝到剪贴板上。
7. 关闭API Text Viewer,打开Visual Basic程序,使用Insert菜单下的Module命令新建一个Module1,使用Edit菜单下的Paste命令,将剪贴板上的BitBlt函数拷贝到Module1中。这样,在您的程序中,就可以使
用BitBlt函数了。
三、BitBlt函数中各参数简介
Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
以上是BitBlt函数的声明格式,其中,各参数定义如下:
参数
描述
hDestDC
接收位图的设备描述表
X
目标矩形左上角的逻辑X坐标
Y
目标矩形左上角的逻辑Y坐标
nWidth
目标矩形的宽度
nHeight
目标矩形的高度
hSrcDC
源设备描述表
xSrc
源位图左上角的逻辑X坐标
ySrc
源位图左上角的逻辑Y坐标
dwRop
拷贝模式
dwRop的各种可能值为:
&HCC0020
dest=source
&HEE0086
dest=source OR dest
&H8800C6
dest=source AND dest
&H660046
dest=source XOR dest
&H440328
dest=source AND (NOT dest)
&H330008
dest=not source
&H1100A6
dest=(NOT source)AND(NOT dest)
&HC000CA
dest=source AND pattern
&HBB0226
dest=(NOT source) OR dest
&HF00021
dest=pattern
&HFB0A09
dest=Dpsnoo
&H5A0049
dest=pattern XOR dest
&H550009
dest=NOT dest
&H42&
dest=BLACK
&HFF0062
dest=WHITE
在本程序中使用的BitBlt函数均定义dwRop=HCC0020,如果你定义dwRop为其他值,会收到其他异想不到的效果。
3 用BitBlt函数实现各种各样的图片出现效果实之完美可以使用这句话吗。
实现髦滞计鱿中Ч幕驹硎牵荷柚昧礁鐾计騊icture1和Picture2,在Picture1中装入要显示的图片,(可以在窗体设计时就装好,也可以在程序运行过程中装入。)将Picture1中的图片以各种方法拷贝到Picture2中,从而实现各种各样的图片出现效果。
先在Picture1中装入待显示的图片,并设置Picture1的属性为AutoRedraw=True,Visible=False, 设置Picture2的属性为AutoRedraw=False,Visible=True,设置Form的属性为ScaleMode=3。
一、从上到下效果
将Picture1从形式上分为很多小块
如图所示,要将Picture1中的图片拷贝到Picture2中,首先将Picture1从形式上划分为很多小块a1、a
2、a3、„,每块宽度为。
然后利用BitBlt函数先将Picture1中的a1块拷贝到Picture2中的相同位置,等待片刻,再拷贝a2块、
一、整体解读
试卷紧扣教材和考试说明,从考生熟悉的基础知识入手,多角度、多层次地考查了学生的数学理性思维能力及对数学本质的理解能力,立足基础,先易后难,难易适中,强调应用,不偏不怪,达到了“考基础、考能力、考素质”的目标。试卷所涉及的知识内容都在考试大纲的范围内,几乎覆盖了高中所学知识的全部重要内容,体现了“重点知识重点考查”的原则。
1.回归教材,注重基础
试卷遵循了考查基础知识为主体的原则,尤其是考试说明中的大部分知识点均有涉及,其中应用题与抗战胜利70周年为背景,把爱国主义教育渗透到试题当中,使学生感受到了数学的育才价值,所有这些题目的设计都回归教材和中学教学实际,操作性强。
2.适当设置题目难度与区分度
选择题第12题和填空题第16题以及解答题的第21题,都是综合性问题,难度较大,学生不仅要有较强的分析问题和解决问题的能力,以及扎实深厚的数学基本功,而且还要掌握必须的数学思想与方法,否则在有限的时间内,很难完成。
3.布局合理,考查全面,着重数学方法和数学思想的考察
在选择题,填空题,解答题和三选一问题中,试卷均对高中数学中的重点内容进行了反复考查。包括函数,三角函数,数列、立体几何、概率统计、解析几何、导数等几大版块问题。这些问题都是以知识为载体,立意于能力,让数学思想方法和数学思维方式贯穿于整个试题的解答过程之中。
使用CSS完美实现垂直居中的方法
使用XHTML+CSS实之完美可以使用这句话吗。
来实现元素的垂直居中一直是前端开发中的一个比较复杂且棘手的问题,作为网页设计师或前端开发工程师,这个垂直居中问题也是必须掌握的技巧之一,一些互联网公司面试题中也会出现这类题目。
1.已有一个已定义高度的容器(如<div>)
2.内部有一个未知高度的对象(也许是后台动态生成的文本,放在另一个<div>中)
3.我想让内部的对象在容器内垂直居中。
4.不使用HTML的表格(table元素),也不使用Javascript。
该CSS垂直居中的方法: 最大的问题:IE浏览器的Bug。
大部分浏览器能理解CSS中的display:table之类的表格方式声明,但IE7及其以下的旧版IE无法理解这个声明。
解决办法:让大部分能理解display:table声明的浏览器使用vertical-align属性达到垂直居中,让IE7及以下版本用自己理解高度的Bug来解决居中问题。 IE Bug:
IE7及以下版本理解高度的Bug:如果a容器内有b对象,a容器并没有设置高度值,如果b对象有实际内容(如文字),那么就会将a的高度理解为与b相等。那么如果对b采取相对定位,b就会相对于在a中的原始位置移动(主要利用百分比高度)。
eg:a未定义高度,b的高度为100px,将b相对定位,并设top:-50%
在这种情况下:标准浏览器由于未知a的高度,所以b不动。而IE7及以下版本则会让b相对a的高度(其实等于b的高度)上移50%,也就是50px 。 如何仅让IE7及以下版本理解对它们的声明?
1.Pixy曾发明underscore hack,就是在每个
CSS属性前加一个下划线”_”,这个hack是专门针对IE6及以下版本的,也就是说IE7无法理解。
如:_position:absolute; 所以这种hack就PASS!
2.在属性前加”#”的声明正好可以仅让IE7
及以下版本理解,而其它任何浏览器都无法理解这个”#”,所以”#”后的声明就会被其它浏览器忽略掉。 OK~~就这个!
目前为止兼容直到IE8.x的所有IE浏览器、Gecko核心浏览器
(Mozilla,Firefox,Netscape 7)、Opera 7、Webkit核心浏览器(Safari及Google Chrome)。
CSS部分:
#outer {
display:table;
height:400px;
#position:relative;
overflow:hidden;
}
#middle {
display:table-cell;
vertical-align:middle;
#position:absolute;
#top:50%;
}
#inner {
#position:relative;
#top:-50%;
}
XHTML部分:
<div id=”outer”>
<div id=”middle”>
<div id=”inner”>
<!–这里是要垂直居中的内容–>
</div>
</div>
</div>
经测试,该方法也适用于图片垂直居中,建议在使用的时候定义好outer层的宽度。
后台调用外部程序的完美实现(Delphi)
最近在做的一个软件,其中有一部分功能需要调用其它的软件来完成,而那个软件只有可执行文件,根本没有源代码,幸好,我要做的事不难,只需要在我的程序启动后,将那个软件打开,在需要的时候,对其中的一个文本矿设置一些文字,再点击一个按钮就可以了。
说到这里,相信你也有了对该功能的一些初步设想了,没错,其基本思路就是:
1)调用CreatePRocess()打开目标程序。
2)用FindWindow()找到目标程序的窗口Handle。
3)找到文本框的Handle,以及按钮的MessageID,用SendMessage()方法设置文字,并触发事件。
好了,这样确实很简单吧,但是当我实现它后,却发现这样做的结果则是:当我的程序启动并打开目标程序时,它的Splash窗口,以及主窗口都将显示出来,即使当我用FindWindow()找到主窗口Handle后,调用SendMessage(WindowHandle, SW_HIDE)来隐藏该窗口,还是会有一瞬主窗口被显示出来的,这样的效果实在是最求完美的我不忍心看到的。
那么怎么解决这个问题呢,首先我当然在CreateProcess()上面寻找方法,可惜,它只有一个参数可以设置窗口的默认显示方式,但是一旦这个窗口自己重设了显示方式,它就没有任何作用了。。。。继续查找文档,这时我看到CreateProcess()的一个参数TStartupInfo中有 lpDesktop这么一个属性,按照MSDN的说法,如果该指针为NULL,那么新建的Process将在当前Desktop上启动,而如果对其赋了一个Desktop的名称后,Process将在指定的Desktop上启动,恩,看来不错,就从它入手了:
1)首先,建立一个虚拟的Desktop,
const
DesktopName = 'MYDESK';
FDesktop:=CreateDesktop(DesktopName,nil,nil,0,GENERIC_ALL,nil);
Windows中可以建立多个Desktop,可以使用SwitchDesktop()来切换哪个Desktop被显示出来,以前有过将Windows模拟成linux的形式,可以在多个虚拟Desktop中切换的程序,其实那种程序也是用的Windows本身的虚拟Desktop功能来实现的,另外 Windows的启动画面,以及屏保画面也都是用虚拟Desktop实现的,好了,关于这方面不多介绍了,感兴趣的话,可以到MSDN中查看更详细资料:
2)在CreateProcess的时候,指定程序在我新生成的Desktop上运行:
var
StartInfo:TStartupInfo;
FillChar(StartInfo, sizeof(StartInfo), 0);
StartInfo.cb:=sizeof(StartInfo);
StartInfo.lpDesktop:=PChar(DesktopName); //指定Desktop的名称即可
StartInfo.wShowWindow:=SW_HIDE;
StartInfo.dwFlags:=STARTF_USESHOWWINDOW;
StartInfo.hStdError:=0;
StartInfo.hStdInput:=0;
StartInfo.hStdOutput:=0;
if not CreateProcess(PChar(FileName),nil,nil,nil,true,CREATE_NEW_CONSOLE+HIGH_PRIORITY_CLASS,nil,PChar(ExtractFilePath(FilePath)),StartInfo,FProceInfo) then begin
MessageBox(application.Handle,'Error when init voice
(5).',PChar(Application.Title),MB_ICONWARNING);
exit;
end;
3)用FindWindow去找程序的主窗口
开始我直接写下了这样的代码:
for I:=0 to 60 do begin //wait 30 seconds for open the main window
WindowHandle:=FindWindow(nil,'WindowCaption');
if WindowHandle<>0 then begin
break;
end;
Sleep(500);
end;
但是,实践证明,这样是找不到不在当前Desktop中的Window的,那怎么办呢:
答案是,可以用SetThreadDesktop()函数,这个函数可以设置当前Thread工作所在的Desktop,于是我在以上代码前又加了一句:
if not SetThreadDesktop(FDesktop) then begin
exit;
end;
但是,程序运行后,该函数却返回了false,说明方法调用失败了,再仔细看MSDN,发现有这么一句话:
The SetThreadDesktop function will fail if the calling thread has any windows or hooks on its current desktop (unless the hDesktop parameter is a handle to the current desktop).
哦,原来需要切换Desktop的线程中不能有任何UI方面的东西,而我是在程序的主线程中调用该方法的,当然会失败拉,知道了这点就好办了,我只需要用一个“干净”的线程,让它绑定到新的Desktop上,再让它用FindWindow()方法找到我要找的WindowHandle,不就可以了吗,于是,这一步就需要借助一个线程了,线程的代码如下:
TFindWindowThread = class(TThread)
private
FDesktop:THandle;
FWindowHandle:THandle;
protected
procedure Execute();override;
public
constructor Create(ACreateSuspended:Boolean;const ADesktop:THandle);reintroduce; property WindowHandle:THandle read FWindowHandle;
end;
{ TFindWindowThread }
procedure TFindWindowThread.Execute();
var
I:Integer;
begin
//make the current thread find window on the new desktop!
if not SetThreadDesktop(FDesktop) then begin
exit;
end;
for I:=0 to 60 do begin //wait 30 seconds for open the main window
FWindowHandle:=FindWindow(nil,PChar('WindowCaption'));
if FWindowHandle<>0 then begin
break;
end;
Sleep(500);
end;
end;
constructor TFindWindowThread.Create(ACreateSuspended:Boolean;const ADesktop:THandle); begin
inherited Create(ACreateSuspended);
FDesktop:=ADesktop;
end;
而主程序中的代码变成这样:
FindWindowThread:=TFindWindowThread.Create(false,FDesktop);
try
FindWindowThread.WaitFor;
FMainWindowHandle:=FindWindowThread.WindowHandle;
finally
FindWindowThread.Free;
end;
if FMainWindowHandle=0 then begin
MessageBox(Application.Handle,'Error when init
(6).',PChar(Application.Title),MB_ICONWARNING);
exit;
end;
呵呵,成功,这样果然可以顺利的找到窗口Handle了。 voice
4)最后,再用这个主窗口Handle,找出里面的EditBox的Handle,如这样:
FEditWindow:=FindWindowEx(FMainWindowHandle,0,PChar('Edit'),nil);
我在这里指定了这个文本框的ClassName,这个名称可以用Spy++得到。
初始化的工作就到此结束了,如果顺利,程序就真正在后台被运行了起来。那么功能调用呢,还是和一般的做法一样:
if (FMainWindowHandle=0) or (FEditWindow=0) then begin
exit;
end;
SendMessage(FEditWindow,WM_SETTEXT,0,LongInt(@AText[1]));
SendMessage(FMainWindowHandle,WM_COMMAND,$8012,$0);
其中$8012这个数字,也是用Spy++来得到的资源ID。
最后,别忘了关闭程序,以及释放虚拟Desktop:
if FProceInfo.hProcess<>0 then begin
TerminateProcess(FProceInfo.hProcess,0);
end;
if FDesktop<>0 then begin
CloseDesktop(FDesktop);
end;
好了,这样就几乎完美的实现了一个后台调用程序的功能,它对最终客户来说将是完全透明的,客户根本感觉不到后台还有另一个程序在工作。是不是很爽啊,这样别人的很多程序我们都可以直接拿来用了(当然了,得在遵守版权的基础上才行拉)。
运用MOSFET实现完美安全系统 上网时间:2010-06-04
中心议题:
汽车电子系统中故障问题 车用组件保护技术 如何在温度过高的情况下达到自我保护作用
解决方案:
采用热滞后电路 确保器件吸收的能量不超过最大额定值
车上所使用的灯泡到继电器、从LED显示照明到起动马达,许多组件的多元应用,不仅提供了各式各样的高负载性、低成本效益的解决方案,另外也必须兼具注重安全性汽车所要求的通讯及诊断能力。因此,为了增加车上电子系统的可靠性及耐久性,除了降低维修成本之外,设计人员在功率器件中加入故障保护电路,才能避免组件发生故障,降低电子系统所造成损害。
另外,在一般汽车行驶的情况下,一旦出现了车上的组件出现故障状况,将导致汽车上的电路系统发生短
(MetalOxideSemiconductorFieldEffectTransistor;以下简称MOSFET)组件技术后,将能适时地保护发生故障的组件,或者在汽车线束及故障组件之间形成一个很高的阻抗,降低故障的发生率。
车用MOSFET组件与自我保护技术
新车型的设计在某种程度上依赖电子电路的设计,用来降低成本、提高可靠性及丰富功能,另一方面也随着电气及电子系统不断地增加,以及它们占大部分汽车成本和重量的现实情况,使得电路保护设计成为设计工作中的一个关键因素。因此,为了汽车上组件适用性的问题,一般汽车组件的设计工程师大都会使用外部传感器、分立电路或者是使用软件来加以因应。不过,以目前的发展趋势来看,随着技术持续的发展,MOSFET这可归类在多载式导电的单极型电压控制组件,除了具有高频率性能、输入阻抗高、驱动功率小、热稳定性优良等优点之外,还能使功率组件更能够符合最低的系统成本,藉以达到更为优异的故障自我保护系统。因此,大部分的设计人员转而采用具有保护作用的MOSFET功率组件来完成。
图说:一般的汽车电路系统架构,大致上可简单分为嵌入式与便利端口等两种形式,而目前所使用的技术规范中,定义了MOSFET组件的技术规范。
在过去这几年当中,在汽车内、外部安装了电子设备,藉以控制汽车主体功能的汽车厂商持续地快速增加,使得车用半导体的应用数量也有显著的提升。而在复杂的车用电子系统中,几乎所有使用的功率组件除了要能因应环境快速的变化之外,在面对到电子产品关闭瞬间电流,及负载切断电源故障所引起的高压变化时,能有其因应之道。
另外,还有一点就是当车内的环境工作温度一旦超过100℃∼120℃的时候(如:引擎室、轮胎周围等),很容易就会产生组件结温的情形,进而影响到组件的可靠度及其它可能发生故障的问题。还