此乃作者笔记,仅此而已。
画图操作:
void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
switch (m_nDrawType)
{
case 1:
dc.SetPixel(point, RGB(255, 0, 0));
break;
case 2:
dc.MoveTo( m_prOrigin);
dc.LineTo(point);
break;
case 3:
dc.Rectangle( CRect( m_prOrigin, point) );
break;
case 4:
dc.Ellipse(CRect( m_prOrigin, point));
break;
default:
break;
}
CView::OnLButtonUp(nFlags, point);
}
//对于CClientDC的成员函数Rectangle和Ellipse,其函数参数是一个指向CRect对象的指针,而这里传
递的却是CRect对象,主要是因为CRect类型提供了这样一个成员函数:重载LPCRECT操作符,其作用是将
CRect转换为LPCRECT类型。
再次声明,添加画笔(即修改笔的颜色):
CPen pen (PS_SOLID, 1, RGB(255, 0, 0));
dc.SelectObject( &pen);
修改画刷颜色,可以指定为透明:
CBrush *pBrush = CBrush::FromHandle( (HBRUSH)GetStockObject(NULL_BRUSH));
dc.SelectObject( pBrush);
修改字体:
CFont *pOldFont = pDC ->SelectObject( &m_font);
pDC->TextOut( 0, 0, m_strFontName);
pDC->SelectObject( pOldFont);
添加设置Pen的宽度的对话框:
①先构造对话框,再生成一个类
②在对话框中生成一个于控件关联的成员变量,用以保存笔宽。在视类中声明一个成员变量,用以保存
对话框传来的笔宽
③在menu中添加相应的设置菜单,并且添加响应函数
④在响应函数中调用设置对话框,并且将对话框中的笔宽取过来,保存在视类的成员变量中
注意:为了让设置对话框打开时显示的是上一次出现的笔宽,还需要在响应函数中,调用DoModal之前,
将上次的笔宽再保存回去
颜色对话框:CColorDialog类
void CGraphicView::OnColor()
{
// TODO: Add your command handler code here
CColorDialog dlg;
dlg.m_cc.Flags |= CC_RGBINIT;
dlg.m_cc.rgbResult = m_clr;
if( IDOK == dlg.DoModal())
{
m_clr = dlg.m_cc.rgbResult;
}
}
字体选择对话框:CFontDialog
void CGraphicView::OnFont()
{
// TODO: Add your command handler code here
CFontDialog dlg;
if( IDOK == dlg.DoModal())
{
if( m_font.m_hObject)
m_font.DeleteObject();
m_font.CreateFontIndirect( dlg.m_cf.lpLogFont);
m_strFontName = dlg.m_cf.lpLogFont->lfFaceName;
}
Invalidate();
}
对话框中添加示例:
void CSettingDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CDialog::OnPaint() for painting messages
UpdateData();
CPen pen( m_nLineStyle , m_nLineWidth, RGB( 255, 0, 0));
dc.SelectObject( &pen);
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);
}
改变对话框控件的背景及文本颜色:
为了修改对话框颜色,需要捕获WM_CTLCOLOR消息,在响应函数中修改颜色
//字体和Brush在构造函数中已经创建完成。
//m_brush.CreateSolidBrush( RGB(0, 0, 255));
//m_font.CreatePointFont( 200,_T( "华文行楷"));
HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
// TODO: Return a different brush if the default is not desired
if( pWnd->GetDlgCtrlID() == IDC_LINE_STYLE || pWnd->GetDlgCtrlID() ==
IDC_LINE_WIDTH)
{
pDC->SetTextColor( RGB(255, 0, 0));
pDC->SetBkMode(TRANSPARENT);
return m_brush;
}
if( pWnd ->GetDlgCtrlID() == IDC_TEXT)
{
pDC->SelectObject( &m_font);
pDC->SetTextColor( RGB( 0, 255, 0));
}
return hbr;
}
如果要改变按钮控件的背景和文字颜色,需要使用CButton类的一个成员函数:DrawItem
显示位图:
①创建位图,加载位图CBitmap
②创建兼容的DC
③将位图选入兼容DC中
④将兼容DC中的位图贴到当前DC中BitBlt
BOOL CStyleView::OnEraseBkgnd(CDC* pDC)
{
CBitmap bitmap;
bitmap.LoadBitmap( IDB_TEST);
CDC dcCompatible;
dcCompatible.CreateCompatibleDC( pDC);
dcCompatible.SelectObject( &bitmap);
CRect rect;
GetClientRect( &rect);
pDC->BitBlt( 0, 0, rect.Width(), rect.Height(), &dcCompatible, 0, 0, SRCCOPY);
// TODO: Add your message handler code here and/or call default
return TRUE;
}
BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc,
int nSrcWidth, int nSrcHeight, DWORD dwRop);
与BitBlt函数不同的是,StretchBIt函数可以实现位图的拉伸或压缩,以适合目的矩形区域的尺寸