MFC代码添加控件并设定格式

一、代码添加控件

1.在MainFrm中

要想在框架窗口上添加控件,以CButton为例,需要在框架窗口产生之后,再创建按钮。因此,通过在窗口创建的WM_CREATE消息的响应函数OnCreate中添加CButton。

首先在MainFrm的头文件中声明CButton my_button,而不能直接在OnCreate函数中进行声明。

因为局部对象在函数结束时便会被销毁。

之后在MainFrm的OnCreate函数中添加代码:

my_button.Create("按钮",WS_CHILD|BS_DEFPUSHBUTTON,CRect(0,0,100,100),this,123);
my_button.ShowWindow(SW_SHOWNORMAL);

这里BS_DEFPUSHBUTTON为按钮风格。

这里this表示按钮的父类窗口为MainFrm。

此处123为ID号,可以在资源符号中自定义其所需要的符号ID。

my_button.Create("按钮",WS_CHILD|BS_DEFPUSHBUTTON,CRect(0,0,100,100),this,IDC_MYBUTTON);

然后通过ShowWindow将按钮显示出来。这里的SW 表示是ShowWindow的命令。

这样按钮被显示在框架窗口上。

2.在View中添加

对于View视类而言,默认没有OnCreate函数,需要手动在类视图中,添加WM_CREATE的响应函数。后续介绍详细添加过程。

添加完成后,将前面的代码添加到View类的OnCreate函数中。然后按钮就会显示在视类窗口。若将this修改为GetParent(),会发现按钮重新显示在框架窗口上。因此,按钮的位置由其父窗口有关,而不是与他创建的代码所在类有关。

若想让控件创建之后立即显示,可以在创建的Create函数中设置Style为WS_VISIBLE,这里的WS表示为Window Style。

my_button.Create("按钮",WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON,CRect(0,0,100,100),this,123);

二、格式控制 

以VS2008为例,点击类视图中对应的View类,

可以获取到消息事件属性框

通过对WM_CTLCOLOR消息进行响应,完成控件颜色、背景和位置的设定。

以CStatic为例,进行格式设定

通过case多值匹配来完成多个控件相同配置

HBRUSH CChartView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor);

	if(nCtlColor == CTLCOLOR_STATIC)//判断是否为static控件
	{
		pDC->SetBkMode(TRANSPARENT);
		switch(pWnd->GetDlgCtrlID())
		{
			case IDC_K_TIME:
			case IDC_K_Open:
			case IDC_K_Highest:
			case IDC_K_Lowest:
			case IDC_K_Close:
				{
					pDC->SetTextColor(RGB(255,255,255));//白
					return (HBRUSH)GetStockObject(HOLLOW_BRUSH); 
				}
        }
    }
    return hbr;
}

其中pDC->SetBkMode(TRANSPARENT);将控件设置为透明。

pDC->SetTextColor(RGB(255,255,255));设置字体颜色

m_static.MoveWindow(CRect(100,0,100,100));

通过MoveWindow函数移动位置。

可以在控件创建的时候,不使用SW_VISIBLE风格,然后在移动等操作之后再调用ShowWindow来显示。

my_static.ShowWindow(SW_HIDE);//将控件隐藏

在其他位置(非OnCtlColor()函数中)也可以获取CDC *pDC=GetDC();

但是在其他位置,不易修改控件格式。

仅仅进行函数调用格式修改不报错,但是无效。


通过响应WM_ERASEBKGND来完成背景颜色修改

BOOL CChartView::OnEraseBkgnd(CDC* pDC)//更换背景颜色为黑色
{
	CBrush brush(RGB(0,0,0));
	CBrush *pOldOne=pDC->SelectObject(&brush);
	CRect rc;
	pDC->GetClipBox(&rc);//获得需要重绘的区域
	pDC->PatBlt(rc.left,rc.top,rc.Width(),rc.Height(),PATCOPY);//已特定模式拷贝到目标矩形区域
	pDC->SelectObject(pOldOne);
	return TRUE;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值