一、代码添加控件
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;
}