328 lines
8.5 KiB
C++
328 lines
8.5 KiB
C++
// StandardDlg.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "ItemTips.h"
|
|
#include "StandardDlg.h"
|
|
|
|
#include "UTBStrOp.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
IMPLEMENT_DYNCREATE(CStandardDlg, CPropertyPage)
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CStandardDlg dialog
|
|
|
|
|
|
CStandardDlg::CStandardDlg():CPropertyPage(CStandardDlg::IDD)
|
|
{
|
|
//{{AFX_DATA_INIT(CStandardDlg)
|
|
m_clrBackground = 0;
|
|
m_sFontName = _T("");
|
|
m_bCustomize = FALSE;
|
|
m_bSmart = FALSE;
|
|
//}}AFX_DATA_INIT
|
|
|
|
m_pimagelist=NULL;
|
|
m_pimagelistSmall=NULL;
|
|
}
|
|
|
|
CStandardDlg::~CStandardDlg()
|
|
{
|
|
if((HFONT)m_font)
|
|
{
|
|
m_font.DeleteObject();
|
|
}
|
|
|
|
if(m_pimagelist)
|
|
delete m_pimagelist;
|
|
if(m_pimagelistSmall)
|
|
delete m_pimagelistSmall;
|
|
}
|
|
|
|
|
|
void CStandardDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CPropertyPage::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CStandardDlg)
|
|
DDX_Control(pDX, IDC_CHECK_SMART, m_btnSmart);
|
|
DDX_Control(pDX, IDC_BUTTON_TEXTFONT, m_btnTextFont);
|
|
DDX_Control(pDX, IDC_BUTTON_BKCOLOR, m_btnBkColor);
|
|
DDX_Control(pDX, IDC_LIST_STANDARD, m_listStandard);
|
|
DDX_Text(pDX, IDC_EDIT_BKCOLOR, m_clrBackground);
|
|
DDX_Text(pDX, IDC_EDIT_TEXTFONT, m_sFontName);
|
|
DDX_Check(pDX, IDC_CHECK_CUSTOMIZE, m_bCustomize);
|
|
DDX_Check(pDX, IDC_CHECK_SMART, m_bSmart);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CStandardDlg, CPropertyPage)
|
|
//{{AFX_MSG_MAP(CStandardDlg)
|
|
ON_BN_CLICKED(IDC_BUTTON_BKCOLOR, OnButtonBkcolor)
|
|
ON_BN_CLICKED(IDC_BUTTON_TEXTFONT, OnButtonTextfont)
|
|
ON_BN_CLICKED(IDC_CHECK_CUSTOMIZE, OnCheckCustomize)
|
|
ON_BN_CLICKED(IDC_CHECK_SMART, OnCheckSmart)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CStandardDlg message handlers
|
|
|
|
BOOL CStandardDlg::OnInitDialog()
|
|
{
|
|
CPropertyPage::OnInitDialog();
|
|
|
|
// TODO: Add extra initialization here
|
|
|
|
CItemTipsApp* pApp = (CItemTipsApp*)AfxGetApp();
|
|
srand((unsigned) time(NULL)); // start the random number generator
|
|
m_pimagelist = new CImageList();
|
|
m_pimagelistSmall = new CImageList();
|
|
ASSERT(m_pimagelist != NULL && m_pimagelistSmall != NULL); // no serious allocation failure checking
|
|
m_pimagelist->Create(32, 32, TRUE/*bMask*/, LISTICONCOUNT/*nInitial*/, 4/*nGrow*/);
|
|
m_pimagelistSmall->Create(16, 16, TRUE/*bMask*/, LISTICONCOUNT, 4);
|
|
m_pimagelist->Add(pApp->LoadIcon(IDI_ICONLIST1));
|
|
m_pimagelist->Add(pApp->LoadIcon(IDI_ICONLIST2));
|
|
m_pimagelist->Add(pApp->LoadIcon(IDI_ICONLIST3));
|
|
m_pimagelist->Add(pApp->LoadIcon(IDI_ICONLIST4));
|
|
m_pimagelistSmall->Add(pApp->LoadIcon(IDI_ICONLIST1));
|
|
m_pimagelistSmall->Add(pApp->LoadIcon(IDI_ICONLIST2));
|
|
m_pimagelistSmall->Add(pApp->LoadIcon(IDI_ICONLIST3));
|
|
m_pimagelistSmall->Add(pApp->LoadIcon(IDI_ICONLIST4));
|
|
|
|
FillListCtrl();
|
|
|
|
m_ItemTip.Attach(&m_listStandard);
|
|
|
|
GetVars();
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
void CStandardDlg::FillListCtrl()
|
|
{
|
|
CRect rect;
|
|
int i, iIcon, iItem, iSubItem, iActualItem;
|
|
LV_ITEM lvitem;
|
|
LV_COLUMN lvcolumn;
|
|
TCHAR rgtsz[2][10] = {_T("MAIN ITEM"), _T("SUB_ITEM")};
|
|
CItemTipsApp *pApp;
|
|
TCHAR rgtszIconDescrip[LISTICONCOUNT][50], rgtszIconShortDesc[LISTICONCOUNT][12];
|
|
|
|
ASSERT(LISTICONCOUNT == 4);
|
|
UTBStr::tcscpy(rgtszIconDescrip[0], 50, _T("Blue Ellipse, Yellow Triangle, Red Rectangle"));
|
|
UTBStr::tcscpy(rgtszIconDescrip[1], 50, _T("Yellow Ellipse, Red Triangle, Blue Rectangle"));
|
|
UTBStr::tcscpy(rgtszIconDescrip[2], 50, _T("Red Ellipse, Blue Triangle, Yellow Rectangle"));
|
|
UTBStr::tcscpy(rgtszIconDescrip[3], 50, _T("Red Ellipse, Yellow Triangle, Blue Rectangle"));
|
|
|
|
UTBStr::tcscpy(rgtszIconShortDesc[0], 12, _T("BE, YT, RR"));
|
|
UTBStr::tcscpy(rgtszIconShortDesc[1], 12, _T("YE, RT, BR"));
|
|
UTBStr::tcscpy(rgtszIconShortDesc[2], 12, _T("RE, BT, YR"));
|
|
UTBStr::tcscpy(rgtszIconShortDesc[3], 12, _T("RE, YT, BR"));
|
|
|
|
|
|
pApp = (CItemTipsApp*)AfxGetApp();
|
|
m_listStandard.SetImageList(m_pimagelist, LVSIL_NORMAL);
|
|
m_listStandard.SetImageList(m_pimagelistSmall, LVSIL_SMALL);
|
|
m_listStandard.GetWindowRect(&rect);
|
|
|
|
for (i = 0; i < 2; i++) // add the columns to the list control
|
|
{
|
|
lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
|
|
lvcolumn.fmt = LVCFMT_LEFT;
|
|
lvcolumn.pszText = rgtsz[i];
|
|
lvcolumn.iSubItem = i;
|
|
lvcolumn.cx = rect.Width() * (i + 1) / 3; // SubItem is twice as large
|
|
m_listStandard.InsertColumn(i, &lvcolumn); // assumes return value is OK.
|
|
}
|
|
|
|
for (iItem = 0; iItem < 500; iItem++) // will now insert the items and subitems into the list view.
|
|
for (iSubItem = 0; iSubItem < 2; iSubItem++)
|
|
{
|
|
if (iSubItem == 0)
|
|
iIcon = rand() % 4; // choose the icon and legend for the entry
|
|
|
|
lvitem.mask = LVIF_TEXT | (iSubItem == 0 ? LVIF_IMAGE : 0);
|
|
lvitem.iItem = (iSubItem == 0) ? iItem : iActualItem;
|
|
lvitem.iSubItem = iSubItem;
|
|
lvitem.pszText = iSubItem == 0 ? rgtszIconShortDesc[iIcon] : rgtszIconDescrip[iIcon];
|
|
|
|
lvitem.iImage = iIcon;
|
|
if (iSubItem == 0)
|
|
iActualItem = m_listStandard.InsertItem(&lvitem);
|
|
else
|
|
m_listStandard.SetItem(&lvitem);
|
|
}
|
|
}
|
|
|
|
|
|
void CStandardDlg::OnButtonBkcolor()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
|
|
// use standard CColorDialog to change item tip window's background color
|
|
CColorDialog clrDlg(m_clrBackground);
|
|
if(clrDlg.DoModal()==IDOK)
|
|
{
|
|
m_clrBackground=clrDlg.GetColor();
|
|
UpdateData(FALSE);
|
|
}
|
|
}
|
|
|
|
void CStandardDlg::OnButtonTextfont()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
|
|
UpdateData(TRUE);
|
|
|
|
// Use font common dialog to change font and text color
|
|
LOGFONT lf;
|
|
BOOL bLogFont=FALSE;
|
|
if((HFONT)m_font)
|
|
{
|
|
if(m_font.GetLogFont(&lf)!=0)
|
|
{
|
|
bLogFont=TRUE;
|
|
}
|
|
}
|
|
CFontDialog fontDlg(bLogFont ? &lf : NULL);
|
|
fontDlg.m_cf.rgbColors=m_clrText;
|
|
if(fontDlg.DoModal()==IDOK)
|
|
{
|
|
m_clrText=fontDlg.GetColor();
|
|
fontDlg.GetCurrentFont(&lf);
|
|
m_sFontName=lf.lfFaceName;
|
|
if((HFONT)m_font)
|
|
{
|
|
m_font.DeleteObject();
|
|
}
|
|
m_font.CreateFontIndirect(&lf);
|
|
UpdateData(FALSE);
|
|
}
|
|
}
|
|
|
|
void CStandardDlg::OnCheckCustomize()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
|
|
SetVars();
|
|
|
|
// detach CListCtrl
|
|
m_ItemTip.Detach();
|
|
// and then attach it again and register callback function depending
|
|
// on m_bCustomize value
|
|
m_ItemTip.Attach(&m_listStandard,m_bCustomize ? ItemTipHelper : NULL);
|
|
}
|
|
|
|
void CStandardDlg::OnCheckSmart()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
|
|
SetVars();
|
|
}
|
|
|
|
void CStandardDlg::GetVars()
|
|
{
|
|
// fill with values from CListCtrl
|
|
m_clrBackground=m_listStandard.GetBkColor();
|
|
m_clrText=m_listStandard.GetTextColor();
|
|
m_sFontName.Empty();
|
|
|
|
UpdateData(FALSE);
|
|
|
|
ShowControls();
|
|
}
|
|
|
|
void CStandardDlg::SetVars()
|
|
{
|
|
UpdateData();
|
|
ShowControls();
|
|
}
|
|
|
|
void CStandardDlg::ShowControls()
|
|
{
|
|
UpdateData(TRUE);
|
|
|
|
m_btnBkColor.EnableWindow(m_bCustomize);
|
|
m_btnTextFont.EnableWindow(m_bCustomize);
|
|
m_btnSmart.EnableWindow(m_bCustomize);
|
|
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
// callback function that is called by COXItemTip before display an item tip window
|
|
void CALLBACK ItemTipHelper(LPARAM lpSource, LPARAM lpInfo)
|
|
{
|
|
// lpSource is a pointer to COXItemTip object
|
|
CWnd* pWnd=((COXItemTip*)lpSource)->GetHookedWnd();
|
|
ASSERT(::IsWindow(pWnd->m_hWnd));
|
|
ASSERT(pWnd->IsKindOf(RUNTIME_CLASS(CListCtrl)));
|
|
|
|
CListCtrl* pListCtrl=(CListCtrl*)pWnd;
|
|
// lpInfo is pointer to NEEDITEMTIPINFO structure
|
|
LPNEEDITEMTIPINFO pnitInfo=(LPNEEDITEMTIPINFO)lpInfo;
|
|
|
|
// get CListCtrl parent window
|
|
CStandardDlg* pParentWnd=(CStandardDlg*)pListCtrl->GetParent();
|
|
|
|
if(pnitInfo->result==ID_NIT_SUCCESS)
|
|
{
|
|
if(!pParentWnd->m_bSmart)
|
|
{
|
|
// just change the text & background color and set different font
|
|
pnitInfo->clrText=pParentWnd->m_clrText;
|
|
pnitInfo->clrBackground=pParentWnd->m_clrBackground;
|
|
if((HFONT)pParentWnd->m_font)
|
|
{
|
|
pnitInfo->pFont=(LPARAM)(&pParentWnd->m_font);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// depending on image associated with the item change the
|
|
// text and background colors
|
|
LV_ITEM lvitem;
|
|
lvitem.mask=LVIF_IMAGE;
|
|
lvitem.iItem=pnitInfo->row;
|
|
lvitem.iSubItem=0;
|
|
if(pListCtrl->GetItem(&lvitem))
|
|
{
|
|
switch(lvitem.iImage)
|
|
{
|
|
case 0:
|
|
{
|
|
pnitInfo->clrText=COLOR_BLUE;
|
|
pnitInfo->clrBackground=COLOR_YELLOW;
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
pnitInfo->clrText=COLOR_YELLOW;
|
|
pnitInfo->clrBackground=COLOR_RED;
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
pnitInfo->clrText=COLOR_RED;
|
|
pnitInfo->clrBackground=COLOR_BLUE;
|
|
break;
|
|
}
|
|
case 3:
|
|
{
|
|
pnitInfo->clrText=COLOR_RED;
|
|
pnitInfo->clrBackground=COLOR_YELLOW;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|