65.9K
CodeProject 正在变化。 阅读更多。
Home

CP Vanity

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (80投票s)

2010年3月22日

CPOL

8分钟阅读

viewsIcon

220714

downloadIcon

1795

CodeProject 最近引入的声誉信息查看器;虽然徒劳,但很有趣

引言

本文介绍了一个 CodeProject 新引入的声誉信息查看器。虽然完全徒劳,但制作起来很有趣,而且可以方便使用。

整体功能

第一个视图显示单个账户的信息;它显示用户名(在小 WebBrowser 中渲染 HTML)、声誉图表以及文章列表(真实文章和技巧文章)。

CPVanity One Account

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

CPVanity Highest Achievers

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

CPVanity Highest Achievers

一些功能细节

已付出一些努力来提供用户舒适的功能

  • 更改的用户 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 有很多限制,有些是设计上的,有些是因为必须使用某些原则来收集必要的信息。这里有一个列表

  1. 窗口宽度固定为 1024;这是DataGridViews 显示所有信息所需的宽度;因为我不喜欢水平滚动,所以我决定设置一个固定的宽度,这除了最小的显示器外,应该都不是问题。
  2. CP Vanity 显示快照;它不提供实时图像或自动刷新。
  3. 信息是通过抓取几个 CodeProject 网页并解析其 HTML 内容来收集的;存在着日益增加的风险,即某些东西(使用的 URL、页面内容、使用的 HTML 标签,任何东西)会发生变化,以至于CP Vanity 不再按预期运行。如果发生这种情况,我可能会提供更新,也可能不会。
  4. Highest Achievers 列表是从“谁是谁”页面聚合的,该页面基本上按总声誉、文章数或消息数提供排名靠前的成员。对于某些声誉类别,可以获得很多积分而无需创建大量文章或消息(例如,组织者积分是通过投票获得的),因此,虽然可能性不大,但一些排名靠前的人可能不会出现在“最高成就者”页面上。

一些技术细节

所有 CodeProject 特有的东西都隔离在CPSite 类中,该类提供了获取 URL 字符串、抓取网页内容以及提取所需信息的方法。如果 CodeProject 有任何变化,CPSite 是可能需要反映这些变化的地方。

所有网页抓取和解析都由BackgroundWorker 执行,当然 GUI 更新在ProgressChangedRunWorkerCompleted 事件处理程序中处理。

TabControl 选项卡

WinForms TabControl 的可配置性非常有限;所有选项卡都以相同的方式渲染,使用TabControlFontForeColorBackColor 值。因此,不同的外观和感觉(多种颜色、悬停效果等)根本不支持。这通常是编程论坛中被问及的主题。

我想要一个菜单栏而不是典型的选项卡,我的困境是使用TabControl 并以某种方式模拟一个标签条,或者使用叠加的Panel 而不是TabPages 并自己控制它们的可见性。TabControl 的一个优点是可以在Form 内部、现场设计TabPages;不需要单独的FormUserControl。所以,我决定选择前者,并接受与TabControl 的斗争。这就是我所做的:

  • 在 Visual Designer 中,我向 Form 添加了一个Panel 和一个TabControlRightWidth 属性匹配,Panel.Height 足够容纳新的标签条并隐藏不需要的标签(一旦PanelTabControl 相互移位);但是TabControl 的位置在Panel 下方,所以TabControl 最初会稍微靠下,从而可以轻松设计两者。
  • 在运行时(即在Form 构造函数中,调用InitializeComponents 之后),TabControlTop 会减小,Height 会增加Panel 的高度,从而有效地将本机选项卡滑到人工标签条下方。瞧,丑陋的选项卡消失了,外观达到了预期。实际上,标签条不像旧选项卡那么高,但是上面的第二个面板会隐藏任何突出的部分。
CPVanity Designer Detail CPVanity RunTime Detail

左边的图像显示了 Designer 视图:新的标签条(绿色面板)将用于隐藏原始的(灰色)选项卡,这些选项卡具有Appearance=FlatButtons。右边的图像显示了运行时视图,原始选项卡通过将TabControl 向上滑动并隐藏在其他面板下方而被隐藏。

DataGridView 问题

我在让DataGridView 控件正确渲染空单元格方面遇到了一些麻烦!当不需要背景着色时,一切都运行正常;但是,当单元格从带有背景色的非空单元格变为(始终没有背景的)空单元格时,单元格不会被擦除。

解决了(大部分)不需要的误绘的一个解决方法包括三个特殊措施:

  1. TabControl 切换到另一个页面时,新可见的DataGridView 会在一段时间内变得不可见,只需一个简单的Thread.Sleep(100)。这足以在控件按预期渲染之前获得干净的背景。
  2. 当应用程序从后台返回时,将强制进行相同的重绘。
  3. 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 日):添加了声誉图表缩放功能。
© . All rights reserved.