Input Tips Every Day 源程序新近把Input Tips改动了一下,使用ACCESS的文件来存取每天输入的Tip, 所以就把原来的2.0的源程序放上来,请您多指点,以改进,学习。 第一件事当然是利用VC的MFC AppWizar成立一个DIALOG based 的应用程序了, 会自动生成一个CAboutDlg, 一个App, 一个Dlg.我在第一个类里加了一个OnHelp(), 这样你在AboutDlg里点一下那个图标就能打开HELP.HTM,参见程序. 在CTipApp::InitInstance()里加了一句话, CTipDlg dlg; m_pMainWnd = &dlg; if (m_lpCmdLine[0] == _T('\0')) dlg.pFileName = "Tips.TXT"; else dlg.pFileName = m_lpCmdLine; int nResponse = dlg.DoModal();把输入参数转化成pFileName,实现多用户使用不同的存储文件的功能。 以下的事情都是在CTipDlg中进行了. 在资源编辑器里把那个缺省的DIALOG改成 上面的按纽我分别起ID为:ID_PREVIOUS, ID_NEXT, ID_DELETE, ID_RECORD, IDC_Tips(那个大的编辑框), IDC_TIME, IDC_INDEX. 然后对应每个按纽 在CLASSWIZARD加上CLICK的函数. 下面是TipDlg.h,定义了所有的成员函数,灰色的那段都是 CLASSWIZARD加的, // TipDlg.h : header file // #if !defined(AFX_TIPDLG_H__AB6D347B_A4AB_11D3_B8FB_82898A0F2927__INCLUDED_) #define AFX_TIPDLG_H__AB6D347B_A4AB_11D3_B8FB_82898A0F2927__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #define IDM_TIMER15 WM_USER+1 #define IDM_TIMER20 WM_USER+2 #define IDM_TIMER30 WM_USER+3 #define IDM_ONTOP WM_USER+4 #define IDM_NOTOP WM_USER+5 ///////////////////////////////////////////////////////////////////////////// // CTipDlg dialog class CTipDlg : public CDialog { private: int index; BOOL bOnTop; CString pRecord; protected://这个函数用来处理文件方面的操作, //在OnRecord,OnDelete,OnPrevious,OnNext中都调用. //在3.0中要改成采用.MDB的数据库文件操作, //基本上只对这里作改动. int FileOp (CString& tempString, BOOL bRead, BOOL bSetLength); public: CString pFileName; // Construction public: CTipDlg(CWnd* pParent = NULL); // standard constructor // ~CTipDlg(); // Dialog Data //{{AFX_DATA(CTipDlg) enum { IDD = IDD_TIP_DIALOG }; CString m_Tips; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CTipDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: HICON m_hIcon; // Generated message map functions //{{AFX_MSG(CTipDlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnTimer(UINT nIDEvent); afx_msg void OnRecord(); afx_msg void OnPrevious(); afx_msg void OnNext(); afx_msg void OnDelete(); afx_msg BOOL OnHelpInfo(HELPINFO* pHelpInfo); virtual void OnCancel(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; //{{AFX_INSERT_LOCATION}} //Microsoft Visual C++ will insert additional declarations immediately #endif // !defined(AFX_TIPDLG_H__AB6D347B_A4AB_11D3_B8FB_82898A0F2927__INCLUDED_) 下面是TipDlg.cpp,主要的工作有两个:1,对4个按键进行相应的处理,重点当然是 文件的操作.2,对系统菜单的操作.其实这本不是重点的. // TipDlg.cpp : implementation file #include "stdafx.h" #include "Tip.h" #include "TipDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) afx_msg void OnHelp(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) ON_BN_CLICKED(IDC_HELP1, OnHelp) //}}AFX_MSG_MAP END_MESSAGE_MAP() /////////////////////////////////////////////// // CTipDlg dialog CTipDlg::CTipDlg(CWnd* pParent /*=NULL*/) : CDialog(CTipDlg::IDD, pParent) { //{{AFX_DATA_INIT(CTipDlg) m_Tips = _T(""); //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CTipDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTipDlg) DDX_Text(pDX, IDC_Tips, m_Tips); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CTipDlg, CDialog) //{{AFX_MSG_MAP(CTipDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_TIMER() ON_BN_CLICKED(ID_RECORD, OnRecord) ON_BN_CLICKED(ID_PREVIOUS, OnPrevious) ON_BN_CLICKED(ID_NEXT, OnNext) ON_BN_CLICKED(ID_DELETE, OnDelete) ON_WM_HELPINFO() //}}AFX_MSG_MAP END_MESSAGE_MAP() //////////////////////////////////////////// // CTipDlg message handlers BOOL CTipDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX <0xf000); #ifndef _DEBUG SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE); #endif bOnTop=TRUE; CMenu* pSysMenu=GetSystemMenu(FALSE); if (pSysMenu != NULL) {pSysMenu->DeleteMenu(4, MF_BYPOSITION); //Maximum; pSysMenu->DeleteMenu(2, MF_BYPOSITION); //Size; pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, "&About Tip..."); pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_TIMER15, "&15 Minutes(Default)"); pSysMenu->AppendMenu(MF_STRING, IDM_TIMER20, "&20 Minutes"); pSysMenu->AppendMenu(MF_STRING, IDM_TIMER30, "&30 Minutes"); pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ONTOP, "Always &OnTop"); pSysMenu->AppendMenu(MF_STRING, IDM_NOTOP, "&Cancel OnTop"); } // Set the icon for this dialog. // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here pRecord = "Tips in " + pFileName; index = GetProfileInt(pRecord, "number", 1); index = FileOp( m_Tips, TRUE, FALSE); int time = GetProfileInt(pRecord, "timer", 15); SetTimer(1, time*1000 * 60, NULL); //15 Minutes. return TRUE; // return TRUE unless you set the focus to a control } void CTipDlg::OnSysCommand(UINT nID, LPARAM lParam) { CAboutDlg dlgAbout; switch(nID) { case IDM_ABOUTBOX: dlgAbout.DoModal(); break; case IDM_TIMER15: WriteProfileString(pRecord, "timer", "15"); SetTimer(1, 15*1000*60, NULL); //15 Minutes. MessageBox("Timer has been changed as 15 Minutes.", "Right!", MB_ICONEXCLAMATION|MB_OK); break; case IDM_TIMER20: WriteProfileString(pRecord, "timer", "20"); SetTimer(1, 20*1000*60, NULL); //20 Minutes. MessageBox("Timer has been changed as 20 Minutes.", "Right!", MB_ICONEXCLAMATION|MB_OK); break; case IDM_TIMER30: WriteProfileString(pRecord, "timer", "30"); SetTimer(1, 30*1000*60, NULL); //30 Minutes. MessageBox("Timer has been changed as 30 Minutes.", "Right!", MB_ICONEXCLAMATION|MB_OK); break; case IDM_ONTOP: SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE); bOnTop = TRUE; break; case IDM_NOTOP: SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE); bOnTop = FALSE; break; default: CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CTipDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CString tempString; tempString.Format("%d", index); SetDlgItemText(IDC_INDEX, tempString); SYSTEMTIME m_Time; GetLocalTime(&m_Time); tempString.Format("%d:%d", m_Time.wHour, m_Time.wMinute); SetDlgItemText(IDC_TIME, tempString); SetDlgItemText(IDC_Tips, m_Tips); CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CTipDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CTipDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default //OpenIcon(); ShowWindow(SW_SHOWNORMAL); CDialog::OnTimer(nIDEvent); } void CTipDlg::OnRecord() { // TODO: Add your control notification handler code here GetDlgItemText(IDC_Tips, m_Tips); index = GetProfileInt(pRecord, "number", 1) ; FileOp(m_Tips, FALSE, TRUE); OnPaint(); } void CTipDlg::OnPrevious() { // TODO: Add your control notification handler code here if (index == 1) return; index --; index = FileOp(m_Tips, TRUE, FALSE); OnPaint(); } void CTipDlg::OnNext() { // TODO: Add your control notification handler code here index ++; index = FileOp(m_Tips, TRUE, FALSE); OnPaint(); } void CTipDlg::OnDelete() { // TODO: Add your control notification handler code here int total = GetProfileInt(pRecord, "number", 1); if (index >= total) { index --; index = FileOp(m_Tips, TRUE, TRUE); OnPaint(); } } int CTipDlg::FileOp(CString& String, BOOL bRead, BOOL bSet) { /*////////////////////////////// PHKEY hKey; DWORD dwDisposition; index = RegCreateKeyEx(HKEY_LOCAL_MACHINE, "Software\Tips", 0, "Index", KEY_QUERY_VALUE , KEY_ALL_ACCESS, NULL, hKey, &dwDisposition); long lSize; index = RegQueryValue(*hKey, "Index", &index, &lSize); /*////////////////////////////////// CStdioFile m_hfile; if( !m_hfile.Open( pFileName, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite | CFile::typeText ) ) { #ifdef _DEBUG afxDump << "Unable to open file" << "\n"; #endif exit( 1 ); } int temp; CString tempString1,tempString2; BOOL bEOF; for (temp=0;(temp<index)&&(bEOF=m_hfile.ReadString(tempString1)); temp++) {tempString2= tempString1;} if(bSet== TRUE) { DWORD dwPosition=m_hfile.GetPosition(); m_hfile.SetLength(dwPosition); if(bRead== FALSE) { m_hfile.WriteString(String); m_hfile.WriteString("\n"); tempString2="String;" index="temp" + 1; } CString number; number.Format("%d", index); WriteProfileString(pRecord, "number", number); } m_hfile.Close(); String= "tempString2;" return temp;} BOOL CTipDlg::OnHelpInfo(HELPINFO* pHelpInfo) { // TODO: Add your message handler code here and/or call default ShellExecute(*this, "open", "help.htm", NULL, NULL, SW_SHOW); return TRUE; } void CTipDlg::OnCancel() { // TODO: Add extra cleanup here ShowWindow(SW_SHOWMINIMIZED); if (bOnTop == FALSE) CDialog::OnCancel(); else { int iTemp = MessageBox("Are you sure to close the Tips?", "Exit?", MB_YESNO|MB_ICONSTOP|MB_DEFBUTTON2); if (iTemp == IDYES) CDialog::OnCancel(); } } void CAboutDlg::OnHelp() { // TODO: Add your control notification handler code here ShellExecute(*this, "open", "help.htm", NULL, NULL, SW_SHOW); } |
Copyright 1998-2002 Fadshop.net, Inc. All rights reserved. jhj123@163.net |