Visual C++开发教程:如何实现MFC自绘制

MFC 支 持 自 绘 制(owner-draw) 概 念, 自 绘 制 的 控 制 类, 通 过 调 用DrawItem() 函 数 实 现 控 件 的 绘 制, 由 于 控 件 绘 制, 消 息 检 测 和 消 息 比 较 代 码 是 在 控 件 中 实 现 而 不 足 在 拥 有 控 件 的 窗 口 中 实 现, 因 而 叫 自 绘 制。 因 而 通 过 重 载DrawItem(LPDRAWITEMSTRUCT 函 数 来 控 制 控 件 的 外 观 和 行 为, 实 现 控 制 所 需 要 的 参 数, 都 包 含 在LPDRAWITEMSTRUCT 结 构 中。

—- MFC 支 持 自 绘 制(owner-draw) 概 念, 自 绘 制 的 控 制 类, 通 过 调 用DrawItem() 函 数 实 现 控 件 的 绘 制, 由 于 控 件 绘 制, 消 息 检 测 和 消 息 比 较 代 码 是 在 控 件 中 实 现 而 不 足 在 拥 有 控 件 的 窗 口 中 实 现, 因 而 叫 自 绘 制。 因 而 通 过 重 载DrawItem(LPDRAWITEMSTRUCT 函 数 来 控 制 控 件 的 外 观 和 行 为, 实 现 控 制 所 需 要 的 参 数, 都 包 含 在LPDRAWITEMSTRUCT 结 构 中。

—- LPDRAWITEMSTRUCT 结 构:

—- 最 重 要 的 参 数 是itemAction,itemState,hDC,rcItem, 它 们 是 实 现 控 件 外 观 绘 制, 消 息 响 应 所 必 须 的。

—- itemAction: 绘 制 动 作, 有 以 下 几 种 取 值:ODA_DRAWENTIRE,ODA_FOCUS, ODA_SELECT.

—- itemState: 状 态, 有 以 下 几 种 取 值:ODS_CHECKED,ODS_DISABLED,ODS_FOCUS, ODS_GRAYED,ODS_SELECTED,ODS_DEFAULT.

—- hDC: 设 备 环 境 的 句 柄。

—- rcItem: 控 件 外 观 大 小 的 矩 形。

—- 下 面 给 出 一 个 基 于CButton 类 的 图 象Button 类:CMybtn

—- 利 用MFC Wizard 创 建 一 个 新 类CMybtn, 基 类 是CButton

 mybtn.h:class CMybtn : public CButton{// Construction...public:virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);......public:void setbitmapid(UINT id);...protected:UINT m_bitmapid;//图象的按纽id值...DECLARE_MESSAGE_MAP()};mybtn.cppCMybtn::CMybtn(){m_bitmapid=0;//在构造函数中初始化m_bitmaoid} void CMybtn::DrawItem(LPDRAWITEMSTRUCT lpdis){HBITMAP hbitmap=NULL;ASSERT(lpdis!=NULL);CDC *pdc=CDC::FromHandle(lpdis- >hDC);//lpdis- >hdc是设备环境的句柄,fromhandle函数将handle- >指针CRect r1;r1.CopyRect(&lpdis- >rcItem);//得到控件的矩形范围UINT state=lpdis- >itemState;//得到控件的状态if((state & ODS_SELECTED))pdc- >Draw3dRect(r1,GetSysColor(COLOR_3DDKSHADOW),GetSysColor(COLOR_3DHILIGHT));//selected时,用COLOR_3DDKSHADOW画左上部,COLOR_HILIGHT画右下部,表现为凹陷elsepdc- >Draw3dRect(r1,GetSysColor(COLOR_3DHILIGHT),GetSysColor(COLOR_3DDKSHADOW));//正常时,用COLOR_3DHILIGHT画左上部,COLOR_3DDKSHADOW画右下部,表现为突起// TODO: Add your code to draw the specified itemif(m_bitmapid)hbitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(m_bitmapid),IMAGE_BITMAP,0,0,LR_DEFAULTCOLOR);//如有图象,则装载图象,CString s1;GetWindowText(s1);//得到BUTTON的CAPTIONif(!s1.IsEmpty()){int mode1=pdc->SetBkMode(TRANSPARENT);if(!hbitmap)pdc- >DrawText(s1,r1,DT_CENTER|DT_VCENTER|DT_SINGLELINE);//如没有图象,则在整个BUTTON范围输出文字else{CRect r2=r1;r2.DeflateRect(2,2);CDC memdc;CBitmap bmp;CBitmap *oldbitmap;bmp.Attach(hbitmap);BITMAP  bitmap;bmp.GetBitmap(&bitmap);//由BITMAP结构可以得出图象的高,宽memdc.CreateCompatibleDC(pdc);oldbitmap=memdc.SelectObject(&bmp);pdc- >StretchBlt(r2.left,r2.top,r2.Width()/2,r2.Height(),&memdc,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);//把图象从内存压缩拷贝到BUTTON范围memdc.SelectObject(oldbitmap);bmp.Detach();CRect r3=r2;r3.left=r2.left+r2.Width()/2;pdc- >DrawText(s1,r3,DT_CENTER|DT_VCENTER|DT_SINGLELINE);}}}void CMybtn::setbitmapid(UINT id){m_bitmapid=id;}  ---- 利用CMybtn类代码可以在应用系统中实现图象文字按纽,在dialog中加入按纽 (IDC_BUTTON1),(IDC_BUTTON2)设置它们的属性为 owner-draw.利用resource editor 加入两个图象文件,id值为:IDB_BITMAP1,IDB_BITMAP2。class CWs3Dlg : public CDialog   {     ...   public:   // Dialog Data   //{{AFX_DATA(CWs3Dlg)enum { IDD = IDD_WS3_DIALOG };CMybtnm_btn1;CMybtnm_btn2;//定义图象按纽     //}}AFX_DATA...protected:virtual void DoDataExchange(CDataExchange* pDX);     // DDX/DDV support//}}AFX_VIRTUAL       ....//}}AFX_MSGDECLARE_MESSAGE_MAP()  };   void CWs3Dlg::DoDataExchange(CDataExchange* pDX)   {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CWs3Dlg)DDX_Control(pDX, IDC_BUTTON2, m_btn2);DDX_Control(pDX, IDC_BUTTON1, m_btn1);//}}AFX_DATA_MAP}  在初始化代码加入:   BOOL CWs3Dlg::OnInitDialog()  {...  // TODO: Add extra initialization here   m_btn1.setbitmapid(IDB_BITMAP1);   m_btn2.setbitmapid(IDB_BITMAP2);   return TRUE;  // return TRUE  unless                    you set the focus to a control}

MFC扩展类库

在平时练习的时候我们可以自己手动进行,但是一旦接受一些项目,应用程序开发等,对界面的要求就会高出许多。这时候就有必要借助这些“半成品”实现界面美化提升效率。这里简单介绍一下,具体可点进去查看每个的详情以及教程,案例!

BCGControlBar

标签:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年10月23日
下一篇 2020年10月23日

相关推荐

发表回复

登录后才能评论