585 lines
15 KiB
C++
585 lines
15 KiB
C++
|
//***********************************************************************
|
||
|
// evntprop.cpp
|
||
|
//
|
||
|
// This file contains the implementation of the event properties dialog.
|
||
|
//
|
||
|
// Author: SEA
|
||
|
//
|
||
|
// History:
|
||
|
// 20-Febuary-1996 Larry A. French
|
||
|
// Made various changes to this code. However, much of it is
|
||
|
// legacy code and in dire need of being rewritten.
|
||
|
//
|
||
|
//
|
||
|
// Copyright (C) 1995, 1996 Microsoft Corporation. All rights reserved.
|
||
|
//
|
||
|
//************************************************************************
|
||
|
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "resource.h"
|
||
|
#include "eventrap.h"
|
||
|
#include "evntprop.h"
|
||
|
#include "trapreg.h"
|
||
|
#include "globals.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#undef THIS_FILE
|
||
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
#define MAX_EVENT_COUNT 32767
|
||
|
#define MAX_TIME_INTERVAL 32767
|
||
|
|
||
|
|
||
|
|
||
|
#define IsWithinRange(value, lower, upper) (((value) >= (lower)) && ((value) <= (upper)))
|
||
|
|
||
|
void RangeError(int iLower, int iUpper)
|
||
|
{
|
||
|
|
||
|
TCHAR szBuffer[1024];
|
||
|
CString sFormat;
|
||
|
sFormat.LoadString(IDS_ERR_RANGE);
|
||
|
_stprintf(szBuffer, (LPCTSTR) sFormat, iLower, iUpper);
|
||
|
AfxMessageBox(szBuffer);
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CEventPropertiesDlg dialog
|
||
|
|
||
|
|
||
|
CEventPropertiesDlg::CEventPropertiesDlg(CWnd* pParent /*=NULL*/)
|
||
|
: CDialog(CEventPropertiesDlg::IDD, pParent)
|
||
|
{
|
||
|
//{{AFX_DATA_INIT(CEventPropertiesDlg)
|
||
|
m_sDescription = _T("");
|
||
|
m_sSource = _T("");
|
||
|
m_sEventId = _T("");
|
||
|
m_sLog = _T("");
|
||
|
m_sSourceOID = _T("");
|
||
|
m_sFullEventID = _T("");
|
||
|
//}}AFX_DATA_INIT
|
||
|
}
|
||
|
|
||
|
BOOL CEventPropertiesDlg::OnInitDialog()
|
||
|
{
|
||
|
CDialog::OnInitDialog();
|
||
|
|
||
|
m_spinEventCount.SetRange(1, MAX_EVENT_COUNT);
|
||
|
if (m_iEventCount==0) {
|
||
|
m_spinEventCount.SetPos(1);
|
||
|
} else {
|
||
|
m_spinEventCount.SetPos(m_iEventCount);
|
||
|
}
|
||
|
|
||
|
|
||
|
if (m_iTimeInterval == 0) {
|
||
|
m_btnWithinTime.SetCheck(0);
|
||
|
m_spinTimeInterval.SetRange(0, MAX_TIME_INTERVAL);
|
||
|
}
|
||
|
else {
|
||
|
m_btnWithinTime.SetCheck(1);
|
||
|
m_spinTimeInterval.SetRange(1, MAX_TIME_INTERVAL);
|
||
|
}
|
||
|
m_spinTimeInterval.SetPos(m_iTimeInterval);
|
||
|
|
||
|
m_edtTimeInterval.EnableWindow(m_btnWithinTime.GetCheck() == 1);
|
||
|
m_spinTimeInterval.EnableWindow(m_btnWithinTime.GetCheck() == 1);
|
||
|
|
||
|
// If this is not a custom configuration, do not let the user
|
||
|
// modify the configuration.
|
||
|
if ((g_reg.GetConfigType() != CONFIG_TYPE_CUSTOM) || (g_reg.m_bRegIsReadOnly)) {
|
||
|
m_btnOK.EnableWindow(FALSE);
|
||
|
}
|
||
|
m_bDidEditEventCount = FALSE;
|
||
|
|
||
|
OnWithintime();
|
||
|
|
||
|
return TRUE; // return TRUE unless you set the focus to a control
|
||
|
// EXCEPTION: OCX Property Pages should return FALSE
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
void CEventPropertiesDlg::DoDataExchange(CDataExchange* pDX)
|
||
|
{
|
||
|
CDialog::DoDataExchange(pDX);
|
||
|
|
||
|
//{{AFX_DATA_MAP(CEventPropertiesDlg)
|
||
|
DDX_Control(pDX, IDC_WITHINTIME, m_btnWithinTime);
|
||
|
DDX_Control(pDX, IDC_EVENTCOUNTSPN, m_spinEventCount);
|
||
|
DDX_Control(pDX, IDC_TIMEINTRVLSPN, m_spinTimeInterval);
|
||
|
DDX_Control(pDX, IDC_TIMEINTERVAL, m_edtTimeInterval);
|
||
|
DDX_Control(pDX, IDC_EVENTCOUNT, m_edtEventCount);
|
||
|
DDX_Control(pDX, IDOK, m_btnOK);
|
||
|
DDX_Text(pDX, IDC_DESCRIPTION, m_sDescription);
|
||
|
DDV_MaxChars(pDX, m_sDescription, 2048);
|
||
|
DDX_Text(pDX, ID_STAT_SOURCE, m_sSource);
|
||
|
DDV_MaxChars(pDX, m_sSource, 256);
|
||
|
DDX_Text(pDX, ID_STAT_EVENTID, m_sEventId);
|
||
|
DDX_Text(pDX, ID_STAT_LOG, m_sLog);
|
||
|
DDX_Text(pDX, IDC_EDIT_ENTERPRISEOID, m_sSourceOID);
|
||
|
DDX_Text(pDX, IDC_EDIT_FULL_EVENT_ID, m_sFullEventID);
|
||
|
//}}AFX_DATA_MAP
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CEventPropertiesDlg, CDialog)
|
||
|
//{{AFX_MSG_MAP(CEventPropertiesDlg)
|
||
|
ON_BN_CLICKED(IDC_WITHINTIME, OnWithintime)
|
||
|
ON_COMMAND(ID_HELP, OnHelp)
|
||
|
ON_WM_HELPINFO()
|
||
|
ON_WM_CONTEXTMENU()
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CEventPropertiesDlg message handlers
|
||
|
|
||
|
void CEventPropertiesDlg::OnOK()
|
||
|
{
|
||
|
// TODO: Add extra validation here
|
||
|
int iLower, iUpper;
|
||
|
CString sText;
|
||
|
|
||
|
m_spinEventCount.GetRange(iLower, iUpper);
|
||
|
|
||
|
// Validate the event count edit item and set m_iEventCount
|
||
|
m_edtEventCount.GetWindowText(sText);
|
||
|
if (!IsDecimalInteger(sText)) {
|
||
|
RangeError(iLower, iUpper);
|
||
|
m_edtEventCount.SetSel(0, -1);
|
||
|
m_edtEventCount.SetFocus();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
m_iEventCount = _ttoi(sText);
|
||
|
|
||
|
if (!IsWithinRange(m_iEventCount, iLower, iUpper)) {
|
||
|
RangeError(iLower, iUpper);
|
||
|
sText.Format(_T("%u"), m_iEventCount);
|
||
|
m_edtEventCount.SetWindowText(sText);
|
||
|
m_edtEventCount.SetSel(0, -1);
|
||
|
m_edtEventCount.SetFocus();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Validate the time interval and set m_iTimeInterval
|
||
|
m_spinTimeInterval.GetRange(iLower, iUpper);
|
||
|
m_edtTimeInterval.GetWindowText(sText);
|
||
|
if (!IsDecimalInteger(sText)) {
|
||
|
RangeError(iLower, iUpper);
|
||
|
m_edtTimeInterval.SetSel(0, -1);
|
||
|
m_edtTimeInterval.SetFocus();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
m_iTimeInterval = _ttoi(sText);
|
||
|
if (m_btnWithinTime.GetCheck() == 1) {
|
||
|
if (m_iEventCount < 2) {
|
||
|
AfxMessageBox(IDS_ERR_PROP_TIME1);
|
||
|
m_edtEventCount.SetSel(0, -1);
|
||
|
m_edtEventCount.SetFocus();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (m_iTimeInterval < 1) {
|
||
|
AfxMessageBox(IDS_ERR_PROP_TIME2);
|
||
|
sText.Format(_T("%u"), m_iTimeInterval);
|
||
|
m_edtTimeInterval.SetWindowText(sText);
|
||
|
m_edtTimeInterval.SetSel(0, -1);
|
||
|
m_edtTimeInterval.SetFocus();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (!IsWithinRange(m_iTimeInterval, iLower, iUpper)) {
|
||
|
RangeError(iLower, iUpper);
|
||
|
sText.Format(_T("%u"), m_iTimeInterval);
|
||
|
m_edtTimeInterval.SetWindowText(sText);
|
||
|
m_edtTimeInterval.SetSel(0, -1);
|
||
|
m_edtTimeInterval.SetFocus();
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
else if (m_iEventCount < 1) {
|
||
|
AfxMessageBox(IDS_ERR_PROP_TIME_LESS_THAN_TWO);
|
||
|
m_edtEventCount.SetSel(0, -1);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
CDialog::OnOK();
|
||
|
|
||
|
// We don't set the g_reg.m_bIsDirty flag here because we want to see if the
|
||
|
// user actually changed the current settings. This check is made in
|
||
|
// CEventPropertiesDlg::EditEventProperties on a per-event basis.
|
||
|
}
|
||
|
|
||
|
|
||
|
void CEventPropertiesDlg::OnWithintime()
|
||
|
{
|
||
|
// The WithinTime checkbox was clicked.
|
||
|
// Enable/disable the TimeInterval control.
|
||
|
|
||
|
|
||
|
// Check to see if the count field has been edited. If it has been edited,
|
||
|
// mark the field as being dirty.
|
||
|
|
||
|
if (m_edtEventCount.IsDirty() || m_spinEventCount.IsDirty()) {
|
||
|
m_bDidEditEventCount = TRUE;
|
||
|
}
|
||
|
|
||
|
int iEventCount;
|
||
|
int iTemp;
|
||
|
SCODE sc = m_edtEventCount.GetValue(iEventCount);
|
||
|
if (FAILED(sc)) {
|
||
|
m_spinEventCount.GetRange(iEventCount, iTemp);
|
||
|
m_spinEventCount.SetPos(iEventCount);
|
||
|
m_bDidEditEventCount = FALSE;
|
||
|
}
|
||
|
|
||
|
if (m_btnWithinTime.GetCheck() == 1) {
|
||
|
m_edtTimeInterval.EnableWindow(TRUE);
|
||
|
m_spinTimeInterval.EnableWindow(TRUE);
|
||
|
|
||
|
if (iEventCount < 2) {
|
||
|
// If the event count is less than two, it will flip to two when the spin button's
|
||
|
// range is set. In this event, we make it appear as if the user never edited the
|
||
|
// value so that it will flip back when the check box is unchecked.
|
||
|
m_bDidEditEventCount = FALSE;
|
||
|
m_bDidFlipEventCount = TRUE;
|
||
|
m_edtEventCount.ClearDirty();
|
||
|
m_spinEventCount.ClearDirty();
|
||
|
m_spinEventCount.SetPos(2);
|
||
|
}
|
||
|
|
||
|
|
||
|
m_spinEventCount.SetRange(2, MAX_EVENT_COUNT);
|
||
|
m_spinTimeInterval.SetRange(1, MAX_TIME_INTERVAL);
|
||
|
}
|
||
|
else {
|
||
|
m_edtTimeInterval.EnableWindow(FALSE);
|
||
|
m_spinTimeInterval.EnableWindow(FALSE);
|
||
|
|
||
|
m_spinEventCount.SetRange(1, MAX_EVENT_COUNT);
|
||
|
m_spinEventCount.SetPos(iEventCount);
|
||
|
m_spinTimeInterval.SetRange(0, MAX_TIME_INTERVAL);
|
||
|
m_spinTimeInterval.SetPos(0);
|
||
|
|
||
|
|
||
|
// If the initial event count was one and we flipped it to two when the "within time"
|
||
|
// button was clicked, then flip it back to one now if it was not edited.
|
||
|
if (m_bDidFlipEventCount) {
|
||
|
if (!m_bDidEditEventCount) {
|
||
|
m_spinEventCount.SetPos(1);
|
||
|
}
|
||
|
m_bDidFlipEventCount = FALSE;
|
||
|
}
|
||
|
}
|
||
|
m_spinTimeInterval.SetRedraw();
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//***************************************************************************
|
||
|
//
|
||
|
// CEventPropertiesDlg::MakeLabelsBold
|
||
|
//
|
||
|
// This method makes the static labels bold to enhance the appearance of
|
||
|
// the dialog.
|
||
|
//
|
||
|
// This method should be called after CDIalog::InitDialog.
|
||
|
//
|
||
|
// Parameters:
|
||
|
// None.
|
||
|
//
|
||
|
// Returns:
|
||
|
// Nothing.
|
||
|
//
|
||
|
// Status:
|
||
|
// The MFC2.0 library makes the labels invisible when an attempt
|
||
|
// is made to change the font of a static item. I've tried this with
|
||
|
// MFC4.0 and it works.
|
||
|
//
|
||
|
//***************************************************************************
|
||
|
void CEventPropertiesDlg::MakeLabelsBold()
|
||
|
{
|
||
|
#if 0
|
||
|
CFont* pfontDefault;
|
||
|
LOGFONT lf;
|
||
|
|
||
|
// Get the LOGFONT for the default static item font and then
|
||
|
// switch the logfont weight to bold.
|
||
|
pfontDefault = m_statSource.GetFont();
|
||
|
pfontDefault->GetObject(sizeof(lf), &lf);
|
||
|
lf.lfWeight = FW_BOLD;
|
||
|
|
||
|
// Create a bold font with all other characteristics the same as the
|
||
|
// default font. Then switch all labels to a bold font.
|
||
|
CFont fontNew;
|
||
|
if (fontNew.CreateFontIndirect(&lf)) {
|
||
|
m_statSource.SetFont(&fontNew, TRUE);
|
||
|
m_statLog.SetFont(&fontNew, TRUE);
|
||
|
m_statEventID.SetFont(&fontNew, TRUE);
|
||
|
m_statEnterpriseOID.SetFont(&fontNew, TRUE);
|
||
|
}
|
||
|
|
||
|
#endif //0
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//********************************************************************
|
||
|
// CEventPropertiesDlg::EditEventProperties
|
||
|
//
|
||
|
// Edit the properties of a number of events.
|
||
|
//
|
||
|
// Parameters:
|
||
|
// CEventArray& aEvents
|
||
|
// An array of CEvent pointers. These are the events that
|
||
|
// are to be edited.
|
||
|
//
|
||
|
// Returns:
|
||
|
// BOOL
|
||
|
// TRUE if the user clicked OK and the events were edited.
|
||
|
// FALSE if the user clicked Cancel and the events were not
|
||
|
// edited.
|
||
|
//
|
||
|
//******************************************************************
|
||
|
BOOL CEventPropertiesDlg::EditEventProperties(CXEventArray& aEvents)
|
||
|
{
|
||
|
LONG nEvents = aEvents.GetSize();
|
||
|
if (nEvents == 0) {
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
// The first event is taken as a representative of the other
|
||
|
// events. Copy the appropriate data from this event to the
|
||
|
// dialog.
|
||
|
CString sText;
|
||
|
|
||
|
CXEvent* pEvent = aEvents[0];
|
||
|
CXEventSource* pEventSource = pEvent->m_pEventSource;
|
||
|
CXEventLog* pEventLog = pEventSource->m_pEventLog;
|
||
|
|
||
|
LONG iEvent;
|
||
|
BOOL bMultipleSources = FALSE;
|
||
|
BOOL bMultipleLogs = FALSE;
|
||
|
for (iEvent=0; iEvent < nEvents; ++iEvent) {
|
||
|
pEvent = aEvents[iEvent];
|
||
|
if (pEvent->m_pEventSource != pEventSource) {
|
||
|
bMultipleSources = TRUE;
|
||
|
}
|
||
|
if (pEvent->m_pEventSource->m_pEventLog != pEventLog) {
|
||
|
bMultipleLogs = TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (bMultipleSources) {
|
||
|
m_sSource.LoadString(IDS_MULTIPLE_SEL);
|
||
|
m_sSourceOID.LoadString(IDS_MULTIPLE_SEL);
|
||
|
}
|
||
|
else {
|
||
|
m_sSource = pEventSource->m_sName;
|
||
|
pEventSource->GetEnterpriseOID(m_sSourceOID, TRUE);
|
||
|
}
|
||
|
|
||
|
if (bMultipleLogs) {
|
||
|
m_sLog.LoadString(IDS_MULTIPLE_SEL);
|
||
|
}
|
||
|
else {
|
||
|
m_sLog = pEventSource->m_pEventLog->m_sName;
|
||
|
}
|
||
|
|
||
|
// Copy the initial values.
|
||
|
m_iTimeInterval = (int) pEvent->m_dwTimeInterval;
|
||
|
m_iEventCount = pEvent->m_dwCount;
|
||
|
m_bDidFlipEventCount = FALSE;
|
||
|
// m_bWithinTime = (m_iTimeInterval != 0);
|
||
|
|
||
|
|
||
|
if (nEvents > 1) {
|
||
|
m_sEventId.LoadString(IDS_MULTIPLE_SEL);
|
||
|
m_sDescription.LoadString(IDS_MULTIPLE_SEL);
|
||
|
m_sFullEventID.LoadString(IDS_MULTIPLE_SEL);
|
||
|
}
|
||
|
else {
|
||
|
pEvent->m_message.GetShortId(m_sEventId);
|
||
|
m_sDescription = pEvent->m_message.m_sText;
|
||
|
DecString(m_sFullEventID, pEvent->m_message.m_dwId);
|
||
|
}
|
||
|
|
||
|
|
||
|
// Put up the dialog and let the user edit the data.
|
||
|
BOOL bDidCancel = (DoModal() == IDCANCEL);
|
||
|
if (bDidCancel) {
|
||
|
// The user canceled the dialog, so do nothing.
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
// Control comes here if the user clicked OK. Now we need to copy the
|
||
|
// user's settings to each event that we are editing and mark the registry
|
||
|
// as dirty if any of the settings changed.
|
||
|
for (iEvent=0; iEvent < nEvents; ++iEvent) {
|
||
|
pEvent = aEvents[iEvent];
|
||
|
if (pEvent->m_dwTimeInterval != (DWORD) m_iTimeInterval) {
|
||
|
g_reg.SetDirty(TRUE);
|
||
|
pEvent->m_dwTimeInterval = (DWORD) m_iTimeInterval;
|
||
|
}
|
||
|
|
||
|
if (pEvent->m_dwCount != (DWORD) m_iEventCount) {
|
||
|
g_reg.SetDirty(TRUE);
|
||
|
pEvent->m_dwCount = m_iEventCount;
|
||
|
}
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CEditField
|
||
|
|
||
|
CEditField::CEditField()
|
||
|
{
|
||
|
m_bIsDirty = FALSE;
|
||
|
}
|
||
|
|
||
|
CEditField::~CEditField()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CEditField, CEdit)
|
||
|
//{{AFX_MSG_MAP(CEditField)
|
||
|
ON_WM_CHAR()
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CEditField message handlers
|
||
|
|
||
|
void CEditField::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
|
||
|
{
|
||
|
// TODO: Add your message handler code here and/or call default
|
||
|
CEdit::OnChar(nChar, nRepCnt, nFlags);
|
||
|
m_bIsDirty = TRUE;
|
||
|
}
|
||
|
|
||
|
SCODE CEditField::GetValue(int& iValue)
|
||
|
{
|
||
|
CString sValue;
|
||
|
GetWindowText(sValue);
|
||
|
if (!IsDecimalInteger(sValue)) {
|
||
|
return E_FAIL;
|
||
|
}
|
||
|
|
||
|
iValue = _ttoi(sValue);
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CEditSpin
|
||
|
|
||
|
CEditSpin::CEditSpin()
|
||
|
{
|
||
|
m_bIsDirty = FALSE;
|
||
|
m_iSetPos = 0;
|
||
|
}
|
||
|
|
||
|
CEditSpin::~CEditSpin()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CEditSpin, CSpinButtonCtrl)
|
||
|
//{{AFX_MSG_MAP(CEditSpin)
|
||
|
ON_WM_LBUTTONUP()
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CEditSpin message handlers
|
||
|
|
||
|
void CEditSpin::OnLButtonUp(UINT nFlags, CPoint point)
|
||
|
{
|
||
|
// TODO: Add your message handler code here and/or call default
|
||
|
|
||
|
CSpinButtonCtrl::OnLButtonUp(nFlags, point);
|
||
|
if (GetPos() != m_iSetPos) {
|
||
|
m_bIsDirty = TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
int CEditSpin::SetPos(int iPos)
|
||
|
{
|
||
|
int iResult = CSpinButtonCtrl::SetPos(iPos);
|
||
|
m_iSetPos = GetPos();
|
||
|
m_bIsDirty = FALSE;
|
||
|
return iResult;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CEditSpin::SetRange(int iLower, int iUpper)
|
||
|
{
|
||
|
int iPos = GetPos();
|
||
|
CSpinButtonCtrl::SetRange(iLower, iUpper);
|
||
|
|
||
|
if (iPos < iLower) {
|
||
|
iPos = iLower;
|
||
|
}
|
||
|
|
||
|
if (iPos > iUpper) {
|
||
|
iPos = iUpper;
|
||
|
}
|
||
|
|
||
|
SetPos(iPos);
|
||
|
SetRedraw();
|
||
|
|
||
|
m_iSetPos = iLower;
|
||
|
m_bIsDirty = FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL CEditSpin::IsDirty()
|
||
|
{
|
||
|
int iCurPos = GetPos();
|
||
|
|
||
|
return (m_bIsDirty || (m_iSetPos != iCurPos));
|
||
|
}
|
||
|
|
||
|
BOOL CEventPropertiesDlg::OnHelpInfo(HELPINFO *pHelpInfo)
|
||
|
{
|
||
|
if (pHelpInfo->iContextType == HELPINFO_WINDOW &&
|
||
|
pHelpInfo->iCtrlId != IDD_NULL)
|
||
|
{
|
||
|
::WinHelp ((HWND)pHelpInfo->hItemHandle,
|
||
|
AfxGetApp()->m_pszHelpFilePath,
|
||
|
HELP_WM_HELP,
|
||
|
(ULONG_PTR)g_aHelpIDs_IDD_PROPERTIESDLG);
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
void CEventPropertiesDlg::OnContextMenu(CWnd* pWnd, CPoint point)
|
||
|
{
|
||
|
if (pWnd == this)
|
||
|
return;
|
||
|
|
||
|
::WinHelp (pWnd->m_hWnd,
|
||
|
AfxGetApp()->m_pszHelpFilePath,
|
||
|
HELP_CONTEXTMENU,
|
||
|
(ULONG_PTR)g_aHelpIDs_IDD_PROPERTIESDLG);
|
||
|
}
|