按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
#0043 m_strTip。LoadString(CG_IDS_FILE_ABSENT);
#0044 return;
#0045 }
#0046
#0047 // If the timestamp in the INI file is different from the timestamp of
814
…………………………………………………………Page 877……………………………………………………………
16 ponents & ActiveX Controls
第 章 站眾的肩膀 使用
#0048 // the tips file; then we know that the tips file has been modified
#0049 // Reset the file position to 0 and write the latest timestamp to the
#0050 // ini file
#0051 struct _stat buf;
#0052 _fstat(_fileno(m_pStream); &buf);
#0053 CString strCurrentTime = ctime(&buf。st_ctime);
#0054 strCurrentTime。TrimRight();
#0055 CString strStoredTime =
#0056 pApp…》GetProfileString(szSection; szTimeStamp; NULL);
#0057 if (strCurrentTime != strStoredTime)
#0058 {
#0059 iFilePos = 0;
#0060 pApp…》WriteProfileString(szSection; szTimeStamp; strCurrentTime);
#0061 }
#0062
#0063 if (fseek(m_pStream; iFilePos; SEEK_SET) != 0)
#0064 {
#0065 AfxMessageBox(CG_IDP_FILE_CORRUPT);
#0066 }
#0067 else
#0068 {
#0069 GetNextTipString(m_strTip);
#0070 }
#0071 }
#0072
#0073 CTipDlg::~CTipDlg()
#0074 {
#0075 // This destructor is executed whether the user had pressed the escape key
#0076 // or clicked on the close button。 If the user had pressed the escape key;
#0077 // it is still required to update the filepos in the ini file with the
#0078 // latest position so that we don't repeat the tips!
#0079
#0080 // But make sure the tips file existed in the first place。。。。
#0081 if (m_pStream != NULL)
#0082 {
#0083 CWinApp* pApp = AfxGetApp();
#0084 pApp…》WriteProfileInt(szSection; szIntFilePos; ftell(m_pStream));
#0085 fclose(m_pStream);
#0086 }
#0087 }
#0088
#0089 void CTipDlg::DoDataExchange(CDataExchange* pDX)
#0090 {
#0091 CDialog::DoDataExchange(pDX);
#0092 //{{AFX_DATA_MAP(CTipDlg)
#0093 DDX_Check(pDX; IDC_STARTUP; m_bStartup);
815
…………………………………………………………Page 878……………………………………………………………
第篇 深入 MFC 程式設計
#0094 DDX_Text(pDX; IDC_TIPSTRING; m_strTip);
#0095 //}}AFX_DATA_MAP
#0096 }
#0097
#0098 BEGIN_MESSAGE_MAP(CTipDlg; CDialog)
#0099 //{{AFX_MSG_MAP(CTipDlg)
#0100 ON_BN_CLICKED(IDC_NEXTTIP; OnNextTip)
#0101 ON_WM_CTLCOLOR()
#0102 ON_WM_PAINT()
#0103 //}}AFX_MSG_MAP
#0104 END_MESSAGE_MAP()
#0105
#0106 /////////////////////////////////////////////////////////////////
#0107 // CTipDlg message handlers
#0108
#0109 void CTipDlg::OnNextTip()
#0110 {
#0111 GetNextTipString(m_strTip);
#0112 UpdateData(FALSE);
#0113 }
#0114
#0115 void CTipDlg::GetNextTipString(CString& strNext)
#0116 {
#0117 LPTSTR lpsz = strNext。GetBuffer(MAX_BUFLEN);
#0118
#0119 // This routine identifies the next string that needs to be
#0120 // read from the tips file
#0121 BOOL bStop = FALSE;
#0122 while (!bStop)
#0123 {
#0124 if (_fgetts(lpsz; MAX_BUFLEN; m_pStream) == NULL)
#0125 {
#0126 // We have either reached EOF or enocuntered some problem
#0127 // In both cases reset the pointer to the beginning of the file
#0128 // This behavior is same as VC++ Tips file
#0129 if (fseek(m_pStream; 0; SEEK_SET) != 0)
#0130 AfxMessageBox(CG_IDP_FILE_CORRUPT);
#0131 }
#0132 else
#0133 {
#0134 if (*lpsz != ' ' && *lpsz != 't' &&
#0135 *lpsz != 'n' && *lpsz != ';')
#0136 {
#0137 // There should be no space at the beginning of the tip
#0138 // This behavior is same as VC++ Tips file
#0139 // ment lines are ignored and they start with a semicolon
816
…………………………………………………………Page 879……………………………………………………………
16 ponents & ActiveX Controls
第 章 站眾的肩膀 使用
#0140 bStop = TRUE;
#0141 }
#0142 }
#0143 }
#0144 strNext。ReleaseBuffer();
#0145 }
#0146
#0147 HBRUSH CTipDlg::OnCtlColor(CDC* pDC; CWnd* pWnd; UINT nCtlColor)
#0148 {
#0149 if (pWnd…》GetDlgCtrlID() == IDC_TIPSTRING)
#0150 return (HBRUSH)GetStockObject(WHITE_BRUSH);
#0151
#0152 return CDialog::OnCtlColor(pDC; pWnd; nCtlColor);
#0153 }
#0154
#0155 void CTipDlg::