从CPropertySheet派生一个具有自绘功能的新类
来源:互联网 发布:淘宝信用卡有什么好处 编辑:程序博客网 时间:2024/05/10 19:56
//从CPropertySheet派生一个新类
//具有自绘题头功能
#pragma once// OwnerDraw_PropertySheet.h : header file///////////////////////////////////////////////////////////////////////////////// COwnerDraw_PropertySheetclass COwnerDraw_PropertySheet : public CPropertySheet{ DECLARE_DYNAMIC(COwnerDraw_PropertySheet)// Constructionpublic: COwnerDraw_PropertySheet(); COwnerDraw_PropertySheet(UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0); COwnerDraw_PropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);// Attributespublic:// Operationspublic: INT InsertPage(CPropertyPage* pPage, INT nIndex=-1);// Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(COwnerDraw_PropertySheet) public: virtual BOOL OnInitDialog(); //}}AFX_VIRTUAL// Implementationpublic: virtual ~COwnerDraw_PropertySheet(); // Generated message map functionsprotected: //{{AFX_MSG(COwnerDraw_PropertySheet) afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct); afx_msg void OnSize(UINT nType, int cx, int cy); //}}AFX_MSG DECLARE_MESSAGE_MAP() virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam); virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult);protected: void Comm_Init();protected: COLORREF m_crSelColour, m_crGrayColour; CFont m_SelFont, m_UnselFont;};
// OwnerDraw_PropertySheet.cpp : implementation file//#include "stdafx.h"#include "OwnerDraw_PropertySheet.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// COwnerDraw_PropertySheetIMPLEMENT_DYNAMIC(COwnerDraw_PropertySheet, CPropertySheet)COwnerDraw_PropertySheet::COwnerDraw_PropertySheet():CPropertySheet(){ Comm_Init();}COwnerDraw_PropertySheet::COwnerDraw_PropertySheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage) :CPropertySheet(nIDCaption, pParentWnd, iSelectPage){ Comm_Init();}COwnerDraw_PropertySheet::COwnerDraw_PropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage) :CPropertySheet(pszCaption, pParentWnd, iSelectPage){ Comm_Init();}void COwnerDraw_PropertySheet::Comm_Init(){}COwnerDraw_PropertySheet::~COwnerDraw_PropertySheet(){ m_SelFont.DeleteObject(); m_UnselFont.DeleteObject();}BEGIN_MESSAGE_MAP(COwnerDraw_PropertySheet, CPropertySheet) //{{AFX_MSG_MAP(COwnerDraw_PropertySheet) ON_WM_DRAWITEM() ON_WM_SIZE() //}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// COwnerDraw_PropertySheet message handlersBOOL COwnerDraw_PropertySheet::OnInitDialog() { BOOL bResult = CPropertySheet::OnInitDialog(); // TODO: Add your specialized code here CTabCtrl *pTabCtrl = GetTabControl(); pTabCtrl->ModifyStyle(0, TCS_OWNERDRAWFIXED ); //使之具有自绘功能 m_crSelColour = RGB(0,0,255); //选中字体颜色 m_crGrayColour = RGB(128,128,128); //灰字体颜色 //创建字体 CFont *pFont = pTabCtrl->GetFont(); LOGFONT mLogFont, mSelLogFont; pFont->GetLogFont(&mLogFont); mSelLogFont = mLogFont; mSelLogFont.lfWeight = FW_ULTRABOLD; m_SelFont.DeleteObject(); m_SelFont.CreateFontIndirect(&mSelLogFont); m_UnselFont.DeleteObject(); m_UnselFont.CreateFontIndirect(&mLogFont); return bResult;}void COwnerDraw_PropertySheet::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: Add your message handler code here and/or call default CPropertySheet::OnDrawItem(nIDCtl, lpDrawItemStruct); if(lpDrawItemStruct->CtlType == ODT_TAB) { CTabCtrl *pTabCtrl = GetTabControl(); CRect rect = lpDrawItemStruct->rcItem; INT nTabIndex = lpDrawItemStruct->itemID; if (nTabIndex < 0) return; TCHAR label[64]; TC_ITEM tci; tci.mask = TCIF_TEXT|TCIF_IMAGE; tci.pszText = label; tci.cchTextMax = 63; pTabCtrl->GetItem(nTabIndex, &tci ); CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); if (!pDC) return; int nSavedDC = pDC->SaveDC(); // For some bizarre reason the rcItem you get extends above the actual drawing area. We have to workaround this "feature". rect.top += ::GetSystemMetrics(SM_CYEDGE); pDC->SetBkMode(TRANSPARENT); //pDC->FillSolidRect(rect, ::GetSysColor(COLOR_BTNFACE)); // Draw image CImageList* pImageList = pTabCtrl->GetImageList(); if (pImageList && tci.iImage >= 0) { rect.left += pDC->GetTextExtent(_T(" ")).cx; // Margin // Get height of image so we IMAGEINFO info; pImageList->GetImageInfo(tci.iImage, &info); CRect ImageRect(info.rcImage); INT nYpos = rect.top; pImageList->Draw(pDC, tci.iImage, CPoint(rect.left, nYpos), ILD_TRANSPARENT); rect.left += ImageRect.Width(); } COLORREF txtColor = GetSysColor(COLOR_WINDOWTEXT); CFont *pSelFont = 0; if (lpDrawItemStruct->itemState & CDIS_SELECTED ) { rect.top -= ::GetSystemMetrics(SM_CYEDGE); txtColor = m_crSelColour; pSelFont = &m_SelFont; } else if(lpDrawItemStruct->itemState & (CDIS_DISABLED | CDIS_GRAYED) ) { txtColor = m_crGrayColour; pSelFont = &m_UnselFont; } else { } pDC->SetTextColor(txtColor); if(pSelFont) pDC->SelectObject(pSelFont); pDC->DrawText(label, rect, DT_SINGLELINE|DT_VCENTER|DT_CENTER); pDC->RestoreDC(nSavedDC); }}void COwnerDraw_PropertySheet::OnSize(UINT nType, int cx, int cy) { CPropertySheet::OnSize(nType, cx, cy); // TODO: Add your message handler code here if(!GetSafeHwnd()) return; CTabCtrl *pCtrl = GetTabControl(); if(pCtrl) { CRect SheetRect; GetClientRect(&SheetRect); CRect PageRect = SheetRect; pCtrl->AdjustRect(0, PageRect); for(INT nPage=0; nPage<GetPageCount(); nPage++) { CPropertyPage *pPage = GetPage(nPage); if(pPage && pPage->GetSafeHwnd()) { pPage->MoveWindow( &PageRect ); //pPage->PostMessage(WM_SIZE); } } } }LRESULT COwnerDraw_PropertySheet::WindowProc(UINT message, WPARAM wParam, LPARAM lParam){ // TODO: 在此添加专用代码和/或调用基类 if(WM_ERASEBKGND == message) return TRUE; if(WM_PAINT == message) { PAINTSTRUCT ps; CDC *pDC = BeginPaint(&ps); EndPaint(&ps); return(0); } return CPropertySheet::WindowProc(message, wParam, lParam);}INT COwnerDraw_PropertySheet::InsertPage(CPropertyPage* pPage, INT nIndex){ ASSERT_VALID(this); ENSURE_VALID(pPage); ASSERT_KINDOF(CPropertyPage, pPage); if(nIndex < 0 || nIndex > GetPageCount())//add to end { nIndex = GetPageCount(); } // add page to internal list m_pages.InsertAt(nIndex, pPage); // add page externally if (m_hWnd != NULL) { // build new prop page HPROPSHEETPAGE hPSP = AfxCreatePropertySheetPage(&pPage->GetPSP()); if (hPSP == NULL) AfxThrowMemoryException(); if (!SendMessage(PSM_INSERTPAGE, nIndex, (LPARAM)hPSP)) { AfxDestroyPropertySheetPage(hPSP); AfxThrowMemoryException(); } ++m_psh.nPages; } return nIndex;}BOOL COwnerDraw_PropertySheet::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult){ // TODO: 在此添加专用代码和/或调用基类 static NMHDR nmh; nmh = *((LPNMHDR)lParam); nmh.hwndFrom = GetSafeHwnd(); BOOL bRet = CPropertySheet::OnNotify(wParam, lParam, pResult); GetParent()->PostMessage(WM_NOTIFY, GetDlgCtrlID(), (LPARAM)&nmh); return bRet;}
- 从CPropertySheet派生一个具有自绘功能的新类
- 从CEdit派生一个新类,模拟XP下CueBannerl功能
- 从CStatic派生新类,形成具有可以改变字体、背景颜色 和字体颜色的控件类
- 黑马程序员——从一个旧类派生一个新类的机制称为继承
- vs2010 mfc中添加基类CPropertySheet的派生类
- 声明一个类,它具有一个方法,此方法被重载三次,派生一个新类, 并增加一个新的重载方法,编写测试类验证四个方法对于派生类都有效
- 冰编程对派出类的功能进行验证。。 轿车类等 派生出自行车类 停车等方法。然后从该类为基类 最大速度。重量等字段以及开车 要求具有速度 定义一个车辆类
- 并编程对派出类的功能进行验证。。 轿车类等 派生出自行车类 停车等方法。然后从该类为基类 最大速度。重量等字段以及开车 要求具有速度 定义一个车辆类
- 从CEdit派生一个只允许输入16进制数据的新类
- 从CEdit派生一个新类模拟Edit的ES_PASSWORD风格
- 从CEdit派生一个新类,只接受阿拉伯数字、小数点和退格键的 方法
- 如何删除CPropertySheet 类派生生成的标签对话框上的默认按钮 “确定”“取消”“删除”
- C++练习:一个具有深拷贝功能的字符串类
- 设计:设计一个分数类,具有一下的功能
- 一个具有缓存数据功能的HttpWebRequest工具类
- 一个具有对象计数功能的基类
- 实现一个具有GetMin功能的栈
- 设计一个具有GetMin功能的栈
- 自己做的基于三星cortex-a8芯片的嵌入式移动手持终端:亮相一下!:)
- 在win7中iis上配置.net网站时出现HTTP 错误 500.22 - Internal Server Error
- 一、AndroidSDK自带proguard混淆
- 打印螺旋矩阵
- 数组:Array
- 从CPropertySheet派生一个具有自绘功能的新类
- JSTL字符串处理函数
- Shell 再学习
- Windows7IIS安装配置完整版
- RHEL5.4安装pvfs-2.8.2(单节点)
- Redhat5.4安装pvfs-2.8.2全过程(集群)
- ARM11——点亮LED灯
- 利用字符串调用方法和属性
- ZOJ2376 POJ1852 Ants,贪心