黄皮书第十章学习笔记_绘图控制

1、用DC在View上绘制图形的函数如下,点、线、矩形、椭圆总结如下四步:

 1 void CtenView::OnLButtonUp(UINT nFlags, CPoint point)
2 {
3 // TODO: Add your message handler code here and/or call default
4 CClientDC dc(this);
5 CPen pn(m_nLineStyle,m_nLineWidth,m_clr);
6 CPen *pPen=dc.SelectObject(&pn);
7 //dc.SelectObject(&pn);
8 CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
9 CBrush *pNow=dc.SelectObject(pBrush);
10 //dc.SelectObject(pBrush);
11 switch(m_nDrawType)
12 {
13 case 1:
14 dc.SetPixel(point,RGB(255,255,0)); //画点
15 break;
16 case 2:
17 dc.MoveTo(m_ptOrigin); //画线
18 dc.LineTo(point);
19 break;
20 case 3:
21 dc.Rectangle(CRect(m_ptOrigin,point)); //画矩形
22 break;
23 case 4:
24 dc.Ellipse(CRect(m_ptOrigin,point)); //画椭圆
25 break;
26 default:
27 break;
28 }
29 dc.SelectObject(pPen);
30 dc.SelectObject(pBrush);
31 CView::OnLButtonUp(nFlags, point);
32 } 

2、示例程序的代码:

//在此窗体类的WM_PAINT函数中写
void CSettingDlg::OnPaint()
{
CPaintDC dc(
this); // device context for painting
// TODO: Add your message handler code here
// Do not call CDialogEx::OnPaint() for painting messages
UpdateData(); //先UpdateData一下
CPen pn(m_nLineStyle,m_nLineWidth,m_clr);
dc.SelectObject(
&pn);

//其实也就是画图,获取了GroupBox这个组框的坐标来绘
CRect rect;
GetDlgItem(IDC_SAMPLE)
->GetWindowRect(&rect);
ScreenToClient(
&rect);

dc.MoveTo(rect.left
+20,rect.top+rect.Height()/2);
dc.LineTo(rect.right
-20,rect.top+rect.Height()/2);
}

3、对于对话框传对话框的问题。本例中,我用一个View类的事件(如菜单按钮)弹出一个对话框,然后这个对话框中的一个按钮,再次弹出一个颜色类的对话框去设置颜色。那么,我需要做的传递是,颜色类的传递给对话框,然后对话框传递给View类即可。当然,千万不要想着从颜色类对话框直接传递给View类对话框.

4、在OnCtlColor这个函数中,可以将窗体背景颜色改变,通过返回一个画刷,如:

private:
CBrush m_brush;
//定义一个全局变量

  

m_brush.CreateSolidBrush(RGB(0,255,0));  //构造函数初始化

然后在OnCtlColor函数中写:

HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

HBRUSH hbr
= CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);



// TODO: Change any attributes of the DC here



// TODO: Return a different brush if the default is not desired

return m_brush; //这里是我们自定义的画刷

}

具体详细代码如下:

 1 //这个函数是自行添加的
2 HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
3 {
4 HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
5 // TODO: Change any attributes of the DC here
6 if(pWnd->GetDlgCtrlID()==IDC_LINE_WIDTH) //这个函数的参数中pWnd是CWnd类的.我们可以取窗体类
7 {
8 pDC->SetTextColor(RGB(255,0,0)); //pDC是DC类,这里我们可以设置字体颜色
9 pDC->SetBkMode(TRANSPARENT); //设置字体背景是透明的,可以用SetBkMode
10 return m_brush;
11 }
12 if(pWnd->GetDlgCtrlID()==IDC_TEST)
13 {
14 pDC->SelectObject(&m_font);
15 }
16 if(pWnd->GetDlgCtrlID()==IDOK)
17 {
18 return m_brush;
19 }
20 // TODO: Return a different brush if the default is not desired
21 //return m_brush;
22 return hbr;
23 }

  

5、如果要修改某个控件的背景色,可以如下设置:

HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

HBRUSH hbr
= CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);



// TODO: Change any attributes of the DC here

//注意pWnd获取控件ID

if(pWnd->GetDlgCtrlID()==IDC_LINE_WIDTH)

{

return m_brush;

}

// TODO: Return a different brush if the default is not desired

return hbr;

}

  

6、重绘按钮的时候,需要我们新建一个CButton类(当然基类必须是CButton类),然后重写这个类的DrawItem这个虚函数。具体步骤是:

①、新建一个CButton类,基类是CButton

②、在这个新建的类中,新增一个函数,即是DrawItem,在里面写上重绘的代码(这里建议可以学习下孙鑫源代码里提供的那两个类)

③、让需要被重绘的按钮绑定变量,其中,变量基于我们新建的那个CButton这个类

④、这个按钮的Owner Draw属性,要设置为TRUE即可


7、如果要将.bmp位图,放到窗体上作为背景,可以如下代码所作:

 1 BOOL CtenView::OnEraseBkgnd(CDC* pDC)
2 {
3 // TODO: Add your message handler code here and/or call default
4 CBitmap bitmap;
5 bitmap.LoadBitmap(IDB_BITMAP1); //加载位图
6
7 BITMAP bmp; //这里是BITMAP结构体
8 bitmap.GetBitmap(&bmp);
9
10 CDC dcCompatible;
11 dcCompatible.CreateCompatibleDC(pDC);
12
13 dcCompatible.SelectObject(&bitmap);
14
15 CRect rect;
16 GetClientRect(&rect);
17
18 //pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY); //BitBlt是按照1:1进行拷贝
19
20 pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,
21 bmp.bmWidth,bmp.bmHeight,SRCCOPY); //也可以用StretchBlt进行位图拉伸,不过拉伸的话,要使用BITMAP结构体,如上
22
23 return TRUE; //注意最后的这个return是要修改的
24
25 //return CView::OnEraseBkgnd(pDC);
26 }

  


转载于:https://www.cnblogs.com/52yixin/articles/2148823.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值