求教:如何用MFC在对话框上画有颜色的线;如何设置窗口上StaticText的颜色?

puffgeng 2001-08-01 06:42:15
请给出代码示例。
我知道这些问题很简单,我可是刚学MFC哦,你们别笑话我。
...全文
270 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
puffgeng 2001-08-01
  • 打赏
  • 举报
回复
太感谢大家了,都成功了,立刻给分!!!!!!!!
wild_boy 2001-08-01
  • 打赏
  • 举报
回复
改变StaticText颜色

1、给对话框定义成员变量
CBrush m_brush;

2、在对话框初始化函数OnInitDialog(...)中增加
m_brush.CreateSolidBrush(RGB(0, 0, 0));

3、重载对话框OnCtlColor,如下:
HBRUSH CTest2Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

if (nCtlColor == CTLCOLOR_STATIC)
{
/* Update BK Color to RED */
pDC->SetBkColor(RGB(255,0,0));

/* Update Text Color to WHITE */
pDC->SetTextColor(RGB(255, 255, 255));

/* return you own brush
hbr = m_brush;
}

// TODO: Return a different brush if the default is not desired
return hbr;
}
五行擒拿术 2001-08-01
  • 打赏
  • 举报
回复
你只要重载你窗口的OnCtlColor()函数
OnCtlColor()函数
HBRUSH CSelectPathDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here
if( CTLCOLOR_STATIC == nCtlColor )
{
HBrush m_Brush = ::CreateSolidBrush( RGB( 0 ,0 ,0 ) );
return m_Brush ;
}
// TODO: Return a different brush if the default is not desired
return hbr;
}

写成这样就可以了,虽然会有资源泄漏,不过,至少可以设置你Static的颜色,
你通过修改RGB(0,0 ,0)可以改变颜色
puffgeng 2001-08-01
  • 打赏
  • 举报
回复
画线已经可以了,代码如下:
void CDialogLoginInfo::OnPaint()
{
CPaintDC dc(this); // device context for painting

CPen pen(PS_SOLID,1,RGB(0,0,0));
CPen *pOldPen=dc.SelectObject (&pen);
dc.MoveTo(50,50);
dc.LineTo(200,200);
dc.SelectObject(pOldPen);

// Do not call CDialog::OnPaint() for painting messages
}
感谢table.
puffgeng 2001-08-01
  • 打赏
  • 举报
回复
还是不太明白,来个痛快的,有代码吗?
五行擒拿术 2001-08-01
  • 打赏
  • 举报
回复
你可以通过
HBrush m_Brush = ::CreateSolidBrush( RGB( 0 ,0 ,0 ) );
来生成一个刷子,
关于刷子是什么,刷子就是每次Window重绘窗口的时候,都是用刷子来刷新的,然后再画其他东西。。
puffgeng 2001-08-01
  • 打赏
  • 举报
回复
table,谢谢,我至少给你10分,但刷子的代码我还是不太明白,请再讲细些好吗?
五行擒拿术 2001-08-01
  • 打赏
  • 举报
回复
我说的是显示Static的颜色,
如果你要画线,就用一个CPen来画线吧。。具体怎么做。。。不太好说。。贴代码
这段代码是画一个日历的框框,以前我写的日历控件,全部都是画线画出来的,累。
void CCalendar::DrawLine(CDC *pDC)
{
int i ;
POINT Despt ;

CPen LightPen( PS_SOLID , 1 , DEFAULT_3D_LIGHT_COLOR ) ;
CPen DarkPen( PS_SOLID , 1 , DEFAULT_3D_DARK_COLOR ) ;
CPen MoreLightPen ( PS_SOLID , 1 , DEFAULT_3D_MORE_LIGHT_COLOR ) ;
CPen* pOldPen ;

//now draw the table border line .
// light pen
pOldPen = pDC->SelectObject( &MoreLightPen ) ;

// pDC->MoveTo( m_rcBorder.left , m_rcBorder.top ) ;
// pDC->LineTo( m_rcBorder.right - OFFSET , m_rcBorder.top ) ;

//draw top line , left to right .
pDC->MoveTo( m_rcBorder.left , m_rcTitle.top ) ;
pDC->LineTo( m_rcBorder.right /*- OFFSET*/ , m_rcTitle.top ) ;
//draw left line , top to bottom
pDC->MoveTo( m_rcBorder.left , m_rcBorder.top + m_rcTitle.top ) ;
pDC->LineTo( m_rcBorder.left , m_rcBorder.bottom - OFFSET ) ;
//draw right line , bottom to top
pDC->MoveTo( m_rcBorder.right - OFFSET , m_rcBorder.bottom - OFFSET ) ;
pDC->LineTo( m_rcBorder.right - OFFSET , m_rcBorder.top + m_rcTitle.top ) ;
//draw bottom line , right to left
pDC->MoveTo( m_rcBorder.right - OFFSET , m_rcBorder.bottom - OFFSET ) ;
pDC->LineTo( m_rcBorder.left , m_rcBorder.bottom - OFFSET ) ;

// more light pen
pDC->SelectObject( &LightPen ) ;

// pDC->MoveTo( m_rcBorder.left +1 , m_rcBorder.top + 1) ;
// pDC->LineTo( m_rcBorder.right - OFFSET +1 , m_rcBorder.top + 1 ) ;
pDC->MoveTo( m_rcBorder.left , m_rcTitle.top + 1) ;
pDC->LineTo( m_rcBorder.right /*- OFFSET*/ , m_rcTitle.top + 1 ) ;

