一、画点、线、矩形和椭圆
1、在View类中定义成员变量UINT m_DrawType;
2、在View类构造函数中初始化 m_DrawType=0;
3、添加四个菜单项,分别在其响应事件中将m_DrawType设置为1(画点),2(画线),3(画矩形),4(画椭圆);
4、添加成员变量CPoint m_ptOrigin
5、在OnLButtonDown中设置 m_ptOrigin=point;
6、在OnLButtonUp中添加以下代码:
void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point)
{
CClientDC dc(this);
CPen pen(m_LineType,m_LineWidth,m_clr);
dc.SelectObject(&pen);
dc.SelectObject(CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)));
//透明画刷
switch(m_DrawType)
{
case 0:
break;
case 1:
dc.SetPixel(point,RGB(255,0,0));
break;
case 2:
dc.MoveTo(m_Origin);
dc.LineTo(point);
break;
case 3:
dc.Rectangle(CRect(m_Origin,point));
break;
case 4:
dc.Ellipse(CRect(m_Origin,point));
break;
}
CView::OnLButtonUp(nFlags, point);
}
二、创建颜色对话框
CColorDialog dlg;
dlg.m_cc.Flags|=CC_RGBINIT|CC_FULLOPEN; //颜色对话框关闭再打开时保持原来的设置
dlg.m_cc.rgbResult=m_clr;
if(IDOK==dlg.DoModal()) //用户点击的是OK按钮
{
m_clr=dlg.m_cc.rgbResult;//返回的颜色
}
三、创建字体对话框(用用户选择的字体输入字体名称)
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();//Invalidates the entire client area of CWnd
}
四、改变控件的背景色 CWnd::OnCtlColor
HBRUSH CSetDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(pWnd->GetDlgCtrlID()==IDC_LINE_STYLE) //组框
{
pDC->SetTextColor(RGB(0,0,255));
pDC->SetBkMode(TRANSPARENT);//改变文字背景为透明
}
if(pWnd->GetDlgCtrlID()==IDC_LINE_WIDTH)//编辑框
{
pDC->SetTextColor(RGB(0,0,255));
//pDC->SetBkMode(TRANSPARENT);//改变文字背景为透明
pDC->SetBkColor(RGB(0,255,0));
return m_brush;
}
//此处不能更改Button的背景色
return hbr;//此处返回控件的背景色
}
五、改变Button控件的文本颜色(重载CButton::DrawItem函数)
1、添加处定义类CMyButton,基类为CButton
2、为Button添加成员变量 CMyButton m_TestBtn;
3、重写CMyButton类的虚函数DrawItem //查看MSDN
void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
UINT uStyle = DFCS_BUTTONPUSH;
// This code only works with buttons.
ASSERT(lpDrawItemStruct->CtlType == ODT_BUTTON);
// If drawing selected, add the pushed style to DrawFrameControl.
if (lpDrawItemStruct->itemState & ODS_SELECTED)
uStyle |= DFCS_PUSHED;
// Draw the button frame.
::DrawFrameControl(lpDrawItemStruct->hDC, &lpDrawItemStruct->rcItem,
DFC_BUTTON, uStyle);
// Get the button's text.
CString strText;
GetWindowText(strText);
// Draw the button text using the text color red.
COLORREF crOldColor = ::SetTextColor(lpDrawItemStruct->hDC, RGB(255,0,0));
::DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(),
&lpDrawItemStruct->rcItem, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
::SetTextColor(lpDrawItemStruct->hDC, crOldColor);
}
六、利用CSXBtn类更改Button控件背景(为Button添加成员变量 CSXBtn m_btnSX;)(孙鑫编写)
七、利用CBtnST类更改Button控件背景(网友编写)Graphic工程里
1、为Button控件添加成员变量 CBtnST m_btnST;
2、重载对话框的OnInitDialog虚函数
BOOL CSetDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 在此添加额外的初始化
m_btnST.SetActiveBgColor(RGB(0,0,255));//设置活动时(鼠标移到其上时)的背景色
m_btnST.SetActiveFgColor(RGB(0,255,0));
m_btnST.SetInactiveBgColor(RGB(255,255,0));//设置不活动时的背景色
m_btnST.SetInactiveFgColor(RGB(255,0,255));
return TRUE; // return TRUE unless you set the focus to a control
}
八、在窗口中贴图
1、创建位图
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
2、创建兼容DC
CDC dcCompatible;
dcCompatible;.CreateCompatibleDC(pDC);
3、将位图选到兼容DC
dcCompatible.SelectObject(&bitmap);
4、将兼容DC中的位图贴到到当前DC中
pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);
实例:在WM_ERASEBKGND中实现(也可在OnDraw函数中实现)
BOOL CGraphicView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);
dcCompatible.SelectObject(&bitmap);
CRect rect;
GetClientRect(&rect);
//pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);//不能拉伸位图
BITMAP bmp;
bitmap.GetBitmap(&bmp);
pDC->StretchBlt(0,0,rect.Width(),rect.Height (),&dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
//可以拉伸位图以适应窗口大小
//return CView::OnEraseBkgnd(pDC);//不能执行,否则位图背景会被擦除,无法显示
return TRUE;
}