// MySheet.cpp : implementation file // // This is a part of the Microsoft Foundation Classes C++ library. // Copyright (C) 1992-1998 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Microsoft Foundation Classes Reference and related // electronic documentation provided with the library. // See these sources for detailed information regarding the // Microsoft Foundation Classes product. #include "stdafx.h" #include "OdbcInfo.h" #include "MySheet.h" #include "catsets.h" #include "DrvInfo.h" #include "aboutdlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // stolen from afximpl.h... #define _countof(array) (sizeof(array)/sizeof(array[0])) #define WM_NEW_DSN (WM_USER + 100) #define USC_DUMPTOFILE 0xEFFF // user defined sys commands must be < 0xF000 ///////////////////////////////////////////////////////////////////////////// // CMyPropertySheet IMPLEMENT_DYNAMIC(CMyPropertySheet, CPropertySheet) CMyPropertySheet::CMyPropertySheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage) :CPropertySheet(nIDCaption, pParentWnd, iSelectPage) { } CMyPropertySheet::CMyPropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage) :CPropertySheet(pszCaption, pParentWnd, iSelectPage) { } CMyPropertySheet::~CMyPropertySheet() { delete m_pbtnDatabase; delete m_pchkCursorLib; delete m_pbtnAbout; } BEGIN_MESSAGE_MAP(CMyPropertySheet, CPropertySheet) //{{AFX_MSG_MAP(CMyPropertySheet) ON_WM_PAINT() ON_WM_ERASEBKGND() ON_WM_QUERYDRAGICON() ON_WM_SYSCOMMAND() ON_WM_INITMENUPOPUP() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMyPropertySheet message handlers BOOL CMyPropertySheet::OnInitDialog() { // let MFC do it's thing... BOOL bRet = CPropertySheet::OnInitDialog(); // ...now we do ours. int rgiButtons[] = { IDOK, IDCANCEL, ID_APPLY_NOW, IDHELP }; // get the size of one button CRect rect; GetDlgItem(rgiButtons[0])->GetWindowRect(&rect); CFont* pFont = GetDlgItem(rgiButtons[0])->GetFont(); // remove existing buttons for (int i = 0; i < _countof(rgiButtons); i++) { HWND hWnd = ::GetDlgItem(m_hWnd, rgiButtons[i]); if (hWnd != NULL) { ::ShowWindow(hWnd, SW_HIDE); ::EnableWindow(hWnd, FALSE); } } // now make our own... // data source button m_pbtnDatabase = new CButton; ScreenToClient(&rect); int nDiff = rect.right - rect.left; rect.right = nDiff + 6; rect.left = 6; m_pbtnDatabase->Create(_T("&Data Source"),WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP,rect,this,1001); m_pbtnDatabase->SetFont(pFont); // cursor library check box rect.right += nDiff + 106; rect.left += nDiff + 6; m_pchkCursorLib = new CButton; m_pchkCursorLib->Create(_T("&Use Cursor Library"),WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX | WS_TABSTOP,rect,this,1002); m_pchkCursorLib->SetFont(pFont); m_pchkCursorLib->SetCheck(1); // about button m_pbtnAbout = new CButton; CRect clientRect; GetClientRect(&clientRect); rect.right = clientRect.right - 6; rect.left = clientRect.right - 6 - nDiff; m_pbtnAbout->Create(_T("&About"),WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP,rect,this,1003); m_pbtnAbout->SetFont(pFont); // modify system menu & window styles so we can be // minimized and restored // ModifyStyle(0,WS_MINIMIZEBOX | WS_SYSMENU); GetSystemMenu(FALSE)->InsertMenu(1,MF_BYPOSITION,SC_MINIMIZE, _T("Mi&nimize")); GetSystemMenu(FALSE)->InsertMenu(0,MF_BYPOSITION,SC_RESTORE, _T("&Restore")); GetSystemMenu(FALSE)->InsertMenu(3,MF_BYPOSITION | MF_SEPARATOR); GetSystemMenu(FALSE)->InsertMenu(3,MF_BYPOSITION,USC_DUMPTOFILE, _T("&Dump to File")); GetSystemMenu(FALSE)->InsertMenu(3,MF_BYPOSITION | MF_SEPARATOR); return bRet; } BOOL CMyPropertySheet::OnCommand(WPARAM wParam, LPARAM lParam) { if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == 1001) { if (((COdbcInfoApp*)AfxGetApp())->m_Database.IsOpen()) ((COdbcInfoApp*)AfxGetApp())->m_Database.Close(); if (m_bCursorLib = m_pchkCursorLib->GetCheck()) ((COdbcInfoApp*)AfxGetApp())->m_Database.Open(NULL); else ((COdbcInfoApp*)AfxGetApp())->m_Database.Open( NULL,FALSE,FALSE,"ODBC;",FALSE); if (((COdbcInfoApp*)AfxGetApp())->m_Database.IsOpen()) { int nPages = GetPageCount(); for (int i = 0; i < nPages; i++) ((CMyPage*)GetPage(i))->OnNewDSN(); } return 0; } else if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == 1003) { CAboutDlg dlg; dlg.DoModal(); return 0; } return CPropertySheet::OnCommand(wParam, lParam); } // OnPaint, OnEraseBkgnd, and OnQueryDragIcon supplied so that we // appear properly when minimized on Windows NT (Not needed for Win95). void CMyPropertySheet::OnPaint() { CPaintDC dc(this); // device context for painting if (IsIconic()) { DefWindowProc(WM_ICONERASEBKGND,(WORD)dc.m_hDC,0L); CRect rc; GetClientRect(&rc); rc.left = (rc.right - ::GetSystemMetrics(SM_CXICON)) >> 1; rc.top = (rc.bottom - ::GetSystemMetrics(SM_CYICON)) >> 1; HICON hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); dc.DrawIcon(rc.left,rc.top,hIcon); } // Do not call CPropertySheet::OnPaint() for painting messages } BOOL CMyPropertySheet::OnEraseBkgnd(CDC* pDC) { if (IsIconic()) return TRUE; return CPropertySheet::OnEraseBkgnd(pDC); } HCURSOR CMyPropertySheet::OnQueryDragIcon() { return AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMyPropertySheet::OnSysCommand(UINT nID, LPARAM lParam) { // menu item will not be enabled if database is not opened // if (nID == USC_DUMPTOFILE) { // note: no fancy error handling here // CFileDialog dlg(TRUE); if (dlg.DoModal() == IDOK) { CStdioFile file; if (file.Open(dlg.GetPathName(), CFile::typeText | CFile::modeCreate | CFile::modeWrite)) { if (m_bCursorLib) file.WriteString(_T("Cursor Library is Loaded\n\n")); else file.WriteString(_T("Cursor Library is Not Loaded\n\n")); int nPages = GetPageCount(); for (int i = 0; i < nPages; i++) ((CMyPage*)GetPage(i))->DumpToFile(file); file.Close(); } else AfxMessageBox(_T("Could not open output file")); } return; } CPropertySheet::OnSysCommand(nID, lParam); } void CMyPropertySheet::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) { CPropertySheet::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); if (((COdbcInfoApp*)AfxGetApp())->m_Database.IsOpen()) GetSystemMenu(FALSE)->EnableMenuItem(4,MF_BYPOSITION | MF_ENABLED); else GetSystemMenu(FALSE)->EnableMenuItem(4,MF_BYPOSITION | MF_GRAYED); }