pDC->MoveTo( m_rcBorder.left + 1 , m_rcBorder.top + 1 + m_rcTitle.top ) ;
pDC->LineTo( m_rcBorder.left + 1 , m_rcBorder.bottom - OFFSET +1 ) ;

pDC->MoveTo( m_rcBorder.right - OFFSET +1 , m_rcBorder.bottom - OFFSET +1 ) ;
pDC->LineTo( m_rcBorder.right - OFFSET +1 , m_rcBorder.top + m_rcTitle.top) ;
pDC->MoveTo( m_rcBorder.right - OFFSET +1, m_rcBorder.bottom - OFFSET +1 ) ;
pDC->LineTo( m_rcBorder.left , m_rcBorder.bottom - OFFSET +1 ) ;

//dark pen

pDC->SelectObject( &DarkPen ) ;
//pDC->MoveTo( m_rcBorder.left + 2 , m_rcBorder.top +2 ) ;
//pDC->LineTo( m_rcBorder.right - OFFSET +2 , m_rcBorder.top +2 ) ;
pDC->MoveTo( m_rcBorder.left+2 , m_rcTitle.top+2 ) ;
pDC->LineTo( m_rcBorder.right /*- OFFSET + 2*/ , m_rcTitle.top + 2 ) ;


pDC->MoveTo( m_rcBorder.left + 2 , m_rcBorder.top +2 + m_rcTitle.top ) ;
pDC->LineTo( m_rcBorder.left + 2 , m_rcBorder.bottom - OFFSET +2 ) ;

pDC->MoveTo( m_rcBorder.right - OFFSET +2 , m_rcBorder.bottom - OFFSET +2 ) ;
pDC->LineTo( m_rcBorder.right - OFFSET +2 , m_rcBorder.top + m_rcTitle.top ) ;
pDC->MoveTo( m_rcBorder.right - OFFSET +2 , m_rcBorder.bottom - OFFSET +2 ) ;
pDC->LineTo( m_rcBorder.left , m_rcBorder.bottom - OFFSET +2 ) ;

//now draw the table body line .
pDC->SelectObject( &LightPen ) ;
for( i = 0 ; i < TABLE_LENGTH ; i ++ )
{
pDC->MoveTo( m_rcTable.left , m_rcTable.top + i*m_PaneSize.cy ) ;
Despt.x = m_rcTable.right ;
Despt.y = m_rcTable.top + i*m_PaneSize.cy ;
pDC->LineTo( Despt ) ;
}

for( i = 1 ; i < TABLE_WIDTH ; i++ )
{
pDC->MoveTo( i*m_PaneSize.cx , m_rcTableBody.top + 2 );
Despt.x = i*m_PaneSize.cx ;
Despt.y = m_rcTableBody.bottom ;
pDC->LineTo( Despt ) ;
}

// pDC->MoveTo( m_rcDisplay.left , m_rcDisplay.bottom ) ;
// pDC->LineTo( m_rcDisplay.right , m_rcDisplay.bottom ) ;

pDC->SelectObject( &DarkPen ) ;
for( i = 0 ; i < TABLE_LENGTH ; i ++ )
{
pDC->MoveTo( m_rcTable.left , m_rcTable.top + i*m_PaneSize.cy +1 ) ;
Despt.x = m_rcTable.right ;
Despt.y = m_rcTable.top + i*m_PaneSize.cy +1 ;
pDC->LineTo( Despt ) ;
}
for( i = 1 ; i < TABLE_WIDTH ; i++ )
{
pDC->MoveTo( i*m_PaneSize.cx +1 , m_rcTableBody.top + 2 );
Despt.x = i*m_PaneSize.cx +1 ;
Despt.y = m_rcTableBody.bottom ;
pDC->LineTo( Despt ) ;
}
// pDC->MoveTo( m_rcDisplay.left , m_rcDisplay.bottom+1 ) ;
// pDC->LineTo( m_rcDisplay.right , m_rcDisplay.bottom +1) ;

pDC->SelectObject( &MoreLightPen ) ;

for( i = 0 ; i < TABLE_LENGTH ; i ++ )
{
pDC->MoveTo( m_rcTable.left , m_rcTable.top + i*m_PaneSize.cy + 2 ) ;
Despt.x = m_rcTable.right ;
Despt.y = m_rcTable.top + i*m_PaneSize.cy +2 ;
pDC->LineTo( Despt ) ;
}

for( i = 1 ; i < TABLE_WIDTH ; i++ )
{
pDC->MoveTo( i*m_PaneSize.cx +2 , m_rcTableBody.top + 2 );
Despt.x = i*m_PaneSize.cx +2 ;
Despt.y = m_rcTableBody.bottom ;
pDC->LineTo( Despt ) ;
}

// pDC->MoveTo( m_rcDisplay.left , m_rcDisplay.bottom+2 ) ;
// pDC->LineTo( m_rcDisplay.right , m_rcDisplay.bottom +2 ) ;

pDC->SelectObject( pOldPen ) ;

}
puffgeng 2001-08-01
  • 打赏
  • 举报
回复
panda_w,请你详细说说。
puffgeng 2001-08-01
  • 打赏
  • 举报
回复
table,你说的太粗了,我还是不明白。
panda_w 2001-08-01
  • 打赏
  • 举报
回复
还不如在OnPaint中画线呢!设置画(刷)笔就好了
五行擒拿术 2001-08-01
  • 打赏
  • 举报
回复
在你的staic的父窗口中重载
OnCtlColor()函数
HBRUSH CSelectPathDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here
if( CTLCOLOR_STATIC == nCtlColor )
{
return m_Brush ;
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
这样就可以了,m_Brush是你生成的刷子,包含了颜色信息

16,472

社区成员

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

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

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