2025-11-27 16:46:48 +09:00

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;
}
}
}
}
}
}