querykey_win32.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:5k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * $Id: querykey_win32.c 615 2006-01-26 16:57:51Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #include "../../common/common.h"
  24. #include "../win.h"
  25. #include "querykey_win32.h"
  26. #include "widcommaudio.h"
  27. #if defined(TARGET_WINCE) || defined(TARGET_WIN32)
  28. #ifndef STRICT
  29. #define STRICT
  30. #endif
  31. #include <windows.h>
  32. #define TIMER_CLOSE 507
  33. typedef struct querykey
  34. {
  35. win Win;
  36. WPARAM VCode;
  37. WPARAM VCode2;
  38. int Key;
  39. int Key2;
  40. bool_t Keep;
  41. } querykey;
  42. static bool_t DialogProc(querykey* p,int Msg, uint32_t wParam, uint32_t lParam, int* Result)
  43. {
  44. switch (Msg)
  45. {
  46. case WM_SYSKEYDOWN:
  47. case WM_KEYDOWN:
  48. if (wParam != VK_CONTROL && wParam != VK_MENU && 
  49. wParam != VK_LWIN && wParam != VK_RWIN && wParam != VK_SHIFT)
  50. {
  51. int Key;
  52. if ((wParam == VK_F1 || wParam == VK_F2) &&
  53. QueryPlatform(PLATFORM_TYPENO)==TYPE_SMARTPHONE)
  54. {
  55. // can't loose menu buttons
  56. WinAllKeys(0);
  57. keybd_event((BYTE)wParam,1,0,0);
  58. break; 
  59. }
  60. Key = WinKeyState(wParam);
  61. if (!p->VCode)
  62. {
  63. p->VCode = wParam;
  64. p->Key = Key;
  65. }
  66. else
  67. if (!p->VCode2)
  68. {
  69. p->VCode2 = wParam;
  70. p->Key2 = Key;
  71. }
  72. }
  73. break;
  74. case WM_SYSKEYUP:
  75. case WM_KEYUP:
  76. if (p->VCode == wParam)
  77. {
  78. p->VCode = 0;
  79. if (!p->VCode2)
  80. SetTimer(p->Win.Wnd,TIMER_CLOSE,100,NULL);
  81. }
  82. if (p->VCode2 == wParam)
  83. {
  84. p->VCode2 = 0;
  85. if (!p->VCode)
  86. PostMessage(p->Win.Wnd,WM_CLOSE,0,0);
  87. }
  88. break;
  89. case WM_KILLFOCUS:
  90. WinAllKeys(0);
  91. break;
  92. case WM_SETFOCUS:
  93. WinAllKeys(1);
  94. WidcommAudio_Wnd(p->Win.WndDialog);
  95. break;
  96. }
  97. return 0;
  98. }
  99. static int Command(querykey* p,int Cmd)
  100. {
  101. switch (Cmd)
  102. {
  103. case PLATFORM_CANCEL:
  104. p->Key = p->Key2 = 0;
  105. WinClose(&p->Win);
  106. return ERR_NONE;
  107. case QUERYKEY_KEEP:
  108. p->Keep = !p->Keep;
  109. WinMenuCheck(&p->Win,1,QUERYKEY_KEEP,p->Keep);
  110. return ERR_NONE;
  111. }
  112. return ERR_INVALID_PARAM;
  113. }
  114. static bool_t Proc(querykey* p,int Msg, uint32_t wParam, uint32_t lParam, int* Result)
  115. {
  116. switch (Msg)
  117. {
  118. case WM_ACTIVATE:
  119. if (LOWORD(wParam)==WA_INACTIVE) 
  120. WinClose(&p->Win);
  121. break;
  122. case WM_CLOSE:
  123. KillTimer(p->Win.Wnd,TIMER_CLOSE);
  124. if (p->Keep)
  125. {
  126. if (p->Key) p->Key |= HOTKEY_KEEP;
  127. if (p->Key2) p->Key2 |= HOTKEY_KEEP;
  128. }
  129. break;
  130. case WM_TIMER:
  131. if (wParam == TIMER_CLOSE)
  132. WinClose(&p->Win);
  133. break;
  134. }
  135. return 0;
  136. }
  137. static int Get(querykey* p,int No,void* Data,int Size)
  138. {
  139. int Result = ERR_INVALID_PARAM;
  140. switch (No)
  141. {
  142. case QUERYKEY_KEY: GETVALUE(p->Key,int); break;
  143. case QUERYKEY_KEY2: GETVALUE(p->Key2,int); break;
  144. }
  145. return Result;
  146. }
  147. static menudef MenuDef[] =
  148. {
  149. { 0, PLATFORM_ID, PLATFORM_CANCEL },
  150. { 0, QUERYKEY_ID, QUERYKEY_OPTIONS },
  151. { 1, QUERYKEY_ID, QUERYKEY_KEEP },
  152. MENUDEF_END
  153. };
  154. static int Init(querykey* p)
  155. {
  156. winunit y;
  157. p->Keep = 0;
  158. p->VCode = 0;
  159. p->VCode2 = 0;
  160. p->Key = 0;
  161. p->Key2 = 0;
  162. y = (p->Win.Height-12) >> 1;
  163. WinLabel(&p->Win,&y, -1, -1,LangStr(QUERYKEY_ID,QUERYKEY_MSG),12,LABEL_CENTER,NULL);
  164. return ERR_NONE;
  165. }
  166. WINCREATE(QueryKey)
  167. static int Create(querykey* p)
  168. {
  169. QueryKeyCreate(&p->Win);
  170. p->Win.WinWidth = 200;
  171. p->Win.WinHeight = 200;
  172. p->Win.MenuDef = MenuDef;
  173. p->Win.Flags |= WIN_DIALOG;
  174. p->Win.Proc = Proc;
  175. p->Win.DialogProc = DialogProc;
  176. p->Win.Command = (wincommand)Command;
  177. p->Win.Init = Init;
  178. p->Win.Node.Get = Get;
  179. return ERR_NONE;
  180. }
  181. static const nodedef QueryKey =
  182. {
  183. sizeof(querykey),
  184. QUERYKEY_ID,
  185. WIN_CLASS,
  186. PRI_DEFAULT,
  187. (nodecreate)Create,
  188. };
  189. void QueryKey_Init()
  190. {
  191. NodeRegisterClass(&QueryKey);
  192. }
  193. void QueryKey_Done()
  194. {
  195. NodeUnRegisterClass(QUERYKEY_ID);
  196. }
  197. #endif