dll.cpp
上传用户:hyb6888
上传日期:2016-01-24
资源大小:5186k
文件大小:9k
源码类别:

输入法编程

开发平台:

Visual C++

  1. // dll.cpp : Defines the initialization routines for the DLL.
  2. //
  3. #include "stdafx.h"
  4. #include "dll.h"
  5. #include "windows.h"
  6. #include "string.h"
  7. #include "stdio.h"
  8. #include "CMyWnd.h"
  9. HINSTANCE savehInstDLL;
  10. #define MYLIBAPI extern "C" __declspec(dllexport)
  11. int MyMoveWin(CMyWnd *cmywnd,HWND hWnd ,long x,long y);
  12. MYLIBAPI int  SetShowString(long *fcmywnd,char*MindleStr,char*InputStr);
  13. #ifdef _DEBUG
  14. #define new DEBUG_NEW
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18. //
  19. // Note!
  20. //
  21. // If this DLL is dynamically linked against the MFC
  22. // DLLs, any functions exported from this DLL which
  23. // call into MFC must have the AFX_MANAGE_STATE macro
  24. // added at the very beginning of the function.
  25. //
  26. // For example:
  27. //
  28. // extern "C" BOOL PASCAL EXPORT ExportedFunction()
  29. // {
  30. // AFX_MANAGE_STATE(AfxGetStaticModuleState());
  31. // // normal function body here
  32. // }
  33. //
  34. // It is very important that this macro appear in each
  35. // function, prior to any calls into MFC.  This means that
  36. // it must appear as the first statement within the 
  37. // function, even before any object variable declarations
  38. // as their constructors may generate calls into the MFC
  39. // DLL.
  40. //
  41. // Please see MFC Technical Notes 33 and 58 for additional
  42. // details.
  43. //
  44. /////////////////////////////////////////////////////////////////////////////
  45. // CDllApp
  46. BEGIN_MESSAGE_MAP(CDllApp, CWinApp)
  47. //{{AFX_MSG_MAP(CDllApp)
  48. // NOTE - the ClassWizard will add and remove mapping macros here.
  49. //    DO NOT EDIT what you see in these blocks of generated code!
  50. //}}AFX_MSG_MAP
  51. END_MESSAGE_MAP()
  52. /////////////////////////////////////////////////////////////////////////////
  53. // CDllApp construction
  54. CDllApp theApp;
  55. /////////////////////////////////////////////////////////////////////////////
  56. // The one and only CDllApp object
  57. CDllApp::CDllApp()
  58. {
  59. // TODO: add construction code here,
  60. // Place all significant initialization in InitInstance
  61. }
  62. ///////////////////////////////////////////////////////
  63. //在VB中可通过传值得到
  64. MYLIBAPI int  CloseWin(long *fcmywnd)
  65. {
  66. CMyWnd *cmywnd;
  67. if(*fcmywnd==0)
  68. {
  69. //MessageBox(0,"CloseWin致命错误fcmywnd所指对象已释放",0,0);
  70. return 0;
  71. }
  72. cmywnd=(CMyWnd *)*fcmywnd;
  73. delete(cmywnd);
  74. cmywnd=0;
  75. //MessageBox(0,"CloseWin",0,0);
  76. //如果子类窗口不自行消毁自己的窗口,
  77. //当主程序退出时子窗口窗口依然在运行,会引起系统崩溃
  78. return 0;
  79. }
  80. MYLIBAPI long  GetWinHWND(long *fcmywnd)
  81. {
  82. CMyWnd *cmywnd;
  83. if(*fcmywnd==0)
  84. {
  85. //MessageBox(0,"GetWinHWND致命错误fcmywnd所指对象已释放",0,0);
  86. return 0;
  87. }
  88. cmywnd=(CMyWnd *)*fcmywnd;
  89. return (long)cmywnd->m_hWnd;
  90. }
  91. MYLIBAPI int  SetWinPosition(long *fcmywnd, HWND hWnd ,long *x ,long *y)
  92. {
  93. CMyWnd *cmywnd;
  94. if(*fcmywnd==0)
  95. {
  96. //MessageBox(0,"SetWinPosition致命错误fcmywnd所指对象已释放",0,0);
  97. return 1;
  98. }
  99. cmywnd=(CMyWnd *)*fcmywnd;
  100. MyMoveWin(cmywnd, hWnd ,*x,*y);
  101. return 0;
  102. }
  103. MYLIBAPI int SetinputPos(long *fcmywnd,long *x ,long *y)
  104. {
  105. CMyWnd *cmywnd;
  106. if(*fcmywnd==0)
  107. {
  108. //MessageBox(0,"SetinputPos致命错误fcmywnd所指对象已释放",0,0);
  109. return 1;
  110. }
  111. cmywnd=(CMyWnd *)*fcmywnd;
  112. SetWindowPos(cmywnd->inputWind->m_hWnd, 0, *x,*y,0, 0, 21); //SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER  //16/1/4
  113. return 0;
  114. }
  115. MYLIBAPI int SetConPosition(long *fcmywnd,long *x ,long *y)
  116. {
  117. CMyWnd *cmywnd;
  118. if(*fcmywnd==0)
  119. {
  120. //MessageBox(0,"SetConPosition致命错误fcmywnd所指对象已释放",0,0);
  121. return 1;
  122. }
  123. cmywnd=(CMyWnd *)*fcmywnd;
  124. SetWindowPos(cmywnd->ConWind->m_hWnd, 0, *x,*y,0, 0, 21); //SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER  //16/1/4
  125. return 0;
  126. }
  127. MYLIBAPI int  HideWin(long *fcmywnd)
  128. {
  129. CMyWnd *cmywnd;
  130. if(*fcmywnd==0)
  131. {
  132. //MessageBox(0,"HideWin致命错误fcmywnd所指对象已释放",0,0);
  133. return 1;
  134. }
  135. cmywnd=(CMyWnd *)*fcmywnd;
  136. ShowWindow(cmywnd->m_hWnd, SW_HIDE);
  137. ShowWindow(cmywnd->inputWind->m_hWnd, SW_HIDE);
  138. //SetShowString(fcmywnd,"","");
  139. return 0;
  140. }
  141. MYLIBAPI int  UpdateWinShow(long *fcmywnd)
  142. {
  143. CMyWnd *cmywnd;
  144. if(*fcmywnd==0)
  145. {
  146. //MessageBox(0,"UpdateWinShow致命错误fcmywnd所指对象已释放",0,0);
  147. return 1;
  148. }
  149. //MessageBox(0,"UpdateWinShow",0,0);
  150. cmywnd=(CMyWnd *)*fcmywnd;
  151. cmywnd->myPaintTxt(0,actSetstr);
  152. cmywnd->inputWind->myPaintTxt(0,actSetstr);
  153. cmywnd->ConWind->myPaintTxt(0);
  154. //////////////////////////////////////////////////////////
  155. // InvalidateRect(cmywnd->m_hWnd,NULL,FALSE);
  156. // InvalidateRect(cmywnd->ConWind->m_hWnd,NULL,FALSE);
  157. // InvalidateRect(cmywnd->inputWind->m_hWnd,NULL,FALSE);
  158. return 0;
  159. }
  160. MYLIBAPI int  UpdateWinShowEx(long *fcmywnd)
  161. {
  162. CMyWnd *cmywnd;
  163. long h,w,x,y;
  164. RECT LoWinRect;
  165. if(*fcmywnd==0)
  166. {
  167. //MessageBox(0,"UpdateWinShow致命错误fcmywnd所指对象已释放",0,0);
  168. return 1;
  169. }
  170. //MessageBox(0,"UpdateWinShow",0,0);
  171. cmywnd=(CMyWnd *)*fcmywnd;
  172. cmywnd->myPaintTxt(0,actSetstr);
  173. cmywnd->inputWind->myPaintTxt(0,actSetstr);
  174. cmywnd->ConWind->myPaintTxt(0);
  175. //////////////////////////////////////////////////////////
  176. GetWindowRect(cmywnd->m_hWnd,&LoWinRect); 
  177. w=LoWinRect.right-LoWinRect.left;
  178. h=LoWinRect.bottom-LoWinRect.top;
  179. x=LoWinRect.left;
  180. y=LoWinRect.top;
  181. MoveWindow(cmywnd->m_hWnd,x,y,w+1,h,TRUE);
  182. MoveWindow(cmywnd->m_hWnd,x,y,w,h,TRUE);
  183. InvalidateRect(cmywnd->m_hWnd,NULL,FALSE);
  184. GetWindowRect(cmywnd->ConWind->m_hWnd,&LoWinRect); 
  185. w=LoWinRect.right-LoWinRect.left;
  186. h=LoWinRect.bottom-LoWinRect.top;
  187. x=LoWinRect.left;
  188. y=LoWinRect.top;
  189. MoveWindow(cmywnd->ConWind->m_hWnd,x,y,w+1,h,TRUE);
  190. MoveWindow(cmywnd->ConWind->m_hWnd,x,y,w,h,TRUE);
  191. InvalidateRect(cmywnd->ConWind->m_hWnd,NULL,FALSE);
  192. GetWindowRect(cmywnd->inputWind->m_hWnd,&LoWinRect); 
  193. w=LoWinRect.right-LoWinRect.left;
  194. h=LoWinRect.bottom-LoWinRect.top;
  195. x=LoWinRect.left;
  196. y=LoWinRect.top;
  197. MoveWindow(cmywnd->inputWind->m_hWnd,x,y,w+1,h,TRUE);
  198. MoveWindow(cmywnd->inputWind->m_hWnd,x,y,w,h,TRUE);
  199. // InvalidateRect(cmywnd->inputWind->m_hWnd,NULL,FALSE);
  200. return 0;
  201. }
  202. MYLIBAPI int  SetShowString(long *fcmywnd,char*MindleStr,char*InputStr)
  203. {
  204. static int nullflag=0;
  205. CMyWnd *cmywnd;
  206. if(*fcmywnd==0)
  207. {
  208. //MessageBox(0,"SetShowString致命错误fcmywnd所指对象已释放",0,0);
  209. return 1;
  210. }
  211. cmywnd=(CMyWnd *)*fcmywnd;
  212. cmywnd->settxt(MindleStr);
  213. if(InputStr!=NULL)
  214. strcpy(cmywnd->inputWind->showtxt,InputStr);
  215. else
  216. cmywnd->inputWind->showtxt[0]=0;
  217. cmywnd->myPaintTxt(0,actSetstr);
  218. cmywnd->inputWind->myPaintTxt(0,actSetstr);
  219. /*
  220. if(ss!=NULL)
  221. {
  222. len=strlen(ss);
  223. for(i=0;i<len;i++)
  224. cmywnd->showtxt[i]=ss[i];
  225. cmywnd->showtxt[i]=0;
  226. }
  227. else
  228. cmywnd->showtxt[i]=0;
  229. */
  230. if(cmywnd->inputWind->showtxt[0]==0)
  231. nullflag++;
  232. else
  233. nullflag=0;
  234. if(nullflag>1)
  235. {
  236. ShowWindow(cmywnd->m_hWnd,SW_HIDE);
  237. if(nullflag>2)
  238. ShowWindow(cmywnd->inputWind->m_hWnd,SW_HIDE);
  239. }
  240. else
  241. {
  242. ShowWindow(cmywnd->m_hWnd,SW_SHOWNOACTIVATE);
  243. ShowWindow(cmywnd->inputWind->m_hWnd,SW_SHOWNOACTIVATE);
  244. }
  245. return 0;
  246. }
  247. MYLIBAPI int  SetWinSize(long *fcmywnd,long *Width ,long *Height)
  248. {
  249. CMyWnd *cmywnd;
  250. RECT  drc;
  251. if(*fcmywnd==0)
  252. {
  253. //MessageBox(0,"SetWinSize致命错误fcmywnd所指对象已释放",0,0);
  254. return 1;
  255. }
  256. cmywnd=(CMyWnd *)*fcmywnd;
  257. GetWindowRect(cmywnd->m_hWnd,&drc);
  258. MoveWindow(cmywnd->m_hWnd,drc.left,drc.top,*Width,*Height,TRUE);
  259. return 0;
  260. }
  261. ///////////////////////////////////////////////////////////
  262. MYLIBAPI long myCreate(char* szClassName, char* szTitle, HWND hWndParent)
  263. {
  264. CMyWnd *cmywnd=NULL;
  265. //cmywnd=new CMyWnd;
  266. //MessageBox(0,"myCreate",0,0);
  267. //cmywnd->Create   (szClassName, szTitle, theApp.m_hInstance, hWndParent, WS_POPUP);
  268. return (long)cmywnd;
  269. }
  270. //////////////////////////////////////////////////////////////////////////////
  271. //内部函数
  272. int MyMoveWin(CMyWnd *cmywnd,HWND hWnd ,long x,long y)
  273. {
  274. RECT FullWinRect,LoWinRect,ParentWinRect;
  275. long h,w;
  276. GetWindowRect(GetDesktopWindow(),&FullWinRect);
  277. GetWindowRect(cmywnd->m_hWnd,&LoWinRect); 
  278. GetWindowRect(hWnd,&ParentWinRect); 
  279. w=LoWinRect.right-LoWinRect.left;
  280. h=LoWinRect.bottom-LoWinRect.top;
  281. if((x>10000 && y>10000)||(x<=0 && y<=0))
  282. return 0;
  283. x=x+ParentWinRect.left;
  284. y=y+ParentWinRect.top+40;
  285. //如果座标远离窗口时才移动。
  286. if(LoWinRect.left-x>60 || LoWinRect.left-x<-60 || LoWinRect.top!=y )
  287. {
  288. if(x<FullWinRect.left )
  289. x=FullWinRect.left;
  290. if( x>FullWinRect.right-w )
  291. x=FullWinRect.right-w;
  292. if( y<FullWinRect.top )
  293. y=FullWinRect.top;
  294. if(y>FullWinRect.bottom-h)
  295. y=FullWinRect.bottom-h;
  296. MoveWindow(cmywnd->m_hWnd,x,y,w,h,TRUE);
  297. SetWindowPos(cmywnd->inputWind->m_hWnd, 0, x,y,0, 0, 21); //SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER  //16/1/4
  298. // SetWindowPos(cmywnd->ConWind->m_hWnd, 0, x,y,0, 0, 21); //SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER  //16/1/4
  299. }
  300. return 0;
  301. }