CapitalNumDlg.cpp
上传用户:lqt88888
上传日期:2009-12-14
资源大小:905k
文件大小:9k
源码类别:

书籍源码

开发平台:

Visual C++

  1. // CapitalNumDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "CapitalNum.h"
  5. #include "CapitalNumDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CAboutDlg dialog used for App About
  13. //定义操作堆栈结果的常数
  14. #define OK 0 //操作成功
  15. #define EOVER 1 //超过堆栈最大值
  16. #define EEMPTY 2 //堆栈为空
  17. #define EUNKNOWN 3 //未知的操作
  18. //堆栈的大小
  19. #define STACKSIZE 1024
  20. int push (int   value, int   type); //进堆栈
  21. int pop (int   *value, int   *type); //出堆栈
  22. int cleanstack (); //清空堆栈
  23. int drop ();
  24. int pickup(int   *value, int   *type); //取堆栈头的数据
  25. int dump(); //将堆栈的数据写入字符串
  26. void str2str (char   *s); //转换
  27. void longtostr (long n);
  28. char *unit1[] = {"", "拾","佰","仟"};
  29. char *unit2[] = {"","万","亿"};
  30. char *digital[] = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
  31. //堆栈数据结构
  32. typedef struct meta {
  33. int value;
  34. int type;
  35. } META;
  36. //堆栈
  37. META stack[STACKSIZE];
  38. //堆栈索引
  39. int sp = -1;
  40. //转换后的结果字符串
  41. CString strNum = "";
  42. //将堆栈的数据写入字符串
  43. int dump ()
  44. {
  45. int i;
  46. int v,t;
  47. CString str;
  48. for (i = sp; i>=0; i--) {
  49. v = stack[i].value;
  50. t = stack[i].type;
  51. if (i==sp && (t >0 || (t ==0 && v ==0)))
  52. continue;
  53. switch (t) 
  54. {
  55.   case 0://1,2,3,4,5,6,7,8,9
  56. str.Format("%s",digital[v]);
  57. break;
  58.   case 1://十,佰,千
  59. str.Format("%s",unit1[v]);
  60. break;
  61.   case 2://万,亿
  62. str.Format("%s",unit2[v]);
  63. break;
  64. }
  65. strNum += str;
  66. }
  67. return OK;
  68. }
  69. //进堆栈
  70. int push (int   value, int   type)
  71. {
  72. int v;
  73. int t;
  74. int ret;
  75. if (value == 0 && type ==0) {
  76. ret = pickup (&v, &t);
  77. if ( (v ==0) || ret || t>1)
  78. return EUNKNOWN;
  79. }
  80. if (type == 2) {
  81. ret = pickup (&v, &t);
  82. if (t == 2 && v < value)
  83. drop ();
  84. }
  85. if (++sp >= STACKSIZE)
  86.     return EOVER;
  87. stack[sp].value = value;
  88. stack[sp].type = type;
  89. return OK;
  90. }
  91. //出堆栈
  92. int pop (int   *value, int   *type)
  93. {
  94. if (sp < 0) 
  95.    return EEMPTY;
  96. *value = stack[sp].value;
  97. *type = stack[sp].type;
  98. sp --;
  99. return OK;
  100. }
  101. //清空堆栈
  102. int cleanstack ()
  103. {
  104. for (int i = sp; i>=0; i--)
  105. {
  106. stack[i].type = 0;
  107. stack[i].value = 0;
  108. }
  109. strNum = "";
  110. sp = -1;
  111. return OK;
  112. }
  113. int drop ()
  114. {
  115. if (sp < 0)
  116. return EEMPTY;
  117. sp --;
  118. return OK;
  119. }
  120. //获得堆栈头的数据
  121. int pickup(int   *value, int   *type)
  122. {
  123. if (sp < 0) 
  124.    return EEMPTY;
  125. *value = stack[sp].value;
  126. *type = stack[sp].type;
  127. return OK;
  128. }
  129. //将数字字符串转换为中文大写字符串
  130. void str2str (char   *s)
  131. {
  132. //清空堆栈
  133. cleanstack();
  134. char *h, *t;
  135. int d, c;
  136. int utype1, utype2, dtype;
  137. int slen;
  138. //如果为空,则设为零
  139. if (!s) {
  140. printf ("零n");
  141. return;
  142. }
  143. //获得数字字符串长度
  144. slen = strlen (s);
  145. h = s;
  146. t = s+slen-1;
  147. //初始化表示数字位置的类型
  148. d = utype1 = utype2 = dtype = 0;
  149. //一个一个数字转换
  150. for (;t>=h;t--) {
  151. c = (*t) - '0';
  152. if (utype2>0 && utype1 ==0)
  153. push (utype2, 2);
  154. if (c)
  155. push (utype1, 1);
  156. push (c, 0);
  157. d++;
  158. utype1 = d % 4;
  159. utype2 = (d / 4) % 3;
  160. if (d > 8 && utype2 ==0)
  161.     utype2++;
  162. }
  163. //将堆栈的值转换为一个字符串
  164. dump();
  165. return;
  166. }
  167. //将长整形值转换为中文大写数字
  168. void longtostr (long n)
  169. {
  170. char s[12];
  171. sprintf (s, "%ld", n);
  172. str2str (s);
  173. return;
  174. }
  175. class CAboutDlg : public CDialog
  176. {
  177. public:
  178. CAboutDlg();
  179. // Dialog Data
  180. //{{AFX_DATA(CAboutDlg)
  181. enum { IDD = IDD_ABOUTBOX };
  182. //}}AFX_DATA
  183. // ClassWizard generated virtual function overrides
  184. //{{AFX_VIRTUAL(CAboutDlg)
  185. protected:
  186. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  187. //}}AFX_VIRTUAL
  188. // Implementation
  189. protected:
  190. //{{AFX_MSG(CAboutDlg)
  191. //}}AFX_MSG
  192. DECLARE_MESSAGE_MAP()
  193. };
  194. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  195. {
  196. //{{AFX_DATA_INIT(CAboutDlg)
  197. //}}AFX_DATA_INIT
  198. }
  199. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  200. {
  201. CDialog::DoDataExchange(pDX);
  202. //{{AFX_DATA_MAP(CAboutDlg)
  203. //}}AFX_DATA_MAP
  204. }
  205. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  206. //{{AFX_MSG_MAP(CAboutDlg)
  207. // No message handlers
  208. //}}AFX_MSG_MAP
  209. END_MESSAGE_MAP()
  210. /////////////////////////////////////////////////////////////////////////////
  211. // CCapitalNumDlg dialog
  212. CCapitalNumDlg::CCapitalNumDlg(CWnd* pParent /*=NULL*/)
  213. : CDialog(CCapitalNumDlg::IDD, pParent)
  214. {
  215. //{{AFX_DATA_INIT(CCapitalNumDlg)
  216. m_strCapitalNum = _T("");
  217. m_strNum = _T("");
  218. //}}AFX_DATA_INIT
  219. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  220. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  221. }
  222. void CCapitalNumDlg::DoDataExchange(CDataExchange* pDX)
  223. {
  224. CDialog::DoDataExchange(pDX);
  225. //{{AFX_DATA_MAP(CCapitalNumDlg)
  226. DDX_Text(pDX, IDC_CAPITALNUM, m_strCapitalNum);
  227. DDX_Text(pDX, IDC_NUM, m_strNum);
  228. //}}AFX_DATA_MAP
  229. }
  230. BEGIN_MESSAGE_MAP(CCapitalNumDlg, CDialog)
  231. //{{AFX_MSG_MAP(CCapitalNumDlg)
  232. ON_WM_SYSCOMMAND()
  233. ON_WM_PAINT()
  234. ON_WM_QUERYDRAGICON()
  235. ON_BN_CLICKED(IDC_PRV, OnPrv)
  236. ON_BN_CLICKED(IDC_NEXT, OnNext)
  237. ON_WM_DESTROY()
  238. //}}AFX_MSG_MAP
  239. END_MESSAGE_MAP()
  240. /////////////////////////////////////////////////////////////////////////////
  241. // CCapitalNumDlg message handlers
  242. BOOL CCapitalNumDlg::OnInitDialog()
  243. {
  244. CDialog::OnInitDialog();
  245. // Add "About..." menu item to system menu.
  246. // IDM_ABOUTBOX must be in the system command range.
  247. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  248. ASSERT(IDM_ABOUTBOX < 0xF000);
  249. CMenu* pSysMenu = GetSystemMenu(FALSE);
  250. if (pSysMenu != NULL)
  251. {
  252. CString strAboutMenu;
  253. strAboutMenu.LoadString(IDS_ABOUTBOX);
  254. if (!strAboutMenu.IsEmpty())
  255. {
  256. pSysMenu->AppendMenu(MF_SEPARATOR);
  257. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  258. }
  259. }
  260. // Set the icon for this dialog.  The framework does this automatically
  261. //  when the application's main window is not a dialog
  262. SetIcon(m_hIcon, TRUE); // Set big icon
  263. SetIcon(m_hIcon, FALSE); // Set small icon
  264. // TODO: Add extra initialization here
  265. //初始化环境
  266. ::CoInitialize(NULL);
  267. //创建并打开数据库连接对象
  268. _variant_t vFieldValue;
  269. CString strFieldValue;
  270. m_pCon.CreateInstance(__uuidof(Connection));
  271. m_pCon->Open("capitalnum","","",NULL);
  272. //创建并打开记录集对象
  273. m_pRs.CreateInstance(__uuidof(Recordset));
  274. m_pRs->Open("select* from table1",m_pCon.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
  275. if(VARIANT_FALSE == m_pRs->EndOfFile)
  276.     {
  277. //获得第一条记录并显示
  278. long Num;
  279. vFieldValue = m_pRs->GetCollect("Num");
  280. strFieldValue = (char*)_bstr_t(vFieldValue);
  281. Num = atol(strFieldValue.GetBuffer(0));;
  282. vFieldValue.Clear();
  283. m_strNum = strFieldValue;
  284. longtostr(Num);
  285. m_strCapitalNum = strNum;
  286.     }
  287. UpdateData(FALSE);
  288. return TRUE;  // return TRUE  unless you set the focus to a control
  289. }
  290. void CCapitalNumDlg::OnSysCommand(UINT nID, LPARAM lParam)
  291. {
  292. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  293. {
  294. CAboutDlg dlgAbout;
  295. dlgAbout.DoModal();
  296. }
  297. else
  298. {
  299. CDialog::OnSysCommand(nID, lParam);
  300. }
  301. }
  302. // If you add a minimize button to your dialog, you will need the code below
  303. //  to draw the icon.  For MFC applications using the document/view model,
  304. //  this is automatically done for you by the framework.
  305. void CCapitalNumDlg::OnPaint() 
  306. {
  307. if (IsIconic())
  308. {
  309. CPaintDC dc(this); // device context for painting
  310. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  311. // Center icon in client rectangle
  312. int cxIcon = GetSystemMetrics(SM_CXICON);
  313. int cyIcon = GetSystemMetrics(SM_CYICON);
  314. CRect rect;
  315. GetClientRect(&rect);
  316. int x = (rect.Width() - cxIcon + 1) / 2;
  317. int y = (rect.Height() - cyIcon + 1) / 2;
  318. // Draw the icon
  319. dc.DrawIcon(x, y, m_hIcon);
  320. }
  321. else
  322. {
  323. CDialog::OnPaint();
  324. }
  325. }
  326. // The system calls this to obtain the cursor to display while the user drags
  327. //  the minimized window.
  328. HCURSOR CCapitalNumDlg::OnQueryDragIcon()
  329. {
  330. return (HCURSOR) m_hIcon;
  331. }
  332. void CCapitalNumDlg::OnPrv() 
  333. {
  334. _variant_t vFieldValue;
  335. CString strFieldValue;
  336. //记录集指针前移一条
  337. m_pRs->MovePrevious();
  338. if(VARIANT_FALSE == m_pRs->FirstOfFile)
  339.     {
  340. //获得当前条的数据并显示
  341. long Num;
  342. vFieldValue = m_pRs->GetCollect("Num");
  343. strFieldValue = (char*)_bstr_t(vFieldValue);
  344. Num = atol(strFieldValue.GetBuffer(0));;
  345. vFieldValue.Clear();
  346. m_strNum = strFieldValue;
  347. //转换为大写中文数字
  348. longtostr(Num);
  349. m_strCapitalNum = strNum;
  350. UpdateData(FALSE);
  351.     }
  352. else
  353. {
  354. //定位到第一条
  355. m_pRs->MoveNext();
  356. AfxMessageBox("已经到第一条了");
  357. }
  358. }
  359. void CCapitalNumDlg::OnNext() 
  360. {
  361. _variant_t vFieldValue;
  362. CString strFieldValue;
  363. //记录集指针后移一条
  364. m_pRs->MoveNext();
  365. if(VARIANT_FALSE == m_pRs->EndOfFile)
  366.     {
  367. //获得当前条的数据并显示
  368. long Num;
  369. vFieldValue = m_pRs->GetCollect("Num");
  370. strFieldValue = (char*)_bstr_t(vFieldValue);
  371. Num = atol(strFieldValue.GetBuffer(0));;
  372. vFieldValue.Clear();
  373. m_strNum = strFieldValue;
  374. //转换为大写中文数字
  375. longtostr(Num);
  376. m_strCapitalNum = strNum;
  377. UpdateData(FALSE);
  378.     }
  379. else
  380. {
  381. //定位到最后一条
  382. m_pRs->MovePrevious();
  383. AfxMessageBox("已经到最后一条了");
  384. }
  385. }
  386. void CCapitalNumDlg::OnDestroy() 
  387. {
  388. //关闭数据库
  389. ::CoUninitialize();
  390. m_pRs->Close();
  391. m_pCon->Close();
  392. CDialog::OnDestroy();
  393. }