绘制CSliderCtrl';mfc中的s通道

绘制CSliderCtrl';mfc中的s通道,mfc,Mfc,我想用CSliderCtrl实现一个视频播放器,它显示播放和下载进度。拇指随着视频播放而移动,而频道随着视频文件下载而改变。我参考了本文,但是通道只能在事件处理程序中绘制,但是,我希望在收到大量文件时绘制通道。因此,我想知道如何在运行时而不是在处理程序中检索通道。 与其他所有者绘制的控件一样,您需要在自定义绘制处理程序上绘制所有内容。Codeproject上的这个自定义类也不例外 为了适应这种情况,您需要在父窗口中创建一个成员变量,该变量将保存已下载区块的大小以及文件的大小。例如 class C

我想用CSliderCtrl实现一个视频播放器,它显示播放和下载进度。拇指随着视频播放而移动,而频道随着视频文件下载而改变。我参考了本文,但是通道只能在事件处理程序中绘制,但是,我希望在收到大量文件时绘制通道。因此,我想知道如何在运行时而不是在处理程序中检索通道。

与其他所有者绘制的控件一样,您需要在自定义绘制处理程序上绘制所有内容。Codeproject上的这个自定义类也不例外

为了适应这种情况,您需要在父窗口中创建一个成员变量,该变量将保存已下载区块的大小以及文件的大小。例如

class CMyDialog: CDialog
{
private:
   int nBytes; // downloaded bytes
   int nSize;  // total size of the file
}
当您收到一个块时,您将相应地增加N字节

在滑块控件的自定义绘制处理程序中,可以使用这些变量偏移通道位置。基本上,正如文章作者所建议的那样,只需绘制矩形。作者使用了一个矩形,您将使用两个(左矩形和右矩形)用不同的画笔绘制

实际的技巧是在每次收到区块时强制滑块重新绘制。您需要使用:


谢谢你的回复!我尝试过使用Invalidate(),但它不起作用。每次调用Invalidate()时似乎都不会调用OnCustomdraw()处理程序。请尝试为整个窗口调用Invalidate
m_myslider.Invalidate();