只有当ListBox的DrawMode 属性设置为 DrawMode.OwnerDrawFixed 或 DrawMode.OwnerDrawVariable 时,才会激活MeasureItem事件,其次是DrawItem事件。首先,在绘制之前可以使用MeasureItem事件确定Item项的大小,然后激活DrawItem事件开始实际绘制操作。
在初始化主窗体时,我们先定义好所有相关变量和对象,如下:
private const string errortext = "获取服务器信息失败,请检查网络连接是否正常。";
private bool hasError = false;
private DataTable rssData;
private Font titleFont, descFont;
private int leftMargines;
private int topMargines;
private int rectDistance;
public Form1()
{
InitializeComponent();
titleFont = new Font("Microsoft Sans Serif", 10, FontStyle.Bold);
descFont = new Font("Microsoft Sans Serif", 10, FontStyle.Regular);
leftMargines = 8;
topMargines = 10;
rectDistance = 12;
}
private bool hasError = false;
private DataTable rssData;
private Font titleFont, descFont;
private int leftMargines;
private int topMargines;
private int rectDistance;
public Form1()
{
InitializeComponent();
titleFont = new Font("Microsoft Sans Serif", 10, FontStyle.Bold);
descFont = new Font("Microsoft Sans Serif", 10, FontStyle.Regular);
leftMargines = 8;
topMargines = 10;
rectDistance = 12;
}
最后,我们可以为ListBox的DoubleClick事件添加相应代码,以便当双击Item时可以启动浏览器打开对应的链接。因为ListBox中项的索引和rssData的item表的记录数是一一对应的,我们可以很方便的在它们之间建立关联并导航链接。代码如下:
private void listBox1_DoubleClick(object sender, EventArgs e)
{
string linkurl = rssData.Rows[listBox1.SelectedIndex]["link"].ToString();
System.Diagnostics.Process.Start("iexplore.exe", linkurl);
}
{
string linkurl = rssData.Rows[listBox1.SelectedIndex]["link"].ToString();
System.Diagnostics.Process.Start("iexplore.exe", linkurl);
}
至此,属于我们自己版本的多线程RSS新闻阅读器制作完毕。虽然这仅仅是个思路和框架,细节之处不够完善,但是已经具备了大部分基本功能,有兴趣的网友可以继续扩展。
代码下载:演示代码