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

VB利用API函数实现VB特殊窗体的两种方法

HTML文档下载 WORD文档下载 PDF文档下载
VB利用API函数实现VB特殊窗体的两种方法

   在VB集成开发环境(IDE)中,设计程序时所新建、添加的窗体都是矩形的。如果出于某种需要,想让窗体在运行时呈现出特殊的形状,就必须借助API函数编写相应的代码。
  [方法一]使用区域创建函数
  常用的区域创建函数有:
  CreateEllipticRgn
  '创建一个椭圆或圆形区域
  CreateRoundRectRgn
  '创建一个圆角矩形区域
  CreatePolygonRgn
  '创建一个由一系列点围成的区域
  CombineRgn
  '将两个区域组合为一个新区域
  SetWindowRgn
  '设置新的窗口区域。
  通过CombineRgn可以取两个区域的并集、交集等组合,从而创建出复杂形状的窗体。例如,以下程序得到的窗体形状为两个相连的月牙形:
  '例程1
  Option Explicit
  'API声明
  Private Declare Function CreateEllipticRgn Lib“gdi32" _
  ByVal x1 As Long, ByVal Y1 As Long, _
  ByVal x2 As Long, ByVal Y2 As Long) As Long
  Private Declare Function CombineRgn Lib “gdi32" _
  (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, _
  ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
  Private Declare Function SetWindowRgn Lib “user32" _
  (ByVal hWnd As Long, ByVal hRgn As Long, _
  ByVal bRedraw As Boolean) As Long
  '常数声明
  Const RGN_XOR = 3
  Private Sub Form_Load()
  Dim Rgn1, Rgn2
  Rgn1 = CreateEllipticRgn(100, 100, 400, 400)
  Rgn2 = CreateEllipticRgn(200, 100, 500, 400)
  CombineRgn Rgn1, Rgn1, Rgn2, RGN_XOR
  SetWindowRgn hWnd, Rgn1, 1
  End Sub
  [方法二]使用BeginPath、EndPath、TextOut、PathToRegion等函数
  BeginPath函数调用启动一个路径分支,在这个命令后执行的GDI绘图命令会自动成为路径的一部分,Windows95中合法的路径函数有文本绘图函数TextOut、绘制多边形函数Polygon等。
  EndPath函数用于结束定义一个路径,如果调用成功,BeginPath函数和它之间发生的所有绘图操作都将在指定设备场景的路径中生效。BeginPath函数一般与EndPath函数成对出现。
  PathToRegion函数调用将当前选定的路径转换到指定区域中。
  TextOut函数的声明如下:
  Declare Function TextOut Lib “gdi32" Alias“TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
  参数说明如下:
  hdc :设备场景的句柄 ;
  x,y :绘图的起点,采用逻辑坐标 ;
  lpString:欲绘制的字串 ;
  nCount:字串中要绘制的字符数量,一个汉字的字符数量为2 。
  以下程序生成一个宋体的“国”字形的窗体:
  '例程2
  Option Explicit
  '类型声明
  Private Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
  End Type
  'API声明
  Private Declare Function BeginPath Lib “gdi32" _
   (ByVal hdc As Long) As Long
  Private Declare Function TextOut Lib “gdi32" _
  Alias“TextOutA" (ByVal hdc As Long, _
  ByVal X As Long, ByVal Y As Long, _
  ByVal lpString As String, _
  ByVal nCount As Long) As Long
  Private Declare Function EndPath Lib “gdi32" _
  (ByVal hdc As Long) As Long
  Private Declare Function PathToRegion Lib“gdi32" _
  (ByVal hdc As Long) As Long
  Private Declare Function GetRgnBox Lib“gdi32" _
  (ByVal hRgn As Long, lpRect As RECT) As Long
  Private Declare Function CreateRectRgnIndirect Lib “gdi32" _
  (lpRect As RECT) As Long
  Private Declare Function CombineRgn Lib“gdi32" _
  (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, _
  ByVal hSrcRgn2 As Long, _
  ByVal nCombineMode As Long) As Long
  Private Const RGN_AND = 1
  Private Declare Function DeleteObject Lib“gdi32" _
  (ByVal hObject As Long) As Long
  Private Declare Function SetWindowRgn Lib “user32" _
  (ByVal hwnd As Long, ByVal hRgn As Long, _
  ByVal bRedraw As Boolean) As Long
  Private Declare Function ReleaseCapture Lib“user32" _
  () As Long
  Private Declare Function SendMessage Lib “user32" _
  Alias “SendMessageA" (ByVal hwnd As Long, _
  ByVal wMsg As Long, ByVal wParam As Long, _
  lParam As Any) As Long
  PrivateConst WM_NCLBUTTONDOWN = &HA1
  Private Const HTCAPTION = 2
  '窗体代码
  Private Sub Form_Load()
  Dim hRgn1, hRgn2 As Long
  Dim rct As RECT
  With Me
  .Font.Name = “宋体"
  .Font.Size = 200
  .FontTransparent=true
  '读者可设置为False观察其效果
  End With
  BeginPath hdc
  '为窗体形状产生路径
  TextOut hdc, 10, 10,“国", 2
  EndPath hdc
  hRgn1 = PathToRegion(hdc)
  '将指定路径转换为区域
  GetRgnBox hRgn1, rct
   '获取完全包含指定区域的最小矩形
  hRgn2 = CreateRectRgnIndirect(rct) '创建rct确定的矩形区域
  CombineRgn hRgn2, hRgn2, hRgn1, RGN_AND
   DeleteObject hRgn1
  '删除GDI对象,释放占用的系统资源
  SetWindowRgn hwnd, hRgn2, 1
  End Sub
  Private Sub Form_MouseDown(Button As Integer, Shift _
  As Integer, X As Single, Y As Single)
  '移动窗体
  ReleaseCapture
  SendMessage hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0
  End Sub
  Private Sub Form_DblClick()
  '卸载窗体
  Unload Me
  End Sub
  如果想得到各种图案窗体,可以将窗体字体属性设置为Webdings、Wingdings、Wingdings1、Wingdings2、Wingdings3、Monotype Sorts等,这些字体中包含大量的图形字符,例如,Webdings字体下,代码“TextOut hdc, 10, 10, ‘J’, 1”可以得到风景画轮廓的窗体;Windings字体下,代码“TextOut hdc, 10, 10, ‘(’, 1 ” 可以得到电话形状的窗体。通过Windows附件中的字符映射表能够方便地浏览或选择、复制适用的字符。需要提醒的是,程序运行的机器中必须装有该字体。
  对比两种方法,方法一适合于创建几何形状简单的窗体,复杂的窗体理论上虽然可以实现,但操作起来比较困难。方法二简单易行,虽然有一定的局限性,但能够使窗体具有各种字体中各个字符的形状(你甚至可以利用造字程序自己“画”一些图形),还是很令人兴奋的。
  创建特殊窗体时,需要注意以下几点:
  1.如果窗体的Borderstyle属性没有设置为None,即使运行时标题栏不可见,但相应的键盘操作,如“Alt+空格键”、“Alt+F4”等依然有效;如果Borderstyle属性为None,最小化、窗体移动、退出等功能必须编写相应的代码来实现。当然,使用特殊窗体制作软件封面就不需要考虑那么多了。
  2.因为没有常规矩形窗体的立体边框效果,窗体的背景色应尽量采用醒目的颜色。
  3.特殊窗体的使用必须得当,用得好自然锦上添花,否则给人以哗众取宠之感。(北京 冯新强)
Delphi系 统 提 示 信 息 的 汉 化 DELPHI下的多线程程序设计 Delphi下汉字输入法的编程及使用 在Delphi与C++之间实现函数与对象共享 DELPHI中处理时间 Delphi中的INI文件编程 DELPHI中的消息处理机制 Delphi中对目录拷贝、删除和搬移的操作 Delphi中任务栏状态区的编程 Delphi中如何处理2000年问题 Delphi中如何实现系统权限的设置 Delphi中异常的截获及其个性化处理 Delphi自定义消息应用一例 Delphi5中资源文件的创建和使用 Delphi的Bug-Tthread Suspend方法 Email服务器的简单实现-Delphi资料 Hook的制作-Delphi资料 INI文件的应用-Delphi资料 NT中的关闭计算机,重新登陆的实现-Delphi资料 Windows 系统方面-Delphi资料 Windows外壳扩展编程-Delphi资料 避免二次运行-Delphi资料 编程实现文件关联-Delphi资料 编写定制的文件流实现文件读写加密-Delphi资料 采用多线程进行数据采集-Delphi资料 产生临时文件名-Delphi资料 程序不出现在任务栏-Delphi资料 程序缩小为任务条右下角的小图标-Delphi资料 得到 Windows 用户名和序列号-Delphi资料 得到windows临时路径-Delphi资料 得到Windows用户名和序列号-Delphi资料 获得一个窗口的句柄,如何获取该窗口的Height和Width 怎样让程序停留指定的时间间隔? 一定要装oracle的客户端,才能在system DSN的添加中看到oracle的数据源驱动程序吗? 一个关于多进程udp连接的重发的问题 怎样把金钱变量转换成字符串变量? 有人知道如何在application中取出拨号地址的吗? 这不公平!!!!!!! Delphi 指针问题,请大家帮忙! web assistant怎么根据数据库中的数据生成一个页面?那个页面要我自己的样式? 大家帮我看看错在那里!谢谢! 请问有没有用自己的机子作服务器的? 帮我看看代码 日志钩子的安装问题? 如何使用。MDB文件 由于上一题回帖子的人数众多,导致分数不够,所以再开一帖!继续!关于用vb进行文件的读写问题! 怎样在数据库中输入了许多条记录后, 一次性存盘成功? 改变光驱盘符?很急很急 在Oracle中怎样加已经存在的数据文件? 我想请高手帮忙 !! 请问目前那一本参考书对DELPHI初学者有很大提高? 一个关于udp重发的问题 如何在delphi程序里调用vc写的exe执行文件。 如何将query中的内容输出到文本文件,然后还能将该文本文件再导入进来?急急急!!!!!!!!!!! 急急急!!我的计算机找不到硬盘了45分 如何求任意多边形的重心 紧急求助:请问java有没有比较丰富的多媒体控件?比如录音的控件??? 急急急!!!我的计算机找不到硬盘了,45分 如何把一个字段的内容求和,然后把结果存入另一表! 请教,怎样把一个记录数组用VB读入ACCESS 2000数据库中? 关于货币类型的问题? the script too large ????????我快疯了。 什么地方有Sybase与Oracle的比较资料? 急急急!!!我的计算机找不到硬盘了,40分 问一下大家 复活节彩蛋 win2000 professional下如何配置weblogic6.0 jsp和javasript如何通讯? 急!!!如何把'¥100'字串转化为浮点型100.00 用OleContainer1将一个WORD文档存进数据库后如何将它从数据库中取出??? 关于SNMP的问题(请高手回答,送40分) 谁想过要戒水?戒成了吗?又渴了吗? 我用在各种机器上使用Win2000,从来没有down过, 真是太奇怪了??? 请问如何确定操作系统系统是中文的还是英文的? 向外国用户发注册码时候应该说些什么,才能让别人觉得你比较专业? 如何捕获ADO的异常信息 struct结构的数据存储是用的什么顺序方式呀? 能介绍几本关于BCB的适合初学者阅读的书吗? 高手进来,struct结构的数据存储是用的什么方式呀 高分!高手请进!!! Newton 有关StoredProc的 商务信函——填空Dear Sirs,We write to i___ ourselves as one of the l__ exporters from Brazil of a wide r__ of exvacators.We a__ to this letter a list of products we are r___ exporting and t__ that some of the i___ will be of great i___ to you 发邮件给某人英语 英语有哪些标点符号 商务英语信函(关于产品介绍)的填空Dear sirs,We are very pleased to receive your _______ of 15th January and _________ our illustrated _________ and price list giving the details you ask for.Also by separate ________ we are sending yo 给……发邮件到…… 英语怎么说? 英文里为什么很少用标点符号?印象中括号,引号,破折号都很少见,书名号更是根本没有,常用的只有逗号句号和问号,偶尔能看到个引号.这是为啥捏?3Q 英语信题目,写一份信函你9月2日写了一封信给上海音像出版社订购50箱CD碟,现在写信希望对方能够确认已收到订单,并再次附上订货信附件.你的公司名称:Music Store你的地址:Parker Lane,London N 1 在写EMAIL的时候一些英语单词的简写有哪些?比如把YOU写成U 英语翻译英文句子里电影名字是用《》书名号括上,还是用“”引号括上? 英文商务信函 回复请帮我写封信.大概想表达的意思是:您的支票我已经收到了,但是您把我的名字写错了,是qiu 不是qui,结果中国银行不让我兑现,您能不能改正之后 在发张支票过来,我不大懂 你每周给你的朋友发多少封电子邮件?英语怎么写? 填写标点符号, 英语翻译dear sir/madam,we wish to refer to our Order No.4567 for ten tons of processed polyethylene due to be shipped at the end of next month .when this order was placed,our stocks were considered to be sufficiently enough to last until Septembe 英语单词email的用法英语单词“email”的具体用法 标点符号填写1雨的力量在于它可使一望无际的黄土高原转眼变得沟沟壑壑()混乱不堪()而知识的力量则在于它可改变命运()扭转乾坤(),缔造美好的未来.2不要在光线暗的地方看书( 商务信函翻译成英语.谢敬启者: 事由:衬衫 我们从一本贸易杂志上得知贵公司名称和地址,同时我们获悉贵公司是当地纺织行业领先企业.很荣幸写信给贵方,希望和贵方建立业务关系. 我们 发电子邮件的英语单词 填写标点符号 英语翻译感谢您快速的回复,你的报价我们已经收悉,但是很遗憾你方价格偏高,我们希望你们重新考虑报计算价格并报给我们一个最具有竞争力的价格,并且我们想知道你生产的此种货物 英语翻译Hätte Interesse an diesem Tablet.Meine Frage wäre:Kann man eine 32 GB Karte dazu bekommen.Dann gibt es dazu noch eine passende Tasche.Haben Sie diese vielleicht auch zum Verkauf.Wenn ja,wie teuer?Wenn man 2 Tablet-PCs kauft,best 问一个标点符号书写问题如果用格子信纸书写到每一行还有一个空格时,这时正好这句话还差一个字,如果加上句末的标点符号就需要两个空格了.通常遇见这种情况下是不是这最后一个空格就 商务信函英语,Ⅲ.英译中1.On the recommendation of Sunshine Trading Corp.,we have learned your name and address.2.We shall be grateful if you will send us your samples immediately.3.We trust there's a good prospect for our business through ou favourite 在美式英语中怎么拼写 名信片的英语怎么写 英语邮件怎么写? “电邮”用英文怎么写 英语比赛,要写一篇英语作文,布置怎么写英语信. 英语翻译别肉鸡! 这封英文信如何写?由于某个客户的订单量太少,老板决心停止与其的发展.现在要写这样一封信,委婉的表达该意思,我该如何写是好?50分悬赏,好的话再酌情追加. "英文怎么写?你...以上英文怎么写? 英语翻译你买到了倩碧吗?如果没有,那就不要买了,我有个哥哥最近去了加拿大旅游,他也可以帮我带倩碧,如果你买到了,你打算怎么给我呢? 谢谢你的回信.以及你对我的家人和公司的关心.我们都很好,希望你也很好.这么长时间没有联系,我感到抱歉,因为近来工作实在是太忙了.很期盼你来到北京观看08年奥运会,相信那一定是一次让 英语信怎么写 英语翻译再次打扰你.根据你们图纸上的要求,我们需要在XXX(产品名称)上张贴三种LABEL,但是你们目前仅建立了两种LABEL的信息在LSWEB,还差一种,请帮忙完成下. 原文:照片收到.不知你现在可好,奥运会期间有没有来北京?这些照片是我在杭州西湖拍的,西湖,那里很美,是人间天堂.你还会来中国吗?祝愿你一切顺利!吻你漂亮的女儿. 《信我 》的英文怎么写 英语email格式写家人的爱好 求助写封英文信假设你是李华,你的朋友来中国玩,请写信邀请他来你家乡玩,用英文写,活动内容有游泳,跑步,爬山,吃海鲜,交通坐飞机,机场有45路车,到最后一站下,会去接他 我喜欢你 你信么英语 代写英文Email,非常急,关于询价,直白就可以. 中文意思如下:收到你的信很高兴,我看了你的相册,真羡慕你走了那么多的地方,每个地方都留下了很多故事和回忆吧,真好!真的很希望我也能早点去你走过的地方看看.你在家平时都做些什么 我说我喜欢你,你信不?英文怎么翻译 :电子邮件地址 英文怎么说 谁能帮我写英文信信的大致内容是:我叫XXX 我是那个中国孩子 很高兴能与您相识 并且成为一个临时家庭 我的英文不是太好 我想您已经了解 很抱歉我迟来的问候 请带我向您的家人问好还有 见信速回用英语怎么写 用英语怎么写,email 一份写给父母的英文信内容是我在大学中生活个方面的增加了,而且物价也在涨,等原因.希望你的父母能给你增加生活费. 他在信中写了什么吗 用英语怎么说 英语翻译:我已经收到你发来的电子邮件,现在我给你谈谈我上网的感受 中文标点和英文标点转换有没有快捷键转换中文标点和英文标点?而不用再去输入法图标上点击. 昨晚我写了一封信(求英语翻译) 你也可以往这里给我发邮件 ←求英文翻译 输入的中文标点符号与英文标点符号有什么区别?中文标点符号与英文标点符号主要是什么功用. 英语信怎么写啊 英语翻译主要是“相关人士”的准确翻译, 怎样切换中文标点和英文标点? ( )the( )( )English?翻译:这封信是用英语写的吗? 英语翻译附档是C的验货报告,请查阅 关于英文里的标点符号今天上课就是讲这个..听不太懂....不是句号实不实心的问题...是想问在句子中分段的用法.. 英语翻译MIKE JASON先生您好:在北京的机械展览会上,有幸认识您十分的高兴.我公司是经营脚轮,履带板翻新等项目.希望能与贵公司合作.下面是我公司的联系方式天津XX脚轮厂地址:天津市河东区
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn