各位高手,本人最近用了一个CPictureEx的类,用于在picture控件内显示图片,尤其是显示动态的GIF图片,很好用。可是美中不足的地方是该类的作者提供的函数显示的GIF不能自动适应picture框的大小,而是让picture控件去适应GIF的大小。问题如下:
1. 有没有其他方法可做到在对话框特定区域内显示一个多贞的GIF动画图片?而且GIF图片要自适应该区域的大小;2. 我的对话框已经通过OnEraseBkgnd创建了背景,而且面板上有Edit 编辑框和 ListControl控件 ,有没有办法让控件所占有的白色区域透明化,做到不遮掩背景图片并把背景图片显示出来?我曾经用过 HBRUSH OnCtlColor,可是失败了……3. 列表框list 如何按我所想随时隐藏和显示? 还请各位指点!
1. 有没有其他方法可做到在对话框特定区域内显示一个多贞的GIF动画图片?而且GIF图片要自适应该区域的大小;2. 我的对话框已经通过OnEraseBkgnd创建了背景,而且面板上有Edit 编辑框和 ListControl控件 ,有没有办法让控件所占有的白色区域透明化,做到不遮掩背景图片并把背景图片显示出来?我曾经用过 HBRUSH OnCtlColor,可是失败了……3. 列表框list 如何按我所想随时隐藏和显示? 还请各位指点!
解决方案 »
- 请问网上下载的Microsoft Surface Colloge 图片拖动、放大的实现方法
- 无法解析的外部符号
- 请问下面的控件是怎么制作的
- 用sendmessage怎样实现undo功能,谢谢
- 本站招收业余游戏开发人员,包括策划、美工、程序员、音乐制作、网页制作,利用业余时间通过互连网来完成游戏项目开发。有意者到 http://
- vb&com:初学者的迷惑
- IE插件可不可以实现网页播放器JWplayer的视频运动扑捉功能
- 离职几个月了,但原来的公司还欠两个月的工资不肯给,兄弟们有啥办法
- 如何在程序内部设置CEdit控件只准输入数字和字符两种方式之间的转换
- ChartCtrl调用addpoints不定时报afxwin1.ini 666行错误
- 一个基于对话框的空工程,在对话框之间切换时内存每次都增加,最后内存泄露
- 请教大虾:提供了响应函数,为什么对话框工具栏按钮仍然是灰的?
2、可以用自绘控件的方式来解决。
3、调用ShowWindow就可以。
“从CListCtrl派生一个类,子类化对应的控件,响应WM_ERASEBKGND消息”是否近似等效于把CListCtrl 当作 CDialog 一样地看待,按创建对话框的思路载入背景贴图?然后放大图片使得局部显示的区域正好和对话框那部分的背景重合以达到效果?
另外,对于edit编辑框呢,是不是也可以用这样的思路处理?
BOOL CPictureEx::Draw()
{
if (!m_bIsInitialized)
{
TRACE(_T("Call of one the CPictureEx::Load() member functions before calling Draw()\n"));
return FALSE;
}; if (IsAnimatedGIF())
{
// the picture needs some animation
// we'll start the thread that will handle it for us
unsigned int nDummy;
m_hThread = (HANDLE) _beginthreadex(NULL,0,_ThreadAnimation,this,
CREATE_SUSPENDED,&nDummy);
if (!m_hThread)
{
TRACE(_T("Draw: Couldn't start a GIF animation thread\n"));
return FALSE;
}
else
ResumeThread(m_hThread);
}
else
{
if (m_pPicture)// IPicture * m_pPicture;
{
long hmWidth;
long hmHeight;
m_pPicture->get_Width(&hmWidth);
m_pPicture->get_Height(&hmHeight);
if (m_pPicture->Render(m_hMemDC, 0, 0, m_PictureSize.cx, m_PictureSize.cy,
0, hmHeight, hmWidth, -hmHeight, NULL) == S_OK)
{
Invalidate(FALSE);
return TRUE;
};
};
}; return FALSE;
}
// std::vector<TFrame> m_arrFrames;
BOOL CPictureEx::IsAnimatedGIF() const
{
return (m_bIsGIF && (m_arrFrames.size() > 1));
}void CPictureEx::OnPaint()
{
CPaintDC dc(this); // device context for painting
::BitBlt(dc.m_hDC,0,0,m_PictureSize.cx,m_PictureSize.cy,
m_hMemDC,0,0,SRCCOPY);
}
HBRUSH CXXXDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
if ( nCtlColor == CTLCOLOR_STATIC )
{
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)GetStockObject(NULL_BRUSH);
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
BitBlt换成StretchBlt试试,感觉应该可以。
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
if ( nCtlColor == CTLCOLOR_STATIC )
{
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)GetStockObject(NULL_BRUSH);
}
if ( nCtlColor == CTLCOLOR_EDIT )
{
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)GetStockObject(NULL_BRUSH);
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
试用了以上的代码,发现效果不错,暂时谢过楼上2位高手的指点,其他情况还有待解决
编辑框是要进行数据编辑的, 在我想修改多行文本的编辑框 的时候, 选定某2个字会发现文字显示混乱;特别是利用键盘上的Delete 去做文字删除的时候,编辑框内的背景处于蓝色选定状态,内部文字显示混乱!
请问这种显示应该如何解决?
因为设置了文字背景透明,在输出文字前需要自己用InvalidateRect刷新编辑框的父窗口中相应的区域。
void COneDlg::OnRefresh()
{
CRect rect;
GetDlgItem(IDC_EDIT_TIME)->GetWindowRect(rect);
ScreenToClient(rect);
InvalidateRect(rect);
} 可是,我还是没掌握如何在[color=#3366FF]合时的时机设置相关响应函数去清理编辑框的背景…… 当我把鼠标点击放入编辑框,选定特定的文字,按Delete键修改,或者是输入文字,回车等,问题依旧,想了一下,难不成以上的都要进行特别的消息响应再调用OnRefresh?[/color]
曾经试过在OnEraseBkgnd或者OnPaint内调用,但是编辑框内不停地闪弄得我眼都花了……也想过设定定时器进行刷新,但是似乎也是无法避开闪烁的问题……
有没有更完善的解决方法?
我主要是对编辑框的多行文本进行编辑和选定,删除的时候用键盘的Delete
有没有对选定文本或Dlete 的时候产生响应的函数? 如果注定用CDialog::OnCtlColor无法使我的问题得到圆满解决,那么是不是我应该往Edit控件内加载图片了?
CPicViewButton 从button继承过来
BOOL CPicViewButton::SetGifImagePath(CString strImageFilePath)
{
m_strImagePath = strImageFilePath;
if(m_pGifRead!=NULL)
{
delete m_pGifRead;
m_pGifRead = NULL;
}
m_pGifRead = new CPictureEx ;
CRect rect ;
this->GetClientRect(&rect) ;
rect.left += 5;
rect.right -=5;
rect.top +=5;
rect.bottom -=5;
m_pGifRead->Create(_T(""), WS_CHILD , rect, this, 1) ;
m_pGifRead->Load(m_strImagePath) ;
m_pGifRead->SetRenderMode(CPictureEx::RENDER_MODE_STRETCH) ;
m_pGifRead->Draw();
m_pGifRead->ShowWindow(SW_SHOW) ;
m_pGifRead->UpdateWindow() ;
return TRUE;
}
等焦点转移后,再进行刷新,就可以把闪烁次数减少。
请问这个想法能否做到?
m_pGifRead->SetRenderMode(CPictureEx::RENDER_MODE_STRETCH) ; 报错了,我使用的那个不存在SetRenderMode这个函数我使用的CPictureEx类包含如下信息, 你的呢?
// Written by Oleg Bykov ([email protected])
// Copyright (c) 2001如果你有新的,请传一份给我,谢谢!
HBRUSH COneDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{ HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
if ( nCtlColor == CTLCOLOR_STATIC )
{
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)GetStockObject(NULL_BRUSH);
}
if ( nCtlColor == CTLCOLOR_EDIT )
{//关键:利用判断决定是否采用透明模式
if(GetFocus()->GetDlgCtrlID() == IDC_EDIT_TIME)
{
OnChangeEditTime() ;
}
else
{
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)GetStockObject(NULL_BRUSH);
}
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
//对应EditBox资源的刷新
void COneDlg::OnRefresh(UINT nCtrlResource) //On Refresh
{
CRect rect;
GetDlgItem(nCtrlResource)->GetWindowRect(rect);
ScreenToClient(rect);
InvalidateRect(rect);
}
//响应对应的EditBox
void COneDlg::OnSetfocusEditTime()
{
Invalidate();//the key
}
void COneDlg::OnKillfocusEditTime()
{
// TODO: Add your control notification handler code here
OnRefresh(IDC_EDIT_TIME);
}
以上代码只是针对单一的Editbox,如果控件较多,必须再次封装函数。
当然,希望还有更加简洁方便的方法,希望有兴趣的朋友一同参与讨论。
本人已经发帖,题为:关于对话框焦点转移后出现程序崩溃的问题
希望在那里可以找到解决途径,欢迎大家参与讨论!