INBUTTON.CPP
上传用户:zhang8947
上传日期:2007-01-08
资源大小:1910k
文件大小:15k
源码类别:

多国语言处理

开发平台:

Visual C++

  1. // InButton.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "resource.h"
  5. #include "cspublic.h"
  6. #include "cskernel.h"
  7. #include "basicwin.h"
  8. #include "inputbar.h"
  9. #include "iniinput.h"
  10. #include "addordel.h"
  11. #include "systemse.h"
  12. #include "inputset.h"
  13. #include "inputse1.h"
  14. extern CInputInit OInputInit ; //输入环境初始化对象
  15. #ifdef _DEBUG
  16. #undef THIS_FILE
  17. static char BASED_CODE THIS_FILE[] = __FILE__;
  18. #endif
  19. /////////////////////////////////////////////////////////////////////////////
  20. // CInButton
  21. CInButton::CInButton( void )
  22. {
  23. }
  24. //初始化状态按钮
  25. CInButton::CInButton( CPoint pos ,
  26. UINT uUpBitmap , UINT uDownBitmap )
  27. {
  28. m_bCaptureStatus =0 ; //初始没有获得鼠标控制权
  29. m_bButtonType =0 ; //为状态按钮
  30. if( uUpBitmap == IDB_BITMAP2 ) //西文还是中文
  31. //得到是西文字符还是中文字符,缺省为西文字符
  32. m_bStatus =GetPrivateProfileInt( "输入方法" ,
  33. "西文字符还是中文字符" , 1 , INI_FILE_NAME ) ;
  34. else if( uUpBitmap == IDB_BITMAP4 ) //是否加空格
  35. //得到输入汉字后是否自动加空格,缺省为不加
  36. m_bStatus =GetPrivateProfileInt( "输入方法" ,
  37. "汉字后是否加空格" , 1 , INI_FILE_NAME ) ;
  38. else //全角还是半角
  39. //得到是半角字母还是全角字母,缺省为半角字母
  40. m_bStatus =GetPrivateProfileInt( "输入方法" ,
  41. "半角字母还是全角字母" , 1 , INI_FILE_NAME ) ;
  42. m_OPos =pos ;
  43. m_nHeight =12 ;
  44. m_nWidth =m_nHeight ;
  45. m_uUpBitmapID =uUpBitmap ;
  46. m_uDownBitmapID =uDownBitmap ;
  47. }
  48. //初始化动作按钮
  49. CInButton::CInButton( CPoint pos ,
  50. UINT uUpBitmap , UINT uDownBitmap ,
  51. BOOL bFlag )
  52. {
  53. m_bCaptureStatus =0 ; //初始没有获得鼠标控制权
  54. m_bStatus =1 ; //初始为没有按下按钮
  55. m_bButtonType =bFlag ;
  56. m_OPos =pos ;
  57. m_nHeight =12 ;
  58. m_nWidth =m_nHeight ;
  59. m_uUpBitmapID =uUpBitmap ;
  60. m_uDownBitmapID =uDownBitmap ;
  61. }
  62. //初始化菜单1按钮
  63. CInButton::CInButton( CPoint pos ,  //位置
  64. LPCSTR lpcsString , //显示串
  65. UINT uMenuID )
  66. {          
  67. m_bCaptureStatus =0 ; //初始没有获得鼠标控制权
  68. m_bStatus =1 ; //初始为没有按下按钮
  69. m_bButtonType =1 ; //为菜单1按钮
  70. m_OPos =pos ; //位置
  71. m_nHeight =12 ; //高度               
  72. m_OMenuString =lpcsString ; //按钮上显示的串
  73. m_nWidth =m_OMenuString.GetLength()*(m_nHeight-2)/2 ; //宽度
  74. m_uMenuID =uMenuID ;
  75. }
  76. //初始化菜单2按钮
  77. CInButton::CInButton( CPoint pos ,  //位置
  78. LPCSTR lpcsString , //显示串
  79. HMENU hMenu )
  80. {
  81. m_bCaptureStatus =0 ; //初始没有获得鼠标控制权
  82. m_bStatus =1 ; //初始为没有按下按钮
  83. m_bButtonType =2 ; //为菜单2按钮
  84. m_OPos =pos ; //位置
  85. m_nHeight =12 ; //高度
  86. //按钮上显示的串
  87. m_OMenuString =lpcsString ;
  88. m_nWidth =m_OMenuString.GetLength()*(m_nHeight-2)/2 ; //宽度
  89. m_hMenu =hMenu ;
  90. }
  91. CInButton::~CInButton()
  92. {
  93. }
  94. const CInButton& CInButton::operator=( const CInButton &button )
  95. {
  96. m_bButtonType =button.m_bButtonType ; //按钮类型
  97. m_bCaptureStatus =button.m_bCaptureStatus ; //鼠标控制权
  98. //位置与宽度,高度
  99. m_OPos =button.m_OPos ;
  100. m_nWidth =button.m_nWidth ;
  101. m_nHeight =button.m_nHeight ;
  102. //按钮状态
  103. m_bStatus =button.m_bStatus ;
  104. switch( m_bButtonType )
  105. {
  106. case 0: //是状态按钮
  107. case 3: //是左翻页按钮
  108. case 4: //是右翻页按钮
  109. m_uUpBitmapID =button.m_uUpBitmapID ;
  110. m_uDownBitmapID =button.m_uDownBitmapID ;
  111. break ;
  112. case 1: //是菜单1
  113. m_OMenuString =button.m_OMenuString ; //按钮上要显示的串
  114. m_uMenuID =button.m_uMenuID ;
  115. //装入菜单资源
  116. // m_OMenu.LoadMenu( m_uMenuID ) ;
  117. break ;
  118. case 2: //是菜单2
  119. m_OMenuString =button.m_OMenuString ; //按钮上要显示的串
  120. m_hMenu =button.m_hMenu ;
  121. break ;
  122. default:
  123. AfxMessageBox( "The type of button is error" ) ;
  124. }
  125. return *this ;
  126. }
  127. BEGIN_MESSAGE_MAP(CInButton, CBasicWin)
  128. //{{AFX_MSG_MAP(CInButton)
  129. ON_WM_LBUTTONDOWN()
  130. ON_WM_PAINT()
  131. ON_WM_LBUTTONUP()
  132. ON_WM_MOUSEMOVE()
  133. ON_WM_LBUTTONDBLCLK()
  134. ON_WM_MENUCHAR()
  135. ON_WM_MENUSELECT()
  136. ON_COMMAND(ID_INPUT_SETUP, OnInputSetup)
  137. ON_COMMAND(ID_INPUT_GB, OnInputGb)
  138. ON_COMMAND(ID_INPUT_BIG5, OnInputBig5)
  139. ON_COMMAND(ID_INPUT_HZ, OnInputHz)
  140. ON_COMMAND(ID_INPUT_SHIFTJIS, OnInputShiftjis)
  141. ON_COMMAND(ID_INPUT_EUCJIS, OnInputEucjis)
  142. ON_COMMAND(ID_INPUT_KSC5601, OnInputKsc5601)
  143. ON_WM_RBUTTONDOWN()
  144. ON_WM_RBUTTONDBLCLK()
  145. //}}AFX_MSG_MAP
  146. END_MESSAGE_MAP()
  147. /////////////////////////////////////////////////////////////////////////////
  148. // CInButton message handlers
  149. //创建按钮窗口
  150. BOOL CInButton::CreateInButton(
  151.  LPCSTR lpszWindowName , //窗口名
  152.  CWnd *pParentWnd , //父窗口
  153.  UINT nID )  //ID
  154. {
  155. RECT rect ; //窗口大小
  156. rect.left =m_OPos.x ;
  157. rect.top =m_OPos.y ;
  158. rect.right =m_OPos.x + m_nWidth ;
  159. rect.bottom =m_OPos.y + m_nHeight ;
  160. //创建该窗口
  161. VERIFY( Create( NULL , lpszWindowName , WS_CHILD , rect , 
  162. pParentWnd , nID ) ) ;
  163. return TRUE ;
  164. }
  165. //得到当前按钮状态
  166. BOOL CInButton::GetStatus( void )
  167. {
  168. return m_bStatus ;
  169. }
  170. //改变按钮的显示状态
  171. void CInButton::ChangeButtonStatus( void )
  172. {
  173. //切换按钮状态
  174. if( m_bStatus ) //按钮没有按下
  175. m_bStatus =0 ;
  176. else
  177. m_bStatus =1 ;
  178. InvalidateRect( NULL , FALSE ) ;
  179. }
  180. void CInButton::OnLButtonDown(UINT nFlags, CPoint point)
  181. {
  182. CBasicWin::OnLButtonDown(nFlags, point);
  183. //切换按钮状态
  184. ChangeButtonStatus() ;
  185. switch( m_bButtonType )
  186. {
  187. case 0: //是状态按钮
  188. //切换状态按钮的状态
  189. if( m_uUpBitmapID == IDB_BITMAP2 ) //西文还是中文
  190. SetInputStatus123( 1 ) ;
  191. else if( m_uUpBitmapID == IDB_BITMAP4 ) //是否加空格
  192. SetInputStatus123( 2 ) ;
  193. else //全角还是半角
  194. SetInputStatus123( 3 ) ;
  195. break ;
  196. case 1:
  197. case 2: //是菜单按钮
  198. //显示菜单
  199. if( !m_bStatus ) //已按下按钮
  200. {
  201. CPoint point1( 0 , m_nHeight ) ;
  202. ClientToScreen( &point1 ) ;   //转换为屏幕坐标
  203. CMenu *pMenu ;
  204. if( m_bButtonType == 1 ) //是菜单1
  205. {
  206. m_OMenu.DestroyMenu() ; //破坏菜单
  207. switch( GetOutputCode() )
  208. {
  209. case 0:
  210. if( !m_OMenu.LoadMenu( IDR_MENU2 ) ) //装入菜单资源
  211. return ;
  212. break ; 
  213. case 1:
  214. if( !m_OMenu.LoadMenu( IDR_MENU2_1 ) ) //装入菜单资源
  215. return ;
  216. break ; 
  217. default:
  218. if( !m_OMenu.LoadMenu( IDR_MENU2_2 ) ) //装入菜单资源
  219. return ;
  220. }
  221. pMenu =m_OMenu.GetSubMenu( 0 ) ; //得到菜单
  222. int n =GetInputCode() ; //得到当前输入内码
  223. //将该菜单项打上标记,并且无效
  224. pMenu->CheckMenuItem( n ,
  225. MF_BYPOSITION|MF_CHECKED ) ;
  226. pMenu->EnableMenuItem( n ,
  227. MF_BYPOSITION|MF_DISABLED ) ;
  228. if( GetInputMethod() ) //当前输入法不是内码输入法
  229. {
  230. //SHIFT-JIS,EUC-JIS,KSC5601输入内码无效
  231. pMenu->EnableMenuItem( 3 ,
  232. MF_BYPOSITION|MF_GRAYED ) ;
  233. pMenu->EnableMenuItem( 4 ,
  234. MF_BYPOSITION|MF_GRAYED ) ;
  235. pMenu->EnableMenuItem( 5 ,
  236. MF_BYPOSITION|MF_GRAYED ) ;
  237. }
  238. else
  239. {
  240. pMenu->EnableMenuItem( 3 ,
  241. MF_BYPOSITION ) ;
  242. pMenu->EnableMenuItem( 4 ,
  243. MF_BYPOSITION ) ;
  244. pMenu->EnableMenuItem( 5 ,
  245. MF_BYPOSITION ) ;
  246. }
  247. }
  248. else //是菜单2
  249. pMenu =CMenu::FromHandle( m_hMenu ) ;
  250.                          
  251.         RECT rect ;
  252.         GetClientRect( &rect ) ;
  253.         ClientToScreen( &rect ) ;
  254. SetMenuCharFlag( 0 ) ; //标记不是按键消失鼠标的
  255. pMenu->TrackPopupMenu( 
  256. TPM_LEFTBUTTON|TPM_LEFTALIGN,
  257.   point1.x , point1.y , this , &rect ) ;  //显示菜单
  258. }
  259. else
  260. ActiveOldWin() ; //激活以前的窗口
  261. break ;
  262. case 3:
  263. case 4: //是翻页按钮
  264. m_bCaptureStatus =1 ;
  265. SetCapture() ; //得到鼠标控制权
  266. break ;
  267. }
  268. // CBasicWin::OnLButtonDown(nFlags, point);
  269. }
  270. void CInButton::OnLButtonUp(UINT nFlags, CPoint point)
  271. {
  272. switch( m_bButtonType )
  273. {
  274. case 3:
  275. case 4: //是翻页按钮
  276. if( !m_bStatus ) //原来是下去的
  277. {
  278. //进行翻页
  279. CInputBar *pInputBar =(CInputBar*)GetParent() ;
  280. if( m_bButtonType == 3 ) //是向左按钮
  281. pInputBar->SendMessage( WM_USER_SCROLL_PAGE,4,0 ) ;
  282. else //是向右按钮
  283. pInputBar->SendMessage( WM_USER_SCROLL_PAGE,3,0 ) ;
  284. m_bStatus =1 ; //让按钮起来
  285. InvalidateRect( NULL , FALSE ) ; //重画按钮
  286. }
  287. m_bCaptureStatus =0 ;
  288. ReleaseCapture() ; //释放鼠标控制权
  289. break ;
  290. }
  291. CBasicWin::OnLButtonUp(nFlags, point);
  292. }
  293. void CInButton::OnMouseMove(UINT nFlags, CPoint point)
  294. {
  295. SetCursor( LoadCursor( NULL , IDC_ARROW ) ) ;
  296. if( !m_bCaptureStatus ) //没有鼠标控制权,不做反应
  297. {
  298. CBasicWin::OnMouseMove(nFlags, point);
  299. return ;
  300. }
  301. switch( m_bButtonType )
  302. {
  303. case 3:
  304. case 4: //是翻页按钮
  305. CRect rect ; //用户窗口区
  306. GetClientRect( &rect ) ;
  307. if( !rect.PtInRect( point ) ) //移出了该窗口
  308. {
  309. if( !m_bStatus ) //原来是下去的
  310. {
  311. m_bStatus =1 ; //让按钮进来
  312. InvalidateRect( NULL , FALSE ) ; //重画按钮
  313. }
  314. }
  315. else //在窗口内
  316. {
  317. if( m_bStatus ) //原来是起来的
  318. {
  319. m_bStatus =0 ; //让按钮下去
  320. InvalidateRect( NULL , FALSE ) ; //重画按钮
  321. }
  322. }
  323. break ;
  324. }
  325. CBasicWin::OnMouseMove(nFlags, point);
  326. }
  327. void CInButton::OnPaint()
  328. {
  329. CPaintDC dc(this); // device context for painting
  330. //画上按钮的边框
  331. RECT rect ={ 0 , 0 , m_nWidth-1 , m_nHeight-1 } ;
  332. if( m_bStatus ) //按钮没有按下
  333. DrawOneLineBox( dc.m_hDC , rect , 1 ,
  334. RGB(255,255,255),RGB(128,128,128),RGB(192,192,192) ) ;
  335. else
  336. DrawOneLineBox( dc.m_hDC , rect , 0 ,
  337. RGB(255,255,255),RGB(128,128,128),RGB(192,192,192) ) ;
  338. //画上按钮中的内容
  339. if( m_bButtonType==1 || m_bButtonType==2 ) //是菜单按钮
  340. {
  341. //创建所需要的字体
  342. CFont font ;
  343. font.CreateFont( m_nHeight-2 , //高度
  344. 0 , 0 , 0 ,  //宽度等
  345. FW_NORMAL ,
  346. FALSE , FALSE , 0 ,
  347. ANSI_CHARSET ,
  348. OUT_DEFAULT_PRECIS ,
  349. CLIP_DEFAULT_PRECIS ,
  350. DEFAULT_QUALITY  ,
  351.   DEFAULT_PITCH , NULL ) ;
  352. CFont *pOldFont =(CFont*)dc.SelectObject( &font ) ;  
  353. dc.SetBkMode( TRANSPARENT ) ;
  354. TextOutString( dc.GetSafeHdc() , 1 , 1 , m_OMenuString , 
  355. m_OMenuString.GetLength() ) ;
  356. dc.SelectObject( pOldFont ) ;
  357. }
  358. else //是状态按钮
  359. {
  360. CBitmap bitmap ; //按钮上的位置
  361. if( m_bStatus ) //按钮没有按下
  362. bitmap.LoadBitmap( m_uUpBitmapID ) ;
  363. else
  364. bitmap.LoadBitmap( m_uDownBitmapID ) ;
  365. CDC memDC ;
  366. memDC.CreateCompatibleDC( (CDC*)&dc ) ; //内存显示设备
  367. //选入位图
  368. CBitmap *pOldBitmap =(CBitmap*)memDC.SelectObject( &bitmap ) ;
  369. dc.BitBlt( 1 , 1 , m_nWidth-2 , m_nHeight-2 , 
  370. &memDC , 0 , 0 , SRCCOPY ) ;
  371. //选出位图
  372. memDC.SelectObject( pOldBitmap ) ;
  373. }
  374. // Do not call CBasicWin::OnPaint() for painting messages
  375. }
  376. //改变菜单2按钮的显示内容
  377. void CInButton::ChangeMenuButton( int nMenu )
  378. {
  379. char sBuff[20] ;
  380. CMenu *pMenu =CMenu::FromHandle( m_hMenu ) ;
  381. m_bStatus =1 ;
  382. pMenu->GetMenuString( nMenu , sBuff , 20 , MF_BYPOSITION ) ;
  383. m_OMenuString =sBuff ;
  384. m_nWidth =_fstrlen( m_OMenuString )*(m_nHeight-2)/2 ; //宽度
  385. //改变INI文件,同时改变菜单项显示状态
  386. OInputInit.ChangeMenuStatus( 
  387. ::GetMenuItemCount( m_hMenu )-1-nMenu ) ;
  388. InvalidateRect( NULL ) ;
  389. }
  390. BOOL CInButton::OnCommand( WPARAM wParam, LPARAM lParam )
  391. {
  392. if( m_bButtonType == 2 ) //是菜单2
  393. ChangeMenuButton( ::GetMenuItemCount( m_hMenu )-1-
  394. (wParam-100) ) ;
  395. return CBasicWin::OnCommand( wParam , lParam ) ;
  396. }
  397. void CInButton::OnLButtonDblClk(UINT nFlags, CPoint point)
  398. {
  399. // TODO: Add your message handler code here and/or call default
  400. if( m_bStatus ) //菜单没有显示
  401. OnLButtonDown( nFlags , point ) ;
  402. CBasicWin::OnLButtonDblClk(nFlags, point);
  403. }
  404. LRESULT CInButton::OnMenuChar(UINT nChar, UINT nFlags, CMenu* pMenu)
  405. {
  406. // TODO: Add your message handler code here and/or call default
  407. SetMenuCharFlag( 0 ) ; //标记不是按键消失鼠标的
  408. return CBasicWin::OnMenuChar(nChar, nFlags, pMenu);
  409. }
  410. void CInButton::OnMenuSelect(UINT nItemID, UINT nFlags, 
  411. HMENU hSysMenu)
  412. {
  413. static BOOL bFlag=0 ;
  414. if( nItemID==ID_INPUT_SETUP )
  415. bFlag =1 ;
  416. CBasicWin::OnMenuSelect(nItemID, nFlags, hSysMenu);
  417. if( nFlags == (UINT)0xffff && !hSysMenu ) //关闭菜单
  418. {
  419. CRect rect ; //用户窗口区
  420. GetClientRect( &rect ) ;
  421. POINT point ;
  422. GetCursorPos( &point ) ; //得到当前鼠标点
  423. ScreenToClient( &point ) ; //转成用户坐标
  424. if( GetMenuCharFlag() || //是按键消失鼠标的
  425. !rect.PtInRect( point ) ) //点不在该窗口内
  426. {
  427. m_bStatus =1 ;
  428. InvalidateRect( NULL ) ;
  429. }
  430. if(!bFlag)
  431. ActiveOldWin() ; //激活以前的窗口
  432. else
  433. bFlag =0 ;
  434. }
  435. }
  436. void CInButton::OnInputSetup()
  437. {
  438. // TODO: Add your command handler code here
  439. char sTitle[50] ;
  440. CInputSet *pInputSetPage ; //增、删输入法
  441. CInputSe1 *pInputSe1Page ; //中文输入环境设置页
  442. switch( GetOutputCode() )
  443. {
  444. case 0:
  445. strcpy( sTitle , "中文大观输入法设置" ) ;
  446. pInputSetPage =new CInputSet( IDD_DIALOG5 ) ;
  447. pInputSe1Page =new CInputSe1( IDD_DIALOG6 ) ;
  448. break ; 
  449. case 1:
  450. strcpy( sTitle , "いゅ