📄 findsheet.cpp
字号:
// FindSheet.cpp : implementation file
//
#include "stdafx.h"
#include "ModalDemo.h"
#include "FindSheet.h"
#define RESULTS_TAB_INDEX 1
#define RESULTS_TAB_CAPTION "Results: %ld books found"
IMPLEMENT_DYNAMIC(CFindSheet, CPropertySheet)
CFindSheet::CFindSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{
}
CFindSheet::CFindSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
}
CFindSheet::~CFindSheet()
{
}
BEGIN_MESSAGE_MAP(CFindSheet, CPropertySheet)
END_MESSAGE_MAP()
// CFindSheet message handlers
BOOL CFindSheet::OnInitDialog()
{
BOOL bResult = CPropertySheet::OnInitDialog();
// remove apply and cancel buttons
int ids[] = {ID_APPLY_NOW, IDCANCEL};
for (int i = 0; i < sizeof ids / sizeof ids[0]; i++)
{
CWnd* pWnd = GetDlgItem(ids[i]);
ASSERT(pWnd);
// if (pWnd) pWnd->ShowWindow(FALSE);
}
// move ok button to upper right side of sheet
CWnd* pbtnOk = GetDlgItem(IDOK);
ASSERT(pbtnOk);
CRect rectSheet;
GetWindowRect(rectSheet);
// Get size of OK button.
CRect rectOkBtn;
pbtnOk->GetWindowRect(rectOkBtn);
// Get border space between btn bottom and sheet bottom.
int iBorder = rectSheet.bottom - rectOkBtn.bottom;
// Resize sheet.
rectSheet.right += rectOkBtn.Width() + iBorder;
rectSheet.bottom = rectOkBtn.top;
// MoveWindow(rectSheet);
// Find first page.
CPropertyPage* pPage = GetPage(0);
ASSERT(pPage);
CRect rectPage;
pPage->GetWindowRect(rectPage);
// Save width and height.
int cxOk = rectOkBtn.Width();
int cyOk = rectOkBtn.Height();
// Move OK button.
rectOkBtn.top = rectPage.top;
rectOkBtn.bottom = rectOkBtn.top + cyOk;
rectOkBtn.left = rectSheet.right - (cxOk + iBorder);
rectOkBtn.right = rectOkBtn.left + cxOk;
ScreenToClient(rectOkBtn);
// pbtnOk->MoveWindow(rectOkBtn);
// Recaption the OK button
// pbtnOk->SetWindowText("Cl&ose");
// This will also diable the second tab
// SetResults(0);
// Set the tab fonts
m_fontTab.CreateFont(-8, 0, 0, 0, FW_BOLD, 0, 0,
0, 1, 0, 0, 0, 0, _T("MS Sans Serif"));
CTabCtrl* pTab = GetTabControl();
ASSERT(pTab);
if (pTab)
{
// pTab->SetFont(&m_fontTab);
}
return bResult;
}
void CFindSheet::DisablePage(int iFirstPage, ...)
{
int iPage = iFirstPage;
va_list marker;
va_start (marker, iFirstPage);
int nArgs = 0;
while (iPage != -1)
{
// Add page to disabled page index array.
m_arrDisabledPages.Add(iPage);
SetDisabledText(iPage);
// Get next page index.
iPage = va_arg(marker, UINT);
// The list MUST end with a -1!!!
ASSERT(nArgs++ < 100);
}
}
void CFindSheet::SetDisabledText(int iPage)
{
CTabCtrl* pTab = GetTabControl();
ASSERT(pTab);
TC_ITEM ti;
char szText[100];
ti.mask = TCIF_TEXT;
ti.pszText = szText;
ti.cchTextMax = 100;
VERIFY(pTab->GetItem(iPage, &ti));
strcat(szText, DISABLED_TEXT);
VERIFY(pTab->SetItem(iPage, &ti));
}
BOOL CFindSheet::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
NMHDR* pnmh = (NMHDR*)lParam;
ASSERT(pnmh);
if (TCN_SELCHANGING == pnmh->code)
{
m_iLastActivePage = GetActiveIndex();
}
else if (TCN_SELCHANGE == pnmh->code)
{
int iCurrPage = GetActiveIndex();
if (IsPageDisabled(iCurrPage))
{
PostMessage(PSM_SETCURSEL, m_iLastActivePage);
}
}
return CPropertySheet::OnNotify(wParam,
lParam, pResult);
}
BOOL CFindSheet::IsPageDisabled(int iPage)
{
BOOL bFoundEntry = FALSE;
int iSize = m_arrDisabledPages.GetSize();
int i = 0;
while (i < iSize && !bFoundEntry)
{
if (m_arrDisabledPages.GetAt(i) == (UINT)iPage)
{
bFoundEntry = TRUE;
}
else
{
i++;
}
}
return bFoundEntry;
}
void CFindSheet::EnablePage(int iPage)
{
BOOL bFoundEntry = FALSE;
int iSize = m_arrDisabledPages.GetSize();
int i = 0;
while (i < iSize && !bFoundEntry)
{
if (m_arrDisabledPages.GetAt(i) == (UINT)iPage)
{
bFoundEntry = TRUE;
}
else
{
i++;
}
}
if (bFoundEntry)
{
m_arrDisabledPages.RemoveAt(i);
SetEnabledText(iPage);
}
}
void CFindSheet::SetEnabledText(int iPage)
{
CTabCtrl* pTab = GetTabControl();
ASSERT(pTab);
TC_ITEM ti;
char szText[100];
ti.mask = TCIF_TEXT;
ti.pszText = szText;
ti.cchTextMax = 100;
VERIFY(pTab->GetItem(iPage, &ti));
char* pFound = strstr(szText, DISABLED_TEXT);
if (pFound)
{
*pFound = '\0';
VERIFY(pTab->SetItem(iPage, &ti));
}
}
void CFindSheet::SetResults(int nHits)
{
SetResultsTabCaption(nHits);
if (0 == nHits)
{
DisablePage(1, -1);
}
else
{
EnablePage(1);
}
}
void CFindSheet::SetResultsTabCaption(int nHits)
{
CTabCtrl* pTab = GetTabControl();
ASSERT(pTab);
TC_ITEM ti;
char szText[100];
ti.mask = TCIF_TEXT;
ti.pszText = szText;
ti.cchTextMax = 100;
VERIFY(pTab->GetItem(RESULTS_TAB_INDEX, &ti));
sprintf(szText, RESULTS_TAB_CAPTION, nHits);
VERIFY(pTab->SetItem(RESULTS_TAB_INDEX, &ti));
}
BOOL CFindSheet::PreTranslateMessage(MSG* pMsg)
{
BOOL bHandledMsg = FALSE;
switch(pMsg->message)
{
case WM_SYSKEYDOWN:
{
// You only want 0-9 and letters.
if ((0x2f < pMsg->wParam)
&& (0x5b > pMsg->wParam))
{
CTabCtrl *pTab = GetTabControl();
ASSERT(pTab);
TC_ITEM ti;
char szText[100];
ti.mask = TCIF_TEXT;
ti.pszText = szText;
char szMnemonic[3];
sprintf(szMnemonic, "&%c", pMsg->wParam);
BOOL bFoundMatchingPage = FALSE;
int iCurrPage = 0;
while ((iCurrPage < pTab->GetItemCount())
&& (!bFoundMatchingPage))
{
ti.cchTextMax = 99;
pTab->GetItem(iCurrPage, &ti);
CString strText = szText;
strText.MakeUpper();
if (-1 != strText.Find(szMnemonic))
{
bFoundMatchingPage = TRUE;
if (!IsPageDisabled(iCurrPage))
{
SetActivePage(iCurrPage);
bHandledMsg = TRUE;
}
}
else
{
iCurrPage++;
}
}
}
}
break;
default: break;
}
return (TRUE == bHandledMsg ?
TRUE : CPropertySheet::PreTranslateMessage(pMsg));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -