CSDN 新帖速递 工程源代码及工程下载

dylike 2009-07-20 04:13:06
加精
   '附注:
'主要屏幕合成过程:
'DrawBP(目标窗体,要合成的图片,透明度)
'DrawBP合成未注释,请参阅Moudle1.vb
'文字描边效果参见DrawItems()
'程序占用资源释放参见代码结尾
'转载请保留此信息
'工程标题:桌面秀版CSDN VB.NET版块新帖速递 BY DYLIKE
'代码版本:VB.net 2008
‘工程文件及资源图片见附件
'http://dylike.czdown.com
'工程结构:
'Resources
'--BK.png '背景
'--close.png '关闭按钮
'--Light.png '光线
'--Min2.png '最小化按钮
'--Mouse2.png '鼠标箭头按钮
'--titlebar.png '项背景
'Form1.vb
'Module1.vb
'未标题-1副本.ico


Form1.vb
Imports System.Net
Public Class Form1
Private WB As Net.HttpWebRequest '使用HttpWebRequest
Private RP As Net.HttpWebResponse '用来获取WB数据
Private URL As String '论坛版块的网址,未启用,适用于以后修改成多版块浏览切换
Private RD As IO.StreamReader '读数据用
Private tmpSTR As String '用来临时处理的临时字串
Private WithEvents WBS As New WebBrowser '为方便,使用WebBrowser的载入完成事件
Private C1, C2 As Collection 'C1放置提取的文字,C2放置提取的链接
Private T1 As String = "<col class=" & Chr(34) & "function" & Chr(34) & " />" '从网页源码的哪里开始分析,通过该截断可以避免过多的无用链接
Private SF As New StringFormat '文字样式,如对齐等
Private LLB As Label '用来动态生成N个Label,并提供各自事件
Private BP2, BP3, BP4 As Bitmap '临时背景,加载动态配景,前景
Private ISBUSY As Boolean = False '是否忙碌?以显示底部光线动画
Delegate Sub AA() '委托用
Private TT As Threading.Thread '独立线程准备
Private III, JJJ As Integer '临用计算数字

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
NotifyIcon1.Dispose() '窗体关闭时消除托盘图标
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
On Error Resume Next '为避免不同电脑可能出现的问题,由于不需要针对错误处理,此处容错
SF.LineAlignment = StringAlignment.Center '文字垂直居中,详见列表项文字效果
SF.Alignment = StringAlignment.Near '文字水平居左,详见列表项文字效果
C1 = New Collection '新建数据组1
C2 = New Collection '新建数据组2
BP3 = New Bitmap(Me.Width, Me.Height) '初始化前景,置空
BP2 = New Bitmap(Me.Width, Me.Height) '初始化状态配景,置空
BP = New Bitmap(My.Resources.BK) '初始化背景,预置从资源读取
BP4 = New Bitmap(Me.Width, Me.Height) '初始化前景,置空,以准备绘制内容
DrawBP(Me, BP, 255) '绘制背景,此时无绘制状态配景及前景
Me.Show() '强制显示
Timer1.Enabled = True '激活计时器
TT = New Threading.Thread(AddressOf NewWBS) '独立线程准备
TT.Start() '独立线程开始工作
End Sub

Private Sub WBS_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WBS.DocumentCompleted
On Error Resume Next '容错处理
C1.Clear() '清空旧数据组1
C2.Clear() '清空旧数据组2
For I As Integer = 0 To WBS.Document.Links.Count - 1 '循环获取网页所有链接
If WBS.Document.Links(I).OuterHtml.Contains("TopicManage") = False Then '是否有"Topicmanage"字样?如果没有,则接下去处理
If Trim(WBS.Document.Links(I).OuterText) <> "" Then '链接文字是否为空?
C1.Add(WBS.Document.Links(I).OuterText) '如果不是,则在数据组1加入链接文字
C2.Add(GetLink(WBS.Document.Links(I).OuterHtml)) '如果不是,则在数据组2加入处理后的对应链接网址
Else
C1.Add("无") '反之,加入空白内容,必须,否则出错
C2.Add("") '如果没有获取链接,则留空
End If
End If
Next
ISBUSY = False '工作忙完了?是的
DrawItems() '开始画前景
End Sub
Protected Overloads Overrides ReadOnly Property CreateParams() As CreateParams
Get
Dim cp As CreateParams = MyBase.CreateParams '获取扩展属性
cp.ExStyle = cp.ExStyle Or &H80000 '设置扩展属性
Return cp '应用扩展属性
End Get
End Property

Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
On Error Resume Next '考虑可能的用户鼠标操作速度,避免出错,此处容错处理
If e.Button = Windows.Forms.MouseButtons.Left Then '点击了左键?
ReleaseCapture() '捕获鼠标
SendMessage(sender.Handle.ToInt32(), WM_SysCommand, SC_MOVE, 0) '发送移动窗口的消息
End If
End Sub

