社区
界面
帖子详情
求助:关于窗口重画问题!
isabel1169
2004-10-28 10:03:56
各位仁兄:
最近遇到一个问题,我在对话框中放了十几个按钮,用了XP风格的界面,但是当拖动对话框时,所有的按钮是一个接一个被画出来的.问题出在哪,如何解决? 多谢!!!
...全文
122
8
打赏
收藏
求助:关于窗口重画问题!
各位仁兄: 最近遇到一个问题,我在对话框中放了十几个按钮,用了XP风格的界面,但是当拖动对话框时,所有的按钮是一个接一个被画出来的.问题出在哪,如何解决? 多谢!!!
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
isabel1169
2004-10-29
打赏
举报
回复
重新画的时候并不慢,主要问题是BUTTON在结束是关闭速度太慢。
huwei001982
2004-10-29
打赏
举报
回复
重绘太慢
应该选用好的皮肤类 按按钮类
isabel1169
2004-10-29
打赏
举报
回复
void CXPButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
//从lpDrawItemStruct获取控件的相关信息
CRect rect = lpDrawItemStruct->rcItem;
CDC *pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
int nSaveDC=pDC->SaveDC();
UINT state = lpDrawItemStruct->itemState;
POINT pt ;
TCHAR strText[MAX_PATH + 1];
::GetWindowText(m_hWnd, strText, MAX_PATH);
//画按钮的外边框,它是一个半径为5的圆角矩形
pt.x = 5;
pt.y = 5;
CPen* hOldPen = pDC->SelectObject(&m_BoundryPen);
pDC->RoundRect(&rect, pt);
//获取按钮的状态
if (state & ODS_FOCUS)
{
m_bFocus = TRUE;
m_bSelected = TRUE;
}
else
{
m_bFocus = FALSE;
m_bSelected = FALSE;
}
if (state & ODS_SELECTED || state & ODS_DEFAULT)
{
m_bFocus = TRUE;
pDC->Draw3dRect(rect, GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DHILIGHT));
}
pDC->SelectObject(hOldPen);
rect.DeflateRect(CSize(GetSystemMetrics(SM_CXEDGE), GetSystemMetrics(SM_CYEDGE)));
//根据按钮的状态填充按钮的底色
CBrush* pOldBrush;
if (m_bOver)
{
pOldBrush = pDC->SelectObject(&m_FillActive);
DoGradientFill(pDC, &rect);
}
else
{
pOldBrush = pDC->SelectObject(&m_FillInactive);
DoGradientFill(pDC, &rect);
}
//根据按钮的状态绘制内边框
if (m_bOver || m_bSelected)
DrawInsideBorder(pDC, &rect);
pDC->SelectObject(pOldBrush);
//显示按钮的文本
if (strText!=NULL)
{
CFont* hFont = GetFont();
CFont* hOldFont = pDC->SelectObject(hFont);
CSize szExtent = pDC->GetTextExtent(strText, lstrlen(strText));
CPoint pt( rect.CenterPoint().x - szExtent.cx / 2, rect.CenterPoint().y - szExtent.cy / 2);
if (state & ODS_SELECTED)
pt.Offset(1, 1);
int nMode = pDC->SetBkMode(TRANSPARENT);
if (state & ODS_DISABLED)
pDC->DrawState(pt, szExtent, strText, DSS_DISABLED, TRUE, 0, (HBRUSH)NULL);
else
pDC->DrawState(pt, szExtent, strText, DSS_NORMAL, TRUE, 0, (HBRUSH)NULL);
pDC->SelectObject(hOldFont);
pDC->SetBkMode(nMode);
}
pDC->RestoreDC(nSaveDC);
}
DentistryDoctor
2004-10-29
打赏
举报
回复
代码?
isabel1169
2004-10-29
打赏
举报
回复
有解决的方法么?
try876
2004-10-29
打赏
举报
回复
就是button的OnDraw函数的问题,画得太慢了
也有可以是你又用了其它的皮肤,皮肤画得太慢了也会有这种问题
isabel1169
2004-10-29
打赏
举报
回复
我知道代码有问题,所以才请教各位仁兄大概是什么地方的问题!
roger_ding
2004-10-29
打赏
举报
回复
button的代码有问题
关于
窗口
重画
的初级
问题
关于
窗口
重画
的初级
问题
初初级
问题
:我在视图画的图象或者文字,当
窗口
改变后(包括最小化后还原,被别的
窗口
挡住后重新显示等)为什么不见了? 这就是
窗口
重绘或者说
重画
的
问题
。当
窗口
改变后,会产生无效区域,这个无效的区域需要
重画
。什么是无效区域?自己到网上搜索或者看相关资料。我这里给出一个特殊的解释:以最小化后还原为例,假设只有一个程序在运行,
窗口
最小化时显示计算机桌面,并不妨假设桌
WM_PIANT消息与
窗口
重画
Windows给
窗口
发送消息,这意味著Windows调用
窗口
消息处理程序。但是,Windows程序也有一个消息循环,它调用GetMessage从消息队列中取出消息,并且调用DispatchMessage将消息发送给
窗口
消息处理程序。 那么,Windows程序是依次等待消息(类似于普通程序中相同的键盘输入),然后将消息送到某地方去的吗?或者,它是直接从程序外面接收消息的吗?实际上,两种情况都
窗口
重画
ONPaint
WM_PAINT源头:第一次创建
窗口
,
窗口
最大、最小化,
窗口
大小改变、
窗口
移动,无效区等动作,以及调用Invalidate、InvalidateRect或InvalidateRgn、Updateindow等函数。 每个
窗口
(HWND)实例,在windows操作系统中,都有个上下文记录区,其中记录着当前
窗口
的无效区域数据。系统内核利用空闲时间检查所有
窗口
的无效区,如果非空,就产生一个WM_
强制和防止
窗口
重画
<script type="text/javascript"
关于
窗口
重绘的初级
问题
作者:liguisenblog:http://blog.csdn.net/liguisen/ 关于
窗口
重画
的初级
问题
既然是初级
问题
,我尽量少说一点原理,并且使用通俗易懂的话。 初初级
问题
:我在视图画的图象或者文字,当
窗口
改变后(包括最小化后还原,被别的
窗口
挡住后重新显示等)为什么不见了? 这就是
窗口
重绘或者说
重画
的
问题
。当
窗口
改变后,会产生无效区域,这个无效
界面
15,976
社区成员
115,866
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章