CEditBar.cpp
上传用户:garry_shen
上传日期:2015-04-15
资源大小:45647k
文件大小:6k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "CEditBar.h"
  3. #include "Common.h"
  4. extern void InputInitial(long x,long y,char *buffer,char Mode);
  5. extern void InputFinish(void);
  6. extern LRESULT HandleCompPaint(void);
  7. extern LRESULT HandleCandPaint(void);
  8. int CEditBar::Initiate(HWND hwndParent,LPTSTR lpstrBmp,int iCaretWidth,int iCaretHeight,int iMaxEditLen,LPRECT lprcRange,LPTSTR lpstr,BOOL bStar)
  9. {
  10. hwnd=hwndParent;
  11. sizeEdit.cx=0;sizeEdit.cy=0;
  12. rcEditPos.left=ptCaretPos.x=lprcRange->left;
  13. rcEditPos.top=ptCaretPos.y=lprcRange->top;
  14. rcEditPos.right=lprcRange->right;
  15. rcEditPos.bottom=lprcRange->bottom;
  16. CEditBar::iCaretWidth=iCaretWidth;
  17. CEditBar::iCaretHeight=iCaretHeight;
  18. bEnable=FALSE;
  19. bPassword=bStar;
  20. if(!(lpstrPassword=new TCHAR[iMaxEditLen+1]))
  21. return ERR_SYSTEM;
  22. for(int i=0;i<iMaxEditLen;i++)
  23. lpstrPassword[i]='*';
  24. if(!(lpstrEdit=new TCHAR[iMaxEditLen+1]))
  25. return ERR_SYSTEM;
  26. else
  27. iEditMaxLen=iMaxEditLen;
  28. if(lpstr)
  29. {
  30. if(iEditMaxLen<(iEditLen=lstrlen(lpstr)))
  31. iEditLen=iEditMaxLen;
  32. iEditPos=iEditLen;
  33. if(NULL==(lstrcpyn(lpstrEdit,lpstr,iEditLen+1)))
  34. {
  35. iEditLen=0;
  36. iEditPos=0;
  37. }
  38. }
  39. else
  40. {
  41. iEditLen=0;
  42. iEditPos=0;
  43. }
  44. cChina=0;
  45. SetNULL();
  46. if(lpstrBmp)
  47. {
  48. if(!(hBmp=(HBITMAP)LoadImage(GetModuleHandle(NULL),lpstrBmp,IMAGE_BITMAP,0,0,LR_LOADTRANSPARENT)))
  49. hBmp=(HBITMAP)LoadImage(NULL,lpstrBmp,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_LOADTRANSPARENT);
  50. }
  51. else
  52. hBmp=NULL;
  53. return ERR_NO;
  54. }
  55. void CEditBar::Release()
  56. {
  57. Disable();
  58. if(hBmp)
  59. {
  60. DeleteObject(hBmp);
  61. hBmp=NULL;
  62. }
  63. if(lpstrEdit)
  64. {
  65. delete[] lpstrEdit;
  66. lpstrEdit=NULL;
  67. }
  68. if(lpstrPassword)
  69. {
  70. delete[] lpstrPassword;
  71. lpstrPassword=NULL;
  72. }
  73. }
  74. void CEditBar::Enable()
  75. {
  76.   InputInitial(rcEditPos.left,rcEditPos.top,lpstrEdit,0);
  77. bEnable=TRUE;
  78. }
  79. void CEditBar::Disable()
  80. {
  81. if(bEnable)
  82. {
  83.     InputFinish();
  84. bEnable=FALSE;
  85. }
  86. }
  87. void CEditBar::PutChar(WPARAM wParam,int iRepeat)
  88. {
  89. if(!bEnable)
  90. return;
  91. for(int i=0;i<iRepeat;i++){
  92. switch(wParam){
  93. case 'b':
  94. DeleteBack();
  95. break;
  96. case 'x1B':
  97. iEditLen=0;
  98. iEditPos=0;
  99. SetNULL();
  100. break;
  101. case 't':
  102. case 'n':
  103. case 'r':
  104. break;
  105. default:
  106. SetChar((TCHAR)wParam);
  107. break;
  108. }
  109. }
  110. }
  111. void CEditBar::ControlEdit(WPARAM wParam)
  112. {
  113. if(!bEnable)
  114. return;
  115. switch (wParam)
  116. {
  117. case VK_HOME:
  118. iEditPos=0;
  119. break;
  120. case VK_END:
  121. iEditPos=iEditLen;
  122. break;
  123. /* case VK_PRIOR:
  124. yCaret=0;
  125. break;
  126. case VK_NEXT:
  127. yCaret=cyBuffer-1;
  128. break;
  129. */ case VK_LEFT:
  130. GetLeft();
  131. break;
  132. case VK_RIGHT:
  133. GetRight();
  134. break;
  135. /* case VK_UP:
  136. yCaret=max(yCaret-1,0);
  137. break;
  138. case VK_DOWN:
  139. yCaret=min(yCaret+1,cyBuffer-1);
  140. break;
  141. */ case VK_DELETE:
  142. DeleteChar();
  143. break;
  144. }
  145. }
  146. inline int CEditBar::SetCaretPos()
  147. {
  148. if(TRUE==::SetCaretPos(ptCaretPos.x+sizeEdit.cx,ptCaretPos.y))
  149. return ERR_DONE;
  150. return ERR_NO;
  151. }
  152. int CEditBar::ShowEdit(IDirectDrawSurface *pddsBack,IDirectDrawSurface *pdds,LPRECT lprcCaret,HFONT font,COLORREF colorEnable,COLORREF colorDisable,BOOL bShow)
  153. {
  154. HDC hdc;
  155. HRESULT hr=pddsBack->GetDC(&hdc);
  156. if(FAILED(hr))
  157. {
  158. if(DDERR_SURFACELOST==hr)
  159. {
  160. pddsBack->Restore();
  161. pddsBack->GetDC(&hdc);
  162. }
  163. else
  164. return ERR_SYSTEM;
  165. }
  166. if(font)
  167. fontOld=(HFONT)SelectObject(hdc,font);
  168. if(!GetTextExtentPoint32(hdc,lpstrEdit,iEditPos,&sizeEdit))
  169. {
  170. sizeEdit.cx=0;
  171. sizeEdit.cy=0;
  172. }
  173. if(bEnable){
  174. SetTextColor(hdc,colorEnable);
  175. }else{
  176. SetTextColor(hdc,colorDisable);
  177. }
  178. SetBkMode(hdc,TRANSPARENT);
  179. if(bPassword)
  180. DrawText(hdc,lpstrPassword,iEditLen,&rcEditPos,DT_NOCLIP | DT_EDITCONTROL | DT_EXPANDTABS | DT_NOPREFIX);
  181. else
  182. DrawText(hdc,lpstrEdit,-1,&rcEditPos,DT_NOCLIP | DT_EDITCONTROL | DT_EXPANDTABS | DT_NOPREFIX);
  183. if(fontOld)
  184. SelectObject(hdc,fontOld);
  185. hr=pddsBack->ReleaseDC(hdc);
  186. if(DDERR_SURFACELOST==hr)
  187. {
  188. pddsBack->Restore();
  189. pddsBack->ReleaseDC(hdc);
  190. }
  191. if(bEnable && bShow)
  192. {
  193. if(FAILED(hr=pddsBack->BltFast(ptCaretPos.x+sizeEdit.cx,ptCaretPos.y,pdds,lprcCaret,DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY)))
  194. {
  195. if(DDERR_SURFACELOST==hr)
  196. {
  197. pddsBack->Restore();
  198. pddsBack->BltFast(ptCaretPos.x+sizeEdit.cx,ptCaretPos.y,pdds,lprcCaret,DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY);
  199. }
  200. else
  201. return hr;
  202. }
  203. }
  204.   if(bEnable)
  205.   {
  206.     HandleCompPaint();
  207.     HandleCandPaint();
  208.   }
  209. return ERR_NO;
  210. }
  211. void CEditBar::Clear()
  212. {
  213. iEditLen=0;
  214. iEditPos=0;
  215. SetNULL();
  216. }
  217. inline void CEditBar::SetChar(TCHAR Char)
  218. {
  219. int i;
  220. if(iEditLen>=iEditMaxLen)
  221. {
  222. cChina=0;
  223. return;
  224. }
  225. if(0!=cChina)
  226. {
  227. if(iEditLen>(iEditMaxLen-2))
  228. {
  229. cChina=0;
  230. return;
  231. }
  232. for(i=iEditLen;i>=iEditPos;i--)
  233. lpstrEdit[i+2]=lpstrEdit[i];
  234. lpstrEdit[iEditPos++]=cChina;
  235. lpstrEdit[iEditPos++]=Char;
  236. iEditLen+=2;
  237. cChina=0;
  238. }
  239. else
  240. {
  241. if(Char&0x80)
  242. {
  243. cChina=Char;
  244. return;
  245. }
  246. for(i=iEditLen;i>=iEditPos;i--)
  247. lpstrEdit[i+1]=lpstrEdit[i];
  248. lpstrEdit[iEditPos++]=Char;
  249. iEditLen++;
  250. }
  251. }
  252. inline void CEditBar::DeleteChar()
  253. {
  254. if(iEditPos>=iEditLen)
  255. return;
  256. int offset=1;
  257. if((lpstrEdit[iEditPos]&0x80)&&(iEditLen>=2))
  258. offset=2;
  259. for(int i=iEditPos;i<iEditLen;i++)
  260. lpstrEdit[i]=lpstrEdit[i+offset];
  261. iEditLen-=offset;
  262. }
  263. inline void CEditBar::DeleteBack()
  264. {
  265. int left;
  266. if(0==iEditPos)
  267. return;
  268. for(int i=0;i<iEditPos;i++)
  269. {
  270. left=i;
  271. if(lpstrEdit[i]&0x80)
  272. i++;
  273. }
  274. int offset=1;
  275. if((lpstrEdit[left]&0x80)&&(iEditLen>=2))
  276. offset=2;
  277. for(i=left;i<iEditLen;i++)
  278. lpstrEdit[i]=lpstrEdit[i+offset];
  279. iEditLen-=offset;
  280. iEditPos-=offset;
  281. }
  282. inline void CEditBar::SetNULL()
  283. {
  284. lpstrEdit[iEditLen]=NULL;
  285. }
  286. inline void CEditBar::GetLeft()
  287. {
  288. int left;
  289. if(0==iEditPos)
  290. return;
  291. for(int i=0;i<iEditPos;i++)
  292. {
  293. left=i;
  294. if(lpstrEdit[i]&0x80)
  295. i++;
  296. }
  297. iEditPos=left;
  298. }
  299. inline void CEditBar::GetRight()
  300. {
  301. if(iEditPos>=iEditLen)
  302. return;
  303. if(iEditPos<=(iEditLen-2))
  304. {
  305. if(lpstrEdit[iEditPos]&0x80)
  306. {
  307. iEditPos+=2;
  308. return;
  309. }
  310. }
  311. iEditPos+=1;
  312. }