Dialogs.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:16k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. // Dialogs.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Dialogs.h"
  5. #include "io.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CWaitDlg dialog
  13. CWaitDlg::CWaitDlg(CWnd* pParent /*=NULL*/, BOOL bEnableCancel, BOOL bTopMost, CRect rect )
  14. : CDialog(CWaitDlg::IDD, pParent)
  15. {
  16. //{{AFX_DATA_INIT(CWaitDlg)
  17. //}}AFX_DATA_INIT
  18. m_bEnableCancel = bEnableCancel;
  19. m_bTopMost = bTopMost;
  20. m_bCanceled = false;
  21. m_rectPosition = rect;
  22. CDialog::Create( CWaitDlg::IDD, pParent );
  23. MSG msg;
  24. while (::PeekMessage(&msg, NULL, NULL, NULL, PM_NOREMOVE) )
  25. AfxGetApp()->PumpMessage();
  26. }
  27. void CWaitDlg::DoDataExchange(CDataExchange* pDX)
  28. {
  29. CDialog::DoDataExchange(pDX);
  30. //{{AFX_DATA_MAP(CWaitDlg)
  31. DDX_Control(pDX, IDCANCEL, m_btnCancel);
  32. DDX_Control(pDX, IDC_XFSTATIC_PRO, m_Static);
  33. DDX_Control(pDX, IDC_XFPROGRESS, m_Progress);
  34. //}}AFX_DATA_MAP
  35. }
  36. void CWaitDlg::SetProgress(int nPos)
  37. {
  38. if( !::IsWindow(m_Progress.GetSafeHwnd()) )
  39. return;
  40. int nLower = 0, nUpper = 0;
  41. m_Progress.GetRange( nLower, nUpper );
  42. if( nLower < nUpper && nPos >= nLower && nPos <= nUpper )
  43. {
  44. double x = 100.*(nPos-nLower)/(nUpper-nLower);
  45. CString strMsgNew, strMsgOld;
  46. CString strTemp;
  47. strTemp = /*AfxModuleLoadString( IDS_XFHASFINISHED )*/"已完成";
  48. // static
  49. m_Static.GetWindowText( strMsgOld );
  50. strMsgNew.Format( "%s%.1f%%", strTemp, x );
  51. if( 0 != strMsgOld.Compare( strMsgNew ) )
  52. m_Static.SetWindowText(strMsgNew);
  53. // progress
  54. m_Progress.SetPos(nPos);
  55. // title
  56. CString strTitleOld, strTitleNew;
  57. GetWindowText( strTitleOld );
  58. int nIndex = strTitleOld.Find( " - " );
  59. if( -1 != nIndex )
  60. strTitleNew = strTitleOld.Mid( nIndex + strlen(" - ") );
  61. else
  62. strTitleNew = strTitleOld;
  63. strTitleNew = strMsgNew + " - " + strTitleNew;
  64. if( 0 != strTitleOld.Compare( strTitleNew ) )
  65. SetWindowText( strTitleNew );
  66. }
  67. }
  68. void CWaitDlg::SetProgressRange(int nMin, int nMax)
  69. {
  70. if( nMax <= nMin )
  71. nMax = nMin + 1;
  72. m_Progress.SetRange( nMin, nMax );
  73. }
  74. BOOL CWaitDlg::WaitForCancel( )
  75. {
  76. MSG msg;
  77. while (::PeekMessage(&msg, NULL, NULL, NULL, PM_NOREMOVE) )
  78. {
  79. AfxGetApp()->PumpMessage();
  80. }
  81. return m_bCanceled;
  82. }
  83. BEGIN_MESSAGE_MAP(CWaitDlg, CDialog)
  84. //{{AFX_MSG_MAP(CWaitDlg)
  85. ON_WM_CREATE()
  86. ON_WM_CLOSE()
  87. //}}AFX_MSG_MAP
  88. ON_MESSAGE(WM_USER_WAITPROGRESS, OnWaitProgress)
  89. END_MESSAGE_MAP()
  90. /////////////////////////////////////////////////////////////////////////////
  91. // CWaitDlg message handlers
  92. BOOL CWaitDlg::OnInitDialog() 
  93. {
  94. CDialog::OnInitDialog();
  95. // TODO: Add extra initialization here
  96. m_btnCancel.EnableWindow( m_bEnableCancel );
  97. return TRUE;  // return TRUE unless you set the focus to a control
  98.               // EXCEPTION: OCX Property Pages should return FALSE
  99. }
  100. void CWaitDlg::OnCancel() 
  101. {
  102. // TODO: Add extra cleanup here
  103. m_bCanceled = true;
  104. }
  105. int CWaitDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  106. {
  107. if (CDialog::OnCreate(lpCreateStruct) == -1)
  108. return -1;
  109. // TODO: Add your specialized creation code here
  110. if( m_bTopMost )
  111. {
  112. int cx = GetSystemMetrics( SM_CXSCREEN );
  113. int cy = GetSystemMetrics( SM_CYSCREEN );
  114. CRect rect;
  115. GetClientRect( &rect );
  116. m_rectPosition.left = (cx-rect.Width())/2;
  117. m_rectPosition.top = (cy-rect.Height())/2;
  118. m_rectPosition.right= m_rectPosition.left + rect.Width();
  119. m_rectPosition.bottom= m_rectPosition.bottom + rect.Height();
  120. SetWindowPos( &wndTopMost, m_rectPosition.left, m_rectPosition.top, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE );
  121. }
  122. return 0;
  123. }
  124. void CWaitDlg::OnClose() 
  125. {
  126. // TODO: Add your message handler code here and/or call default
  127. if( m_bEnableCancel )
  128. m_bCanceled = true;
  129. }
  130. LRESULT CWaitDlg::OnWaitProgress(WPARAM wParam, LPARAM lParam)
  131. {
  132. SetProgress( wParam );
  133. return 0;
  134. }
  135. /////////////////////////////////////////////////////////////////////////////
  136. // CPathDialogSub & CPathDialog
  137. #define PATHDLG_IDC_FOLDERTREE 0x3741
  138. #define PATHDLG_IDC_TITLE 0x3742
  139. #define PATHDLG_IDC_STATUSTEXT 0x3743
  140. #define PATHDLG_IDC_NEW_EDIT_PATH 0x3744
  141. // Class CDlgWnd
  142. BEGIN_MESSAGE_MAP(CPathDialogSub, CWnd)
  143.         ON_BN_CLICKED(IDOK, OnOK)
  144. ON_EN_CHANGE(PATHDLG_IDC_NEW_EDIT_PATH, OnChangeEditPath)
  145. END_MESSAGE_MAP()
  146. void CPathDialogSub::OnOK()
  147. {
  148. ::GetWindowText(::GetDlgItem(m_hWnd, PATHDLG_IDC_NEW_EDIT_PATH),
  149. m_pPathDialog->m_szPathName, MAX_PATH);
  150. if(CPathDialog::MakeSurePathExists(m_pPathDialog->m_szPathName)==0)
  151. {
  152. m_pPathDialog->m_bGetSuccess=TRUE;
  153. ::EndDialog(m_pPathDialog->m_hWnd, IDOK);
  154. }
  155. else
  156. {
  157. ::SetFocus(::GetDlgItem(m_hWnd, PATHDLG_IDC_NEW_EDIT_PATH));
  158. }
  159. }
  160. void CPathDialogSub::OnChangeEditPath()
  161. {
  162. ::GetWindowText(::GetDlgItem(m_hWnd, PATHDLG_IDC_NEW_EDIT_PATH),
  163. m_pPathDialog->m_szPathName, MAX_PATH);
  164. BOOL bEnableOKButton = (_tcslen(m_pPathDialog->m_szPathName)>0);
  165. SendMessage(BFFM_ENABLEOK, 0, bEnableOKButton);
  166. }
  167. /////////////////////////////////////////////////////////////////////////////
  168. // CPathDialog dialog
  169. CPathDialog::CPathDialog(LPCTSTR lpszCaption, 
  170.  LPCTSTR lpszTitle, 
  171.  LPCTSTR lpszInitialPath, 
  172.  CWnd* pParent)
  173. {
  174. m_hWnd=NULL;
  175. m_PathDialogSub.m_pPathDialog= this;
  176.     m_bParentDisabled = FALSE;
  177.     // Get the true parent of the dialog
  178.     m_pParentWnd = CWnd::GetSafeOwner(pParent);
  179. m_lpszCaption = lpszCaption;
  180. m_lpszInitialPath = lpszInitialPath;
  181. memset(&m_bi, 0, sizeof(BROWSEINFO) );
  182. m_bi.hwndOwner = (m_pParentWnd==NULL)?NULL:m_pParentWnd->GetSafeHwnd();
  183. m_bi.pszDisplayName = 0;
  184. m_bi.pidlRoot = 0;
  185. m_bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
  186. m_bi.lpfn = BrowseCallbackProc;
  187. m_bi.lpszTitle = lpszTitle;
  188. }
  189. /////////////////////////////////////////////////////////////////////////////
  190. // CPathDialog message handlers
  191. CString CPathDialog::GetPathName()
  192. {
  193. return CString(m_szPathName);
  194. }
  195. int CALLBACK CPathDialog::BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam, LPARAM pData) 
  196. {
  197. CPathDialog* pDlg = (CPathDialog*)pData;
  198. switch(uMsg) 
  199. {
  200. case BFFM_INITIALIZED: 
  201. {
  202. RECT rc;
  203. HWND hEdit;
  204. HFONT hFont;
  205. pDlg->m_hWnd = hwnd;
  206. if(pDlg->m_lpszCaption!=NULL)
  207. {
  208. ::SetWindowText(hwnd, pDlg->m_lpszCaption);
  209. }
  210. VERIFY(pDlg->m_PathDialogSub.SubclassWindow(hwnd));
  211. ::ShowWindow(::GetDlgItem(hwnd, PATHDLG_IDC_STATUSTEXT), SW_HIDE);
  212. ::GetWindowRect(::GetDlgItem(hwnd, PATHDLG_IDC_FOLDERTREE), &rc);
  213. rc.bottom = rc.top - 4;
  214. rc.top = rc.bottom - 23;
  215. ::ScreenToClient(hwnd, (LPPOINT)&rc);
  216. ::ScreenToClient(hwnd, ((LPPOINT)&rc)+1);
  217. hEdit = ::CreateWindowEx(WS_EX_CLIENTEDGE, _T("EDIT"), _T(""),
  218. WS_CHILD|WS_TABSTOP|WS_VISIBLE|ES_AUTOHSCROLL,
  219. rc.left, rc.top, 
  220. rc.right-rc.left, rc.bottom-rc.top, 
  221. hwnd, NULL, NULL, NULL);
  222. ::SetWindowLong(hEdit, GWL_ID, PATHDLG_IDC_NEW_EDIT_PATH);
  223. ::ShowWindow(hEdit, SW_SHOW);
  224. hFont = (HFONT)::SendMessage(hwnd, WM_GETFONT, 0, 0);
  225. ::SendMessage(hEdit, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0));
  226. LPCTSTR lpszPath = pDlg->m_lpszInitialPath;
  227. TCHAR szTemp[MAX_PATH];
  228. if(lpszPath==NULL)
  229. {
  230. ::GetCurrentDirectory(MAX_PATH, szTemp );
  231. lpszPath = szTemp;
  232. }
  233. // WParam is TRUE since you are passing a path.
  234. // It would be FALSE if you were passing a pidl.
  235. ::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,
  236. (LPARAM)lpszPath);
  237. break;
  238. }
  239. case BFFM_SELCHANGED:
  240. {
  241. char szSelection[MAX_PATH];
  242. if(!::SHGetPathFromIDList((LPITEMIDLIST)lParam, szSelection) ||
  243. szSelection[1]!=':')
  244. {
  245. szSelection[0] = '';
  246. ::SendMessage(hwnd, BFFM_ENABLEOK, 0, FALSE);
  247. }
  248. else
  249. {
  250. ::SendMessage(hwnd, BFFM_ENABLEOK, 0, TRUE);
  251. }
  252. ::SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)szSelection);
  253. ::SetWindowText(::GetDlgItem(hwnd, PATHDLG_IDC_NEW_EDIT_PATH), szSelection);
  254. break;
  255. }
  256. default:
  257. break;
  258. }
  259. return 0;
  260. }
  261. int CPathDialog::DoModal() 
  262. {
  263. /////////////////////////////////////////////////////////
  264. TCHAR szPathTemp[MAX_PATH];
  265.     m_bi.lpfn = BrowseCallbackProc;  // address of callback function
  266.     m_bi.lParam = (LPARAM)this;      // pass address of object to callback function
  267. m_bi.pszDisplayName = szPathTemp;
  268. LPITEMIDLIST pidl;
  269. LPMALLOC pMalloc;
  270. int iResult=-1;
  271. if(SUCCEEDED(SHGetMalloc(&pMalloc)))
  272. {
  273. // if((m_pParentWnd!=NULL) && m_pParentWnd->IsWindowEnabled())
  274. // {
  275. //   m_pParentWnd->EnableWindow(FALSE);
  276. //   m_bParentDisabled = TRUE;
  277. // }
  278. m_bGetSuccess = FALSE;
  279. pidl = SHBrowseForFolder(&m_bi);
  280. if (pidl!=NULL) 
  281. {
  282. //not need do this because OnOK function did
  283. //bSucceeded = SHGetPathFromIDList(pidl, m_szPathName);
  284. // In C++: 
  285. pMalloc->Free(pidl);
  286. //In C:
  287. //pMalloc->lpVtbl->Free(pMalloc,pidl);
  288. //pMalloc->lpVtbl->Release(pMalloc);
  289. }
  290. if(m_bGetSuccess)
  291. {
  292. iResult = IDOK;
  293. }
  294. pMalloc->Release();
  295. }
  296.     if(m_bParentDisabled && (m_pParentWnd!=NULL))
  297. {
  298. m_pParentWnd->EnableWindow(TRUE);
  299. }
  300.     m_bParentDisabled=FALSE;
  301. return iResult;
  302. }
  303. BOOL CPathDialog::IsFileNameValid(LPCTSTR lpFileName)
  304. {
  305. if(lpFileName==NULL)
  306. {
  307. return FALSE;
  308. }
  309. int nLen = _tcslen(lpFileName);
  310. if(nLen<=0)
  311. {
  312. return FALSE;
  313. }
  314. //check first char
  315. switch(lpFileName[0])
  316. {
  317. case _T('.'):
  318. case _T(' '):
  319. case _T('t'):
  320. return FALSE;
  321. }
  322. //check last char
  323. switch(lpFileName[nLen-1])
  324. {
  325. case _T('.'):
  326. case _T(' '):
  327. case _T('t'):
  328. return FALSE;
  329. }
  330. //check all
  331. int i=0;
  332. while(lpFileName[i]!=0)
  333. {
  334. switch(lpFileName[i])
  335. {
  336. case _T('\'):
  337. case _T('/'):
  338. case _T(':'):
  339. case _T('*'):
  340. case _T('?'):
  341. case _T('"'):
  342. case _T('<'):
  343. case _T('>'):
  344. case _T('|'):
  345. return FALSE;
  346. }
  347. i++;
  348. }
  349. return TRUE;
  350. }
  351. /*
  352. const TCHAR c_FolderDoesNotExist[] = _T(
  353. "The folder:nn"
  354. "%snn"
  355. "does not exist. Do you want the folder to be created?");
  356. const TCHAR c_szErrInvalidPath[] = _T(
  357. "The folder:"
  358. "nn"
  359. "%snn"
  360. "is invalid. Please reenter.");
  361. const TCHAR c_szErrCreatePath[] = _T(
  362. "The folder:"
  363. "nn"
  364. "%s"
  365. "nncan not be created. Please double check.");
  366. */
  367. //return -1: user break;
  368. //return 0: no error
  369. //return 1: lpPath is invalid
  370. //return 2: can not create lpPath
  371. int CPathDialog::MakeSurePathExists(LPCTSTR lpPath)
  372. {
  373. CString strPathLocal = "";
  374. if( lpPath )
  375. strPathLocal = lpPath;
  376. int nLen = strPathLocal.GetLength();
  377. if( nLen > 0 && (strPathLocal[nLen-1] == '\' || strPathLocal[nLen-1] == '/') )
  378. strPathLocal = strPathLocal.Left( nLen-1 );
  379. CString strMsg, strMsgFmt;
  380. int iRet;
  381. try
  382. {
  383. //validate path
  384. iRet=Touch(strPathLocal, TRUE);
  385. if(iRet!=0)
  386. {
  387. throw iRet;
  388. }
  389. if(_taccess(strPathLocal, 0)==0)
  390. {
  391. return (int)0;
  392. }
  393. strMsgFmt = /*AfxModuleLoadString( IDS_XFPATHDLG_FOLDERNOTEXIST )*/"文件夹:nn%snn不存在,创建该文件夹吗?";
  394. strMsg.Format(strMsgFmt, lpPath);
  395. if(AfxMessageBox(strMsg, MB_YESNO|MB_ICONQUESTION) != IDYES)
  396. {
  397. return (int)-1;
  398. }
  399. //create path
  400. iRet=Touch(strPathLocal, FALSE);
  401. if(iRet!=0)
  402. {
  403. throw iRet; 
  404. }
  405. return 0;
  406. }
  407. catch(int nErrCode)
  408. {
  409. switch(nErrCode)
  410. {
  411. case 1:
  412. strMsgFmt = /*AfxModuleLoadString( IDS_XFPATHDLG_ERRINVALIDPATH )*/"文件夹:nn%snn不存在,请重新输入。";
  413. break;
  414. case 2:
  415. default:
  416. strMsgFmt = /*AfxModuleLoadString( IDS_XFPATHDLG_ERRCREATEPATH )*/"文件夹:nn%snn无法创建,请重新检查。";
  417. break;
  418. }
  419. strMsg.Format(strMsgFmt, lpPath);
  420. AfxMessageBox(strMsg, MB_OK|MB_ICONEXCLAMATION);
  421. }
  422. return iRet;
  423. }
  424. //return 0: no error
  425. //return 1: lpPath is invalid
  426. //return 2: lpPath can not be created(bValidate==FALSE)
  427. int CPathDialog::Touch(LPCTSTR lpPath, BOOL bValidate)
  428. {
  429. if(lpPath==NULL)
  430. {
  431. return 1;
  432. }
  433. TCHAR szPath[MAX_PATH];
  434. _tcscpy(szPath, lpPath);
  435. int nLen = _tcslen(szPath);
  436. //path must be "x:..."
  437. if( ( nLen<3 ) || 
  438. ( ( szPath[0]<_T('A') || _T('Z')<szPath[0] ) && 
  439.   ( szPath[0]<_T('a') || _T('z')<szPath[0] ) ||
  440. ( szPath[1]!=_T(':') )|| 
  441. ( szPath[2]!=_T('\') )
  442. )
  443.   )
  444. {
  445. return 1;
  446. }
  447. int i;
  448. if(nLen==3)
  449. {
  450. if(!bValidate)
  451. {
  452. if(_access(szPath, 0)!=0)
  453. {
  454. return 2;
  455. }
  456. }
  457. return 0;
  458. }
  459. i = 3;
  460. BOOL bLastOne=TRUE;
  461. LPTSTR lpCurrentName;
  462. while(szPath[i]!=0)
  463. {
  464. lpCurrentName = &szPath[i];
  465. while( (szPath[i]!=0) && (szPath[i]!=_T('\')) )
  466. {
  467. i++;
  468. }
  469. bLastOne =(szPath[i]==0);
  470. szPath[i] = 0;
  471. if( !IsFileNameValid(lpCurrentName) )
  472. {
  473. return 1;
  474. }
  475. if(!bValidate)
  476. {
  477. CreateDirectory(szPath, NULL);
  478. if(_taccess(szPath, 0)!=0)
  479. {
  480. return 2;
  481. }
  482. }
  483. if(bLastOne)
  484. {
  485. break; //it's done
  486. }
  487. else
  488. {
  489. szPath[i] = _T('\');
  490. }
  491. i++;
  492. }
  493. return (bLastOne?0:1);
  494. }
  495. //return 0: ok
  496. //return 1: error
  497. int CPathDialog::ConcatPath(LPTSTR lpRoot, LPCTSTR lpMorePath)
  498. {
  499. if(lpRoot==NULL)
  500. {
  501. return 1;
  502. }
  503. int nLen = _tcslen(lpRoot);
  504. if(nLen<3)
  505. {
  506. return 1;
  507. }
  508. if(lpMorePath==NULL)
  509. {
  510. return 0;
  511. }
  512. if(nLen==3)
  513. {
  514. _tcscat(lpRoot, lpMorePath);
  515. return 0;
  516. }
  517. _tcscat(lpRoot, _T("\"));
  518. _tcscat(lpRoot, lpMorePath);
  519. return 0;
  520. }
  521. /////////////////////////////////////////////////////////////////////////////
  522. // CStringDialog dialog
  523. CStringDialog::CStringDialog(CWnd* pParent /*=NULL*/, UINT nIDTitle, UINT nIDDescript,
  524. LPCTSTR lpszInitValue )
  525. : CDialog(CStringDialog::IDD, pParent)
  526. {
  527. //{{AFX_DATA_INIT(CStringDialog)
  528. m_strWant = _T("");
  529. m_strDescript = _T("");
  530. //}}AFX_DATA_INIT
  531. m_nIDTitle = nIDTitle;
  532. m_nIDDescript = nIDDescript;
  533. if( lpszInitValue )
  534. m_strWant = lpszInitValue;
  535. }
  536. CString CStringDialog::GetStringWant( )
  537. {
  538. return m_strWant;
  539. }
  540. void CStringDialog::DoDataExchange(CDataExchange* pDX)
  541. {
  542. CDialog::DoDataExchange(pDX);
  543. //{{AFX_DATA_MAP(CStringDialog)
  544. DDX_Control(pDX, IDCANCEL, m_btnCancel);
  545. DDX_Control(pDX, IDOK, m_btnOK);
  546. DDX_Control(pDX, IDC_XFEDITWANT, m_editWant);
  547. DDX_Text(pDX, IDC_XFEDITWANT, m_strWant);
  548. DDX_Text(pDX, IDC_XFDESCRIPT, m_strDescript);
  549. //}}AFX_DATA_MAP
  550. }
  551. BEGIN_MESSAGE_MAP(CStringDialog, CDialog)
  552. //{{AFX_MSG_MAP(CStringDialog)
  553. ON_EN_CHANGE(IDC_XFEDITWANT, OnChangeEditwant)
  554. //}}AFX_MSG_MAP
  555. END_MESSAGE_MAP()
  556. /////////////////////////////////////////////////////////////////////////////
  557. // CStringDialog message handlers
  558. BOOL CStringDialog::OnInitDialog() 
  559. {
  560. CDialog::OnInitDialog();
  561. // TODO: Add extra initialization here
  562. CString strTitle, strDescript;
  563. strTitle = /*AfxModuleLoadString( m_nIDTitle )*/"";
  564. strDescript = /*AfxModuleLoadString( m_nIDDescript )*/"";
  565. if( strTitle.GetLength() > 0 )
  566. SetWindowText( strTitle );
  567. if( strDescript.GetLength() > 0 )
  568. m_strDescript = strDescript;
  569. UpdateData( FALSE );
  570. m_btnOK.EnableWindow( m_strWant.GetLength() > 0 );
  571. return TRUE;  // return TRUE unless you set the focus to a control
  572.               // EXCEPTION: OCX Property Pages should return FALSE
  573. }
  574. void CStringDialog::OnOK() 
  575. {
  576. // TODO: Add extra validation here
  577. UpdateData( );
  578. m_strWant.TrimLeft();
  579. m_strWant.TrimRight();
  580. if( m_strWant.GetLength() <= 0 )
  581. CDialog::OnCancel();
  582. else
  583. CDialog::OnOK();
  584. }
  585. void CStringDialog::OnChangeEditwant() 
  586. {
  587. // TODO: If this is a RICHEDIT control, the control will not
  588. // send this notification unless you override the CDialog::OnInitDialog()
  589. // function and call CRichEditCtrl().SetEventMask()
  590. // with the ENM_CHANGE flag ORed into the mask.
  591. // TODO: Add your control notification handler code here
  592. CString rString;
  593. m_editWant.GetWindowText( rString );
  594. rString.TrimLeft();
  595. rString.TrimRight();
  596. m_btnOK.EnableWindow( rString.GetLength() > 0 );
  597. }