如何重画对话框的控件, 是自己重画?

ren20 2001-05-07 12:01:00
每一个控件都重写显示部分?

怎么重画? 我不知道呀,望高手耐心解答,谢谢
...全文
296 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
patient 2001-05-10
  • 打赏
  • 举报
回复
这是个书上的例子,他在一个静态控件中绘制一个小方块
void CMyDialog::OnPaint()
{
CWnd*pWnd=GetDlgItem(IDC_STATIC1);
CDC* pControlDC=pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
pControlDC0>SelectStockObject(BLACK_BRUSH);
pControlDC0>Rectangle(0,0,10,10);
pWnd->ReleaseDC(pControlDC);
}
关键是既要在空间窗口内绘图,又要防止windows对他进行重复绘制
pgfun 2001-05-10
  • 打赏
  • 举报
回复
自己动手试一试不就全明白了.
flyjalor 2001-05-10
  • 打赏
  • 举报
回复
只需要调用OnDraw()就行了!
2ndboy 2001-05-10
  • 打赏
  • 举报
回复
要指定同时重绘客户区和边框,否则EDIT控件会不正常
2ndboy 2001-05-10
  • 打赏
  • 举报
回复
枚举对话框的所有子窗口(控件),在自定义枚举过程中调用RedrawWindow()记不太清了,好象是RedrawWindow()
ren20 2001-05-10
  • 打赏
  • 举报
回复
我想知道重画一般需要画些什么,
ren20 2001-05-09
  • 打赏
  • 举报
回复
谢谢 pgfun() 

我想知道重画一般需要画些什么,
pgfun 2001-05-09
  • 打赏
  • 举报
回复
以下是一个FlatButton的重画部分.
void CFlatButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rcClient = lpDrawItemStruct->rcItem;
UINT state = lpDrawItemStruct->itemState;

COLORREF colorFace = GetSysColor(COLOR_BTNFACE);
COLORREF colorShadow = GetSysColor(COLOR_3DSHADOW);
COLORREF colorLight = GetSysColor(COLOR_3DHILIGHT);

CDC memDC;
memDC.CreateCompatibleDC( pDC );

// Select a compatible bitmap into the memory DC
CBitmap bitmap;
bitmap.CreateCompatibleBitmap( pDC, rcClient.Width(), rcClient.Height() );
CBitmap* pOldBitmap = memDC.SelectObject( &bitmap );

memDC.FillSolidRect(rcClient, colorFace);

if (!m_bMouseIn)
memDC.Draw3dRect(rcClient, colorFace, colorFace);//dc.Rectangle(rect);
else
if (m_bMouseIn && (state & ODS_SELECTED))
memDC.Draw3dRect(rcClient, colorShadow, colorLight);
else
memDC.DrawEdge(rcClient, EDGE_RAISED, BF_RECT);

CString strText;
GetWindowText(strText);
if ( !strText.IsEmpty())
{
CFont *pFont = GetFont();

CFont* pOldFont = memDC.SelectObject (pFont);
int iOldMode = memDC.GetBkMode();
memDC.SetBkMode( TRANSPARENT );
COLORREF crOldText ;
if (m_bMouseIn && (state & ODS_SELECTED))
crOldText = memDC.SetTextColor(RGB(0,0,128));
else if (m_bMouseIn)
crOldText = memDC.SetTextColor(RGB(0,0,255));
else
crOldText = memDC.SetTextColor(GetSysColor(COLOR_WINDOWTEXT));

CSize szText = memDC.GetTextExtent(strText);
CPoint ptText (rcClient.left + (rcClient.Width()-szText.cx)/2,
rcClient.top + (rcClient.Height()-szText.cy)/2);

if (m_bMouseIn && (!(state & ODS_SELECTED)))
ptText.Offset(-1,-1);

if (state & ODS_DISABLED)
memDC.DrawState(ptText, szText, strText, DSS_DISABLED,
TRUE, 0, (HBRUSH)NULL);
else
memDC.DrawText(strText, CRect(ptText,szText), DT_CENTER|DT_VCENTER);

memDC.SetBkMode( iOldMode );
memDC.SetTextColor( crOldText );
memDC.SelectObject (pOldFont);
}
ren20 2001-05-09
  • 打赏
  • 举报
回复
我想知道重画一般需要画些什么, 举个例子
ren20 2001-05-07
  • 打赏
  • 举报
回复
?

谢谢
pgfun 2001-05-07
  • 打赏
  • 举报
回复
比如说你要做一个按钮,那么将按钮设为owerdraw,再重写其drawitem函数,使用CDC::FromHandle从传入参数中建立绘图dc,再往此dc上画按钮即可.
如果你的按钮是多边形的,那么还需要重载presubclasswindow(),在其中用SetWindowRgn建立多边形
ren20 2001-05-07
  • 打赏
  • 举报
回复
Drawitem 是自绘函数,但我还是不太明白他的功能,在那里用到?

请解释一下,谢谢了。 一般要画那些东西?
deadhorse 2001-05-07
  • 打赏
  • 举报
回复
那我总结一下:)
大所数情况下,继承你要自画的控件类,重载drawitem就可以了。
有些控件类不提供DrawItem虚函数,那就只有在OnPaint中画了。
大多数情况下,还要响应WM_ERASEBKGND消息,处理背景重画。
pgfun 2001-05-07
  • 打赏
  • 举报
回复
一般来说是重载drawitem
supperlxf 2001-05-07
  • 打赏
  • 举报
回复
Invalidate(hwnd,0,1);
在 OnPaint() 处理
Fnoopy 2001-05-07
  • 打赏
  • 举报
回复
对于自绘的控件系统向你的程序发送一个drawitem结构,里面包含了一点控件的状态信息,然后你就根据这些信息画你要画的控件。
xyzboat 2001-05-07
  • 打赏
  • 举报
回复
没太明白你的意思,我想是重绘吧.
关注一下Invalidate那个函数.

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