Private Sub L_Click(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
On Error Resume Next '鼠标操作,尽可能使用容错处理,以免发生意外
If e.Button = Windows.Forms.MouseButtons.Left Then '点击了左键?
If Trim(sender.name) <> "" AndAlso C1.Count > 1 Then '点击的控件是不是我要的控件?此时数据组1是否已经有内容?
Dim TTMP As Integer = Int(sender.name.Replace("AAAA", "")) '过滤掉被点击控件名字中的多余字符,留下数字
Process.Start(C2(TTMP)) '点击后用默认的浏览器打开目标网址
End If
End If
End Sub

Private Sub L_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs)
On Error Resume Next '鼠标操作,容错处理
sender.image = My.Resources.titlebar '鼠标移上去时,项LABEL显示选择栏图片
DrawFore() '一点点改动就要即时绘制前景
If Trim(sender.name) <> "" AndAlso C1.Count > 1 Then '如果相同索引的数据组1里相同索引有内容
Dim TTMP As Integer = Int(sender.name.Replace("AAAA", "")) '获取数字
ToolTip1.SetToolTip(sender, C1(TTMP) & vbCrLf & "帖子作者:" & C1(TTMP + 1) & vbCrLf & "最后回复:" & C1(TTMP + 2)) '分配提示内容
End If
End Sub

Private Sub L_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs)
sender.image = Nothing '鼠标移出,无需容错,取消项背景
DrawFore() '绘制前景
End Sub
Private Sub DrawFore()
On Error Resume Next '此句容错一定要,不同的机器绘制速度差别原因可能会导致GDI+异常
If BP2 IsNot Nothing Then BP2.Dispose() '为避免占用过多内存,强制释放资源
BP2 = New Bitmap(Me.Width, Me.Height) '新开画布以准备绘制
Using G As Graphics = Graphics.FromImage(BP2) '开始绘制
For Each CT As Control In Me.Controls '枚举窗体中所有控件
If CT.Name.Contains("AAAA") = True AndAlso TypeOf (CT) Is Label OrElse CT.Name.Contains("Light") = True Then '是否控件名称中包含指定内容并且排除一些不相关的控件
LLB = CT '临时赋值
If LLB.Image IsNot Nothing Then '区别于该项是否有鼠标在上面,即是否该项有image
G.DrawImage(LLB.Image, CT.Bounds) '绘制到画布上
End If
End If
Next
End Using
If BP3 IsNot Nothing Then BP3.Dispose() '为避免占用过多内存,强制释放资源
BP3 = New Bitmap(Me.Width, Me.Height) '新开画布以准备绘制
Using G As Graphics = Graphics.FromImage(BP3) '开始绘制
G.DrawImage(BP, New Rectangle(0, 0, Me.Width, Me.Height), New Rectangle(0, 0, Me.Width, Me.Height), GraphicsUnit.Pixel) '注意层次,先画背景
G.DrawImage(BP2, New Rectangle(0, 0, Me.Width, Me.Height), New Rectangle(0, 0, Me.Width, Me.Height), GraphicsUnit.Pixel) '再画前置于背景的其他图像
End Using
DrawBP(Me, BP3, 255) '屏幕合成
End Sub
Private Sub DH() 'DH.我的名字的拼音开头,可随意命名
Try
While ISBUSY = True '当工作状态处于忙碌时
If III >= 366 Then '检查光线是否已经超过了规定长度
III = -20 '如果超过,那么恢复-值,该值取决于后面的Step步进,否则会出现画面闪烁
End If
III += 20 '步进值,光线每次该增加多长
JJJ = 363 / 2 + 16 - LIGHT.Width / 2 '公式,使光线在窗体居中(排除窗体投影位置),结果为LEFT值
LIGHT.Width = III '光线新长度
LIGHT.Left = JJJ '光线左位置
If ISBUSY = False Then LIGHT.Width = 0 '工作状态完成了?那么光线消失
If BP4 IsNot Nothing Then BP4.Dispose() '即时释放资源
BP4 = New Bitmap(Me.Width, Me.Height) '准备绘制光线层
Using G2 As Graphics = Graphics.FromImage(BP4)
G2.DrawImage(My.Resources.Light, New Rectangle(LIGHT.Left, LIGHT.Top, LIGHT.Width, 5), New Rectangle(0, 0, 33, 33), GraphicsUnit.Pixel) '绘制光线
End Using
If BP3 IsNot Nothing Then BP3.Dispose() '释放资源
BP3 = New Bitmap(Me.Width, Me.Height) '准备绘制背景,光线,前景等
Using G As Graphics = Graphics.FromImage(BP3)
G.DrawImage(BP, New Rectangle(0, 0, Me.Width, Me.Height), New Rectangle(0, 0, Me.Width, Me.Height), GraphicsUnit.Pixel) '绘制背景
G.DrawImage(BP2, New Rectangle(0, 0, Me.Width, Me.Height), New Rectangle(0, 0, Me.Width, Me.Height), GraphicsUnit.Pixel) '文字层
G.DrawImage(BP4, New Rectangle(0, 0, Me.Width, Me.Height), New Rectangle(0, 0, Me.Width, Me.Height), GraphicsUnit.Pixel) '绘制光线层
End Using
DrawBP(Me, BP3, 255) '屏幕合成
Application.DoEvents() '避免假死
End While
LIGHT.Width = 0 '工作状态不再是忙碌
DrawFore() '绘制前景
Catch ex As Exception
LIGHT.Width = 0 '如果出错,让光线消失,避免给人一种正在加载的感觉
End Try
End Sub
Private Sub DrawItems() '绘制文字层[关键]
On Error Resume Next '同样考虑不同机器速度的GDI+异常,容错处理
'{
For Each CT As Control In Me.Controls
If CT.Name.StartsWith("AAAA") Then
CT.Dispose()
End If
Next
'提取窗体中所有带有指定内容的控件名的控件
'}
If BP IsNot Nothing Then BP.Dispose() '释放旧资源,使程序不要太过吃内存
BP = New Bitmap(Me.Width, Me.Height) '准备画布
Using G As Graphics = Graphics.FromImage(BP)
............................

End Module


由于我的网太慢及帖子字数限制,无法上传到网站上,需要工程源文件及附件的请到QQ群:59522396 共享里取.等网速快些了我再发上来.
除Moudle之外,其他代码我已经每句都写上中文注释了.
...全文
2756 117 打赏 收藏 转发到动态 举报
写回复
用AI写文章
117 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuhuatao123456 2012-03-09
  • 打赏
  • 举报
回复
楼主好人
liu_hjiang 2012-02-21
  • 打赏
  • 举报
回复
一根葱的无奈 2011-11-06
  • 打赏
  • 举报
回复
这干嘛用的?
lhjsj 2011-08-23
  • 打赏
  • 举报
回复
学习中
tongfeng1981 2010-09-07
  • 打赏
  • 举报
回复
学习了
ouxianzhi520 2009-11-09
  • 打赏
  • 举报
回复
好贴要顶,好代码要学
zrl05 2009-09-12
  • 打赏
  • 举报
回复
太厉害了,我什么时候能有这功底阿???
永不言弃SUN 2009-09-12
  • 打赏
  • 举报
回复
好贴就要顶
qiqundelang 2009-08-27
  • 打赏
  • 举报
回复
关注
ChrisAK 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 88 楼 dylike 的回复:]
引用 86 楼 fananndy 的回复:
请DYLIKE兄帮下忙:
您的绘制窗口外观的方法很强大,但是我把您的:绘制窗口的方法用到绘制控件上怎么不行了,请帮忙!!!!!!!!!!


屏幕合成不支持控件绘制
[/Quote]不仅不支持控件绘制,你还会发现拖上去的所有控件都看不到了.
并且除了Form外所有控件都不响应你的任何键盘鼠标事件.
所以除非做出一个类似WPF那样的完整的自绘的窗体库,
不然这玩意也就只能做做悬浮窗啥的囧....
vv0147 2009-08-11
  • 打赏
  • 举报
回复
吧他转成2005的就好了的
xunis 2009-08-10
  • 打赏
  • 举报
回复
建议一下 把打开窗口设置成打开新窗体么 要不一点帖子 我打开有用的网站就被刷了
xunis 2009-08-10
  • 打赏
  • 举报
回复
楼主好人,感谢分享!
lihaidomain 2009-08-10
  • 打赏
  • 举报
回复
谢谢楼主,楼主好心人!
gsk09 2009-08-04
  • 打赏
  • 举报
回复
On Error Resume Next是什么意思?
okroftnet 2009-08-03
  • 打赏
  • 举报
回复
谢谢楼主,楼主好心人!
jason819 2009-08-03
  • 打赏
  • 举报
回复
里面的代码写的不借,整体,说明也很到位,编程的功底还是相当不错的!
TianMine 2009-08-01
  • 打赏
  • 举报
回复
我想找到基础的教程 不知道谁有
immjt 2009-08-01
  • 打赏
  • 举报
回复
好东西,就是看的不太懂
chenrm_75 2009-07-26
  • 打赏
  • 举报
回复
好东西啊
先下载下来看看研究一下
加载更多回复(92)

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