CP Vanity






4.93/5 (80投票s)
CodeProject 最近引入的声誉信息查看器;虽然徒劳,但很有趣
引言
本文介绍了一个 CodeProject 新引入的声誉信息查看器。虽然完全徒劳,但制作起来很有趣,而且可以方便使用。
整体功能
第一个视图显示单个账户的信息;它显示用户名(在小 WebBrowser 中渲染 HTML)、声誉图表以及文章列表(真实文章和技巧文章)。

第二个视图显示“最高成就者”列表,即在按声誉、文章数或消息数查询时出现在“谁是谁”页面上的人员。此处列出了所有声誉类别的值。

第三个视图提供了相同成员的计数器值。

一些功能细节
已付出一些努力来提供用户舒适的功能
- 更改的
用户 ID
会存储在注册表中;在CurrentUser\Software\CPVanity\MemberID 下使用一个注册表项,因此该实用程序将显示上一个会话中显示的最后一个账户;除非它在按住 Control 键时启动(不显示任何账户),或者在命令行上传递了userID
(是的,您可以为多个账户创建桌面快捷方式)。 - 为遵循 CodeProject 的惯例,按 CTRL/F5 将刷新当前视图。
- “最高成就者”视图应用了 CodeProject 的着色方案(白、铜、银、金和铂金)。
- 每个声誉类别的冠军将获得闪烁的红色背景,而(如果有的话)一个账户在“最高成就者”中出现时将获得闪烁的绿色背景。此闪烁效果取决于复选框,并存储在另一个注册表项CurrentUser\Software\CPVanity\Blinking 中。
- “最高成就者”页面提供了所有列出账户的个人资料页面链接;当按住 Control 键单击时,
CP Vanity
会加载带有选定账户的“单个账户”视图。自 2.3 版本以来,“shift”按钮(以及“shift”键!)会水平滚动 DataGridView 并显示几个新值,即文章、技巧、博客、消息、问题、答案和评论的总数。
限制
CP Vanity
有很多限制,有些是设计上的,有些是因为必须使用某些原则来收集必要的信息。这里有一个列表
- 窗口宽度固定为 1024;这是
DataGridViews
显示所有信息所需的宽度;因为我不喜欢水平滚动,所以我决定设置一个固定的宽度,这除了最小的显示器外,应该都不是问题。 CP Vanity
显示快照;它不提供实时图像或自动刷新。- 信息是通过抓取几个 CodeProject 网页并解析其 HTML 内容来收集的;存在着日益增加的风险,即某些东西(使用的 URL、页面内容、使用的 HTML 标签,任何东西)会发生变化,以至于
CP Vanity
不再按预期运行。如果发生这种情况,我可能会提供更新,也可能不会。 Highest Achievers
列表是从“谁是谁”页面聚合的,该页面基本上按总声誉、文章数或消息数提供排名靠前的成员。对于某些声誉类别,可以获得很多积分而无需创建大量文章或消息(例如,组织者积分是通过投票获得的),因此,虽然可能性不大,但一些排名靠前的人可能不会出现在“最高成就者”页面上。
一些技术细节
所有 CodeProject 特有的东西都隔离在CPSite
类中,该类提供了获取 URL 字符串、抓取网页内容以及提取所需信息的方法。如果 CodeProject 有任何变化,CPSite
是可能需要反映这些变化的地方。
所有网页抓取和解析都由BackgroundWorker
执行,当然 GUI 更新在ProgressChanged
和RunWorkerCompleted
事件处理程序中处理。
TabControl 选项卡
WinForms TabControl
的可配置性非常有限;所有选项卡都以相同的方式渲染,使用TabControl
的Font
、ForeColor
和BackColor
值。因此,不同的外观和感觉(多种颜色、悬停效果等)根本不支持。这通常是编程论坛中被问及的主题。
我想要一个菜单栏而不是典型的选项卡,我的困境是使用TabControl
并以某种方式模拟一个标签条,或者使用叠加的Panel
而不是TabPages
并自己控制它们的可见性。TabControl
的一个优点是可以在Form
内部、现场设计TabPages
;不需要单独的Form
或UserControl
。所以,我决定选择前者,并接受与TabControl
的斗争。这就是我所做的:
- 在 Visual Designer 中,我向 Form 添加了一个
Panel
和一个TabControl
。Right
和Width
属性匹配,Panel.Height
足够容纳新的标签条并隐藏不需要的标签(一旦Panel
和TabControl
相互移位);但是TabControl
的位置在Panel
下方,所以TabControl
最初会稍微靠下,从而可以轻松设计两者。 - 在运行时(即在
Form
构造函数中,调用InitializeComponents
之后),TabControl
的Top
会减小,Height
会增加Panel
的高度,从而有效地将本机选项卡滑到人工标签条下方。瞧,丑陋的选项卡消失了,外观达到了预期。实际上,标签条不像旧选项卡那么高,但是上面的第二个面板会隐藏任何突出的部分。
![]() |
![]() |
左边的图像显示了 Designer 视图:新的标签条(绿色面板)将用于隐藏原始的(灰色)选项卡,这些选项卡具有Appearance=FlatButtons
。右边的图像显示了运行时视图,原始选项卡通过将TabControl
向上滑动并隐藏在其他面板下方而被隐藏。
DataGridView 问题
我在让DataGridView
控件正确渲染空单元格方面遇到了一些麻烦!当不需要背景着色时,一切都运行正常;但是,当单元格从带有背景色的非空单元格变为(始终没有背景的)空单元格时,单元格不会被擦除。
解决了(大部分)不需要的误绘的一个解决方法包括三个特殊措施:
- 当
TabControl
切换到另一个页面时,新可见的DataGridView
会在一段时间内变得不可见,只需一个简单的Thread.Sleep(100)
。这足以在控件按预期渲染之前获得干净的背景。 - 当应用程序从后台返回时,将强制进行相同的重绘。
- 当
DataGridView
被排序时,背景着色会暂时暂停;即,一个控制背景颜色的布尔标志被设置为false
,并启动一个计时器在大约 100 毫秒后将其重新设置为true
。没有这个技巧,在某些列中切换排序顺序会产生镜像图像,其中顶部的单元格和底部的单元格看起来完全相同(而其中一组应该为空)。
上述方法并未解决当DataGridView
被滚动时应发生(或未发生)的重绘问题,因此我继续寻找真正的解决方案。我终于发现了似乎是真正的问题:空单元格只有在不设置任何背景颜色时(即使是白色或透明色)才能正常工作,因此CellFormatting
事件处理程序必须在设置BackColor
之前检查声誉点,并跳过所有这些操作以获得零值。我在 V1.3 版本中相应地修复了代码,并删除了与早期解决方法相关的代码。现在一切都很好了。
Regex 性能
虽然我不是 Regex 专家,但我希望能找到一些能够容忍 HTML 代码变化的模式。最初导致了一些包含多个通配符的复杂模式,有些是贪婪的,有些是懒惰的。最终结果是解析每页需要几秒钟。
在第二次迭代中,我简化了 Regex 模式,使用了更少的通配符和更少的组;我还使用了一些简单的字符串搜索。例如,用户名和声誉编号是用 regex 模式提取的,而颜色是通过单独搜索颜色名称来确定的。速度提升非常显著,解析时间现在可以忽略不计。
网络
为了支持 PC 位于防火墙后面的情况,配置文件已为此进行了调整
<?xml version="1.0"?>
<configuration>
<system.net>
<defaultProxy enabled="true" useDefaultCredentials="true" />
</system.net>
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>
当代理服务器使用基于密码的身份验证时,必须提供NetworkCredential
;请查看文件CPSite.cs 并根据需要调整方法CreateWebRequest()
。
结论
CP Vanity
在您的指尖提供了两个高度浓缩的信息页面,其中大部分信息以DataGridViews
形式呈现,可以进行多种排序。一个显著的结果是,七个声誉类别目前有六个不同的冠军。
致谢
感谢
- Sacha Barber,其 Really Vain Web Spider 文章提供了很多灵感,我从他那里借用了一个图标。
- Pete O'Hanlon 和 Don Kackman,感谢他们提供了防火墙/代理建议。
- 所有早期用户,感谢他们报告了他们的发现并提供了建议和评论。
历史
- 版本 1.0 (2010 年 3 月 22 日):原始版本
- 版本 1.1 (2010 年 3 月 23 日):修复了区域设置错误;为
DataGridViews
添加了工具提示;列出了文章标题;小改进。 - 版本 1.2 (2010 年 3 月 23 日):修复了重复标题错误。
- 版本 1.3 (2010 年 3 月 28 日):修复了
DataGridView
背景;修复了铜牌错误;小改进。 - 版本 1.4 (2010 年 3 月 29 日):计算了总声誉点和颜色,即使它们不在原始位置。
- 版本 1.5 (2010 年 4 月 6 日):修复了
Linklabel
错误;添加了闪烁checkbox
;添加了 MVP 列。 - 版本 1.7 (2010 年 8 月 3 日):接受了最新的 CP 样式;添加了个性化成员类型图标。
- 版本 1.8 (2010 年 10 月 9 日):向文章表添加了书签列;几个小的 GUI 改进。
- 版本 2.0 (2010 年 12 月 6 日):增加了对按声誉查询的“谁是谁”的支持,以及 cbFetchJob ComboBox;添加了 PlatinumCount 列;几个小的 GUI 改进。
- 版本 2.1 (2010 年 12 月 25 日):更新以适应最新的网站更改。
- 版本 2.2 (2011 年 3 月 27 日):向文章表添加了下载列。
- 版本 2.3 (2011 年 5 月 24 日):向顶尖成就者选项卡添加了几个计数器,请参阅“shift”按钮;更新并添加了一些屏幕截图;添加了仅可执行文件下载;修复了一个解析错误(“单个账户”选项卡未能处理文章投票、书签和下载中的千位分隔符)。
- 版本 2.4 (2011 年 6 月 9 日):添加了声誉图表缩放功能。