cTextWriter.cpp
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小:3k
源码类别:

游戏

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "cTextWriter.h"
  3. //////////////////////////////////////////////////////////////////////
  4. // Construction/Destruction
  5. //////////////////////////////////////////////////////////////////////
  6. cTextWriter::cTextWriter()
  7. {
  8. }
  9. cTextWriter::~cTextWriter()
  10. {
  11. }
  12. //绘制文字到屏幕
  13. int cTextWriter::WriteText(LPDIRECTDRAWSURFACE7 pSurface, char *lpszText, int iX, int iY, bool bFixed)
  14. {
  15. int pos;
  16. int nextx;
  17. RECT rcRect;
  18. nextx = iX;
  19. while (*lpszText != '')
  20. {
  21. if (*lpszText != ' ')
  22. {
  23. //step1:找出该字符在对应位图中的数值位置
  24. if (*lpszText >= 48 &&
  25. *lpszText <= 57)
  26. {
  27. //数字:0的ASCII码值是48
  28. pos = (int) *lpszText - 48;
  29. }
  30. else
  31. //字母:-55=-65(A)+10(位图中前十个子位图被数字占有了)
  32. pos = (int) *lpszText - 55;
  33. //'@'在位图中第37个字符的位置
  34. if (*lpszText == '@')
  35. pos = 36;
  36. //'-'在位图中第38个字符的位置
  37. if (*lpszText == '-')
  38. pos = 37;
  39. //','在位图中第39个字符的位置
  40. if (*lpszText == ',')
  41. pos = 38;
  42. //句号和冒号都用一个dot子位图构成,它在位图的最后位置
  43. if (*lpszText == '.' || *lpszText == ':')
  44. pos = 39;
  45. //step2:提取该字符在对应位图中的空间位置
  46. rcRect.left = AA[pos].start;
  47. rcRect.right = AA[pos].end;
  48. rcRect.top = 0;
  49. rcRect.bottom = 15;
  50. //如果是冒号字符,则它要由两个dot字符堆叠而成;m_iAlphabet是三张位图的标志
  51. if(*lpszText == ':')
  52. {
  53. m_surfLetters.Draw(pSurface, nextx, iY, AA[pos].start, 0, AA[pos].end-AA[pos].start, m_iAlphabet == 1 ? 15 : m_iAlphabet == 2 ? 22 : 8);
  54. m_surfLetters.Draw(pSurface, nextx+1, iY, AA[pos].start, 4, AA[pos].end-AA[pos].start, m_iAlphabet == 1 ? 7 : m_iAlphabet == 2 ? 11 : 4);
  55. if(bFixed)
  56. nextx-=4;
  57. else
  58. nextx++;
  59. }
  60. else
  61. {
  62. m_surfLetters.Draw(pSurface, nextx, iY, AA[pos].start, 0, AA[pos].end-AA[pos].start, m_iAlphabet == 1 ? 15 : m_iAlphabet == 2 ? 22 : 8);
  63. }
  64. if(bFixed == true)
  65. nextx+=8;
  66. else
  67. nextx += (AA[pos].end - AA[pos].start) + 1;
  68. }
  69. else
  70. {
  71. //空格
  72. switch(m_iAlphabet)
  73. {
  74. case 1:
  75. nextx += 14;
  76. break;
  77. case 2:
  78. nextx += 10;
  79. break;
  80. case 3:
  81. nextx += 4;
  82. break;
  83. }
  84. }
  85. lpszText++;
  86. }
  87. return nextx;
  88. }
  89. //载入位图曲面
  90. void cTextWriter::Create(int iAlphabet)
  91. {
  92. m_iAlphabet = iAlphabet;
  93. switch(iAlphabet)
  94. {
  95. //大号位图
  96. case 1:
  97. m_surfLetters.Create(621, 15);
  98. m_surfLetters.LoadBitmap(GetMainApp()->m_hInst, IDB_DIGITAL_BIG);
  99. AA = (struct Alphabet*)  &DA[0];
  100. break;
  101. //小号位图
  102. case 3:
  103. m_surfLetters.Create(311, 8);
  104. m_surfLetters.LoadBitmap(GetMainApp()->m_hInst, IDB_DIGITAL_SMALL);
  105. AA = (struct Alphabet*)  &SDA[0];
  106. break;
  107. //黄色前景位图
  108. case 2:
  109. m_surfLetters.Create(500, 22);
  110. m_surfLetters.LoadBitmap(GetMainApp()->m_hInst, IDB_VERDANA);
  111. AA = (struct Alphabet*) &VA[0];
  112. break;
  113. }
  114. }
  115. //删除位图曲面
  116. void cTextWriter::Destroy()
  117. {
  118. m_surfLetters.Destroy();
  119. }