我用一个ole控件来显示gif图片,然后将控件插入richedit从而实现在richedit中显示GIF图片。但是有个问题,gif的图片是通过定时器定时刷新的,而每当gif刷新的时候会影响到richedit,表现为,如果gif图片在richedit中只显示了一半,当gif刷新的时候,整个gif会显示出来,就好像我移动了滚动条。如果我正在看richedit中其他部分的内容,会受到干扰。我希望gif的图片刷新不要改变richedit当前的显示。不知道如何处理?
类似的问题还有一个,如果将次控件放入richedit做的输入框,每次gif刷新的时候,richedit都会响应editchange这种消息,我不希望让其相应这个消息。而且我不希望在 editchange这个消息处理中做判断,应为如果有大量gif,频繁相应次处理函数,会影响效率。
类似的问题还有一个,如果将次控件放入richedit做的输入框,每次gif刷新的时候,richedit都会响应editchange这种消息,我不希望让其相应这个消息。而且我不希望在 editchange这个消息处理中做判断,应为如果有大量gif,频繁相应次处理函数,会影响效率。
解决方案 »
- mciSendString()编译错误
- 只在多线程中执行出错(MSHTML.DLL):0xC0000005:Access Violation
- 关于formview的几个问题
- WinCE MFC程序中对话框内控件的大小设置问题
- RICHEDIT编辑框控件加载txt文件的内容
- 急急急急急急急急!!我在word里面放了一个按钮 我想让他弹出一个能交互式的对话框
- 一个关于用odbc访问数据库表的问题。
- 我想在鼠标在视图中停止2秒时调用一个函数,这怎么解决,up有份
- :求救各位大侠,怎样对接收到的邮件附件(*.eml格式)解码?急!!!
- 请问如何获得Edit中的字符串?
- error C2660: 'CWnd::SendMessageW' : function does not take 4 arguments
- 编写Win32 DLL能用CString类吗?
用InvalidRect这个API函数来使部分区域无效,即刷新自定义的区域。
不过,其实最好还是不要直接在屏幕DC中InvalidRect,应该先创建一个内存兼容DC,然后在内存兼容DC中用这个函数,最后再从内存兼容DC中BitBlt到屏幕DC,这样可以更好解决屏幕闪烁。
你的控件怎么实现的?
{
.......... public:
void AttachCtl(CImageShowCtl* pFullCtrl)
{
m_pFullCtrl = pFullCtrl;
} BOOL SetThisTimer(UINT nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc )
{
if (m_hWnd == NULL)
{
RECT rt = {0, 0, 0, 0};
Create(NULL, rt);
}
m_nTimer = ::SetTimer(m_hWnd, nIDEvent, uElapse, lpTimerFunc);
return m_nTimer == 0;
} LRESULT OnTimer(UINT, WPARAM, LPARAM, BOOL&);
CImageShowCtl* m_pFullCtrl;//我的控件指针
..........
}LRESULT CWinHidden::OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
if (m_pFullCtrl != NULL)
m_pFullCtrl->ChangePic();//绘图,刷新
return 0;
}然后我的控件中
// CImageShowCtl
CWinHidden m_WinHidden;//使用中
m_WinHidden.AttachCtl(this);
m_WinHidden.SetThisTimer(1, 10, NULL);//绘图,刷新
void CImageShowCtl::ChangePic()
{
if(m_Time == m_Gif.GetFrameDelay(m_CurrentPic) * 10)//是否改变图片显示
{
m_CurrentPic++; if(m_CurrentPic >= m_PicNum)
{
m_CurrentPic = 0;
} FireViewChange(); m_Time = 10;
}
else
{
m_Time += 10;
}
}