1、画点
CDC::SetPixel
COLORREF SetPixel(int x,int y,COLORREF crColor);
COLORREF SetPixel(POINT point,COLORREF crColor); //用指定的颜色设置一个指定的点
void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point)
{
CClientDC dc(this);
CPen pen(m_nLineStyle,m_nLineWidth,m_clr);
dc.SelectObject(&pen);
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); //透明画刷
dc.SelectObject(pBrush);
switch(m_nDrawType)
{
case 1:
dc.SetPixel(point,m_clr);
break;
case 2:
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
break;
case 3:
dc.Rectangle(CRect(m_ptOrigin,point));
break;
case 4:
dc.Ellipse(CRect(m_ptOrigin,point));
break;
}
CView::OnLButtonUp(nFlags, point);
}
2、创建颜色对话框
CColorDialog : CCommonDialog : CDialog : CWnd : CmdTarget : CObject
CColorDialog::CColorDialog
CColorDialog(COLORREF clrInit=0,DWORD dwFlags=0,CWnd* pParetWnd=NULL);
颜色,默认黑色 功能,外观 父窗口
构造一个CColorDialog对象,然后直接DoModal()即可
获取用户选择的颜色,用该类的成员变量m_cc
CColorDialog::m_cc
CHOOSECOLOR m_cc;
CHOOSECOLOR结构体中有一个成员变量,COLORREF rgbResult; 保存了用户点击ok按钮时的颜色选择
如果想改变颜色对话框的初始颜色,可以改变该类的m_cc中的标记Flags,但不能直接用赋值的方式,然后使用新的颜色对rgbResult赋值
void CGraphicView::OnColor()
{
// TODO: Add your command handler code here
CColorDialog dlg;
dlg.m_cc.Flags|=CC_RGBINIT | CC_FULLOPEN;
dlg.m_cc.rgbResult=m_clr;
if(IDOK==dlg.DoModal())
{
m_clr=dlg.m_cc.rgbResult;
}
}
3、字体对话框
CFontDialog : CCommonDialog : CDialog : CWnd : CmdTarget : CObject
CFontDialog::CFontDialog
CFontDialog(LPLOGFONT lpltInitle=NULL,DWORD dwFlags=CFEFFECTS|CFSCRFFNFONTS,CDC*pdePrinter=NULL,CWnd* pParentWnd=NULL);
字体特征 选择字体的标记 打印设备上下文指针 父窗口指针
构造一个该类对象,然后DoModal()
CFont::CreateFontIndirect
BOOL CreateFontIndirect(const LOGFONT* lpLogFont); //用LOGFONT结构体初始化一个CFont对象
4、编辑框有一个EN_CHANGE消息,响应编辑内容的改变
5、UpdateData(); 不能忽视这个函数的作用,窗口数据交换
6、改变对话框背景色
有一个消息WM_CTLCOLOR,响应函数是OnCtlColor()
CWnd::OnCtlColor
afx_msg HBRUSH OnCtlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor);
子窗口的pdc 控件指针 控件的类型
nCtlColor=CTLCOLOR_BTN/CTLCOLOR_DLG/CTLCOLOR_STATIC等
返回一个画刷句柄,用于改变控件的背景色
一个控件将要被绘制的时候都要发消息给父窗口,准备一个pDC使用正确的颜色绘制控件
要改变文字的颜色,用CDC::SetTextColor()
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
return hbr; //只要改变这个值,就能直接改变对话框的背景颜色
}
返回子窗口或者子控件的id
CWnd::GetDlgCtrlID
int GetDlgCtrlID() const;
7、改变控件文字背景颜色为透明
CDC::SetBkMode
int SetBkMode(int nBkMode); //OPAQUE 不透明, TRANSPARENT 透明
改变编辑框内的文字背景,如果设置背景透明,则出现一条白色的区域,只能用背景同色的方式
CDC::SetBkColor()
要改变按钮的文字颜色,必须创建一个button类,覆盖成员函数DrawItem(); 按钮类型改为自绘
CButton::DrawItem
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(pWnd->GetDlgCtrlID()==IDC_LINE_STYLE)
{
pDC->SetTextColor(RGB(255,0,0));
pDC->SetBkMode(TRANSPARENT);
return m_brush;
}
if(pWnd->GetDlgCtrlID()==IDC_LINE_WIDTH)
{
pDC->SetTextColor(RGB(255,0,0));
//pDC->SetBkMode(TRANSPARENT);
pDC->SetBkColor(RGB(0,0,255));
return m_brush;
}
if(pWnd->GetDlgCtrlID()==IDC_TEXT)
{
pDC->SelectObject(&m_font);
}
// TODO: Return a different brush if the default is not desired
return hbr;
//return m_brush;
}
8、在窗口中贴图
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);
CDC::CreateCompatibleDC
virtual BOOL CreateCompatibleDC(CDC* pDC); //
CDC::BitBlt
BOOL BitBlt(int x,int y,int nWidth,int nHeight,CDC* pSrcDC,int xSrc,int ySrc,DWORD
dwRop); //按1:1的比例输出位图
CWnd::OnEraseBkgnd
afx_msg BOOL OnEraseBkgnd(CDC* pDC); //擦除背景成功,返回非零
伸缩显示位图
CDC::StretchBlt
BOOL StretchBlt(int x,int y,int nWidth,int nHelgnt,CDC* pSrcDC,int xSrc,int ySrc,int
nSrcWidth,int pSrcHeight,DWORD dwRcp);
获取位图信息
CBitmap::GetBitmap
int GetBitmap(BITMAP* pBitMap);
typedof struct tacBITMAP{
int bmType;
int bmWidth;
int bmHeight;
int bmKidthbysoc;
BYTE bmPlanes;
BYTE bmFitsPixel
LPVOID bmBits;
}BITMAP;
BOOL CGraphicView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
BITMAP bmp;
bitmap.GetBitmap(&bmp);
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);
dcCompatible.SelectObject(&bitmap);
CRect rect;
GetClientRect(&rect);
// pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,
0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
return TRUE;
// return CView::OnEraseBkgnd(pDC);
}
9、注意在ondraw()函数中显示背景,和在擦除背景函数中显示背景的不同点
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/happyhhb/archive/2007/05/30/1631940.aspx