找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3729|回复: 2

【封装】Windows窗口程序的封装:WndX

[复制链接]
发表于 2014-9-11 02:34:00 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
用了这个以后,你不必每次写窗口程序都重复写RegisterClassEx、CreateWindowEx、WndProc等各种烦人的每次都要写的玩意儿了。
这个程序现在被我改进了,请看改进后的程序:http://www.0xaa55.com/thread-878-1-1.html
用法:
  1. #include<stdio.h>
  2. #include"WndX.h"

  3. #define        ErrRet(err)        {fputs(err,stderr);goto Cleanup;}

  4. int main(int argc,char**argv)
  5. {
  6.         WndXP pWnd=NULL;

  7.         //初始化WndX库
  8.         InitWndXGlobal(GetModuleHandle(NULL));

  9.         //创建窗口
  10.         pWnd=CreateWndX(NULL);
  11.         if(!pWnd)ErrRet("Create WndX failed.\n");

  12.         //初始化窗口
  13.         if(!InitWndX(pWnd,WS_OVERLAPPEDWINDOW,0,TEXT("0xAA55->WndX"),TEXT("窗口类名是扯鸡吧"),CW_USEDEFAULT,CW_USEDEFAULT,448,336,NULL,NULL,SW_SHOW))
  14.                 ErrRet("Initialize WndX failed.\n");

  15.         //消息循环
  16.         while(WaitForWndXMessages());

  17.         //清理WndX库
  18.         DestroyWndXGlobal();
  19.         return 0;
  20. Cleanup:
  21.         DestroyWndXGlobal();
  22.         return 2;
  23. }
复制代码
你可以通过调用AddWndXMsgHandler来给特定的消息设定消息处理函数,而不必每次都非得写一个WndProc。是不是很方便呢?
这个WndX库,就是我为了使编写Windows程序更方便而写的。大家可以随便拿去用。
WndX.c:
  1. //=============================================================================
  2. //作者:0xAA55
  3. //论坛:[url]http://www.0xaa55.com/[/url]
  4. //版权所有 2013-2014 技术宅的结界
  5. //请保留原作者信息,否则视为侵权
  6. //-----------------------------------------------------------------------------
  7. #include<malloc.h>
  8. #include"WndX.h"

  9. #ifndef WXInternal
  10. #define        WXInternal                static
  11. #endif // !WXInternal

  12. WXInternal
  13. LRESULT CALLBACK WndXWndProc(HWND hWnd,UINT uMsg,WPARAM wp,LPARAM lp);

  14. WXInternal
  15. WNDCLASSEX g_WCEx=
  16. {
  17.         sizeof(WNDCLASSEX),
  18.         0,
  19.         (WNDPROC)WndXWndProc,
  20.         0,
  21.         0,
  22.         NULL,//hInstance
  23.         NULL,
  24.         NULL,
  25.         (HBRUSH)(COLOR_BTNFACE+1),
  26.         NULL,
  27.         NULL,//Class name
  28.         NULL
  29. };

  30. WXInternal size_t        g_NbWndX;
  31. WXInternal WndXP        *g_ppWndX;

  32. //=============================================================================
  33. //PushWndXP:
  34. //将WndXP压入全局容器
  35. //-----------------------------------------------------------------------------
  36. WXInternal
  37. BOOL PushWndXP(WndXP p)
  38. {
  39.         size_t NewCount=g_NbWndX+1;
  40.         WndXP*pNewPtr=(WndXP*)realloc(g_ppWndX,NewCount*sizeof(WndXP));
  41.         if(!pNewPtr)
  42.                 return FALSE;

  43.         g_ppWndX=pNewPtr;
  44.         g_ppWndX[g_NbWndX]=p;
  45.         g_NbWndX=NewCount;
  46.         return TRUE;
  47. }

  48. //=============================================================================
  49. //PopWndXP:
  50. //将全局容器最后一个WndXP去掉
  51. //-----------------------------------------------------------------------------
  52. WXInternal
  53. void PopWndXP()
  54. {
  55.         if(g_NbWndX)
  56.                 g_ppWndX=(WndXP*)realloc(g_ppWndX,(--g_NbWndX)*sizeof(WndXP));
  57. }

  58. //=============================================================================
  59. //InitWndXGlobal:
  60. //初始化WndX库
  61. //-----------------------------------------------------------------------------
  62. WXFunc
  63. void InitWndXGlobal(HINSTANCE hInstance)
  64. {
  65.         g_NbWndX=0;
  66.         g_ppWndX=NULL;
  67.         g_WCEx.hInstance=hInstance;
  68. }

  69. //=============================================================================
  70. //DestroyWndXGlobal:
  71. //结束WndX库的使用
  72. //-----------------------------------------------------------------------------
  73. WXFunc
  74. void DestroyWndXGlobal()
  75. {
  76.         while(g_NbWndX)
  77.                 DestroyWndX(g_ppWndX[0]);
  78. }

  79. //=============================================================================
  80. //CreateWndX:
  81. //创建WndX对象
  82. //-----------------------------------------------------------------------------
  83. WXFunc
  84. WndXP CreateWndX(void*pUserData)
  85. {
  86.         WndXP pNewPtr=(WndXP)malloc(sizeof(WndX));
  87.         if(!pNewPtr)
  88.                 return NULL;

  89.         if(PushWndXP(pNewPtr))
  90.         {
  91.                 memset(pNewPtr,0,sizeof(WndX));
  92.                 pNewPtr->pUserData=pUserData;
  93.                 return pNewPtr;
  94.         }
  95.         else
  96.         {
  97.                 free(pNewPtr);
  98.                 return NULL;
  99.         }
  100. }

  101. //=============================================================================
  102. //DestroyWndX:
  103. //销毁WndX对象
  104. //-----------------------------------------------------------------------------
  105. WXFunc
  106. void DestroyWndX(WndXP pThis)
  107. {
  108.         size_t i;

  109.         UnregisterClass((LPCTSTR)(pThis->aClass),g_WCEx.hInstance);
  110.         ClearWndXMsgHandler(pThis);
  111.         free(pThis);

  112.         //遍历存储的窗口表,删掉记录
  113.         for(i=0;i<g_NbWndX;i++)
  114.         {
  115.                 if(g_ppWndX[i]==pThis)
  116.                 {
  117.                         g_ppWndX[i]=g_ppWndX[g_NbWndX-1];//和最后一个交换
  118.                         PopWndXP();//删掉最后一个的记录
  119.                         break;//记录不会重复
  120.                 }
  121.         }
  122. }

  123. //=============================================================================
  124. //InitWndX:
  125. //初始化WndX对象
  126. //-----------------------------------------------------------------------------
  127. WXFunc
  128. BOOL
  129. #ifdef UNICODE
  130. InitWndXW
  131. #else
  132. InitWndXA
  133. #endif // UNICODE
  134. (
  135.         WndXP pThis,
  136.         DWORD dwStyle,
  137.         DWORD dwExStyle,
  138.         LPCTSTR szTitle,
  139.         LPCTSTR szClass,
  140.         int x,int y,
  141.         int Width,int Height,
  142.         HWND hWndParent,HMENU hMenu,
  143.         int nCmdShow
  144. )
  145. {
  146.         pThis->szTitle=szTitle;
  147.         pThis->szClass=szClass;
  148.         g_WCEx.lpszClassName=szClass;
  149.         pThis->aClass=RegisterClassEx(&g_WCEx);
  150.         if(!pThis->aClass)
  151.                 return FALSE;

  152.         pThis->hWnd=CreateWindowEx(dwExStyle,(LPCTSTR)pThis->aClass,szTitle,dwStyle,x,y,Width,Height,hWndParent,hMenu,g_WCEx.hInstance,NULL);
  153.         if(pThis->hWnd)
  154.         {
  155.                 ShowWindow(pThis->hWnd,nCmdShow);
  156.                 UpdateWindow(pThis->hWnd);
  157.         }
  158.         else
  159.                 return FALSE;
  160.         return TRUE;
  161. }

  162. //=============================================================================
  163. //AddWndXMsgHandler:
  164. //给WndX对象添加指定的消息的处理函数
  165. //-----------------------------------------------------------------------------
  166. WXFunc
  167. BOOL AddWndXMsgHandler(WndXP pThis,UINT uMsg,WNDPROC pfnCallBack)
  168. {
  169.         UINT uNewCount=pThis->uNbMsgCallBacks+1;
  170.         MsgCallBackP pNewPtr=(MsgCallBackP)realloc(pThis->pMsgCallBacks,uNewCount*sizeof(MsgCallBack));

  171.         if(!pNewPtr)
  172.                 return FALSE;

  173.         pThis->pMsgCallBacks=pNewPtr;
  174.         pNewPtr[pThis->uNbMsgCallBacks].pCallBack=pfnCallBack;
  175.         pNewPtr[pThis->uNbMsgCallBacks].uMsg=uMsg;
  176.         pThis->uNbMsgCallBacks=uNewCount;
  177.         return TRUE;
  178. }

  179. //=============================================================================
  180. //RemoveWndXMsgHandler:
  181. //移除WndX对象指定的消息处理函数
  182. //-----------------------------------------------------------------------------
  183. WXFunc
  184. void RemoveWndXMsgHandler(WndXP pThis,UINT uMsg)
  185. {
  186.         UINT i;
  187.         for(i=0;i<pThis->uNbMsgCallBacks;i++)
  188.         {
  189.                 if(pThis->pMsgCallBacks[i].uMsg==uMsg)//如果是该消息的处理函数
  190.                 {//与最后一个交换,然后删除
  191.                         memcpy(&(pThis->pMsgCallBacks[i]),&(pThis->pMsgCallBacks[--pThis->uNbMsgCallBacks]),sizeof(MsgCallBack));
  192.                         pThis->pMsgCallBacks=(MsgCallBackP)realloc(pThis->pMsgCallBacks,pThis->uNbMsgCallBacks*sizeof(MsgCallBack));
  193.                 }
  194.         }
  195. }

  196. //=============================================================================
  197. //ClearWndXMsgHandler:
  198. //移除WndX对象所有的消息处理函数
  199. //-----------------------------------------------------------------------------
  200. WXFunc
  201. void ClearWndXMsgHandler(WndXP pThis)
  202. {
  203.         free(pThis->pMsgCallBacks);
  204.         pThis->pMsgCallBacks=NULL;
  205.         pThis->uNbMsgCallBacks=0;
  206. }

  207. //=============================================================================
  208. //WndXWndProc:
  209. //所有WndX对象的消息处理函数
  210. //-----------------------------------------------------------------------------
  211. WXInternal
  212. LRESULT CALLBACK WndXWndProc(HWND hWnd,UINT uMsg,WPARAM wp,LPARAM lp)
  213. {
  214.         size_t i;//i用来遍历已有的WndX
  215.         for(i=0;i<g_NbWndX;i++)
  216.         {
  217.                 if(hWnd==g_ppWndX[i]->hWnd)
  218.                 {
  219.                         size_t j;//j用来遍历已注册的消息处理函数
  220.                         for(j=0;j<g_ppWndX[i]->uNbMsgCallBacks;j++)
  221.                         {
  222.                                 if(uMsg==g_ppWndX[i]->pMsgCallBacks[j].uMsg)//如果注册了这个消息的处理函数则处理它
  223.                                         return g_ppWndX[i]->pMsgCallBacks[j].pCallBack(hWnd,uMsg,wp,lp);
  224.                         }
  225.                 }
  226.         }
  227.         //如果是未经处理的WM_DESTROY,则生成WM_QUIT消息
  228.         if(uMsg==WM_DESTROY)
  229.         {
  230.                 PostQuitMessage(0);
  231.                 return 0;
  232.         }
  233.         //没有注册的窗口和消息则直接用默认方式处理。
  234.         return DefWindowProc(hWnd,uMsg,wp,lp);
  235. }

  236. //=============================================================================
  237. //CheckWndXMessages:
  238. //检查消息,自动调用所有的回调函数,有消息返回真,无消息返回假
  239. //-----------------------------------------------------------------------------
  240. WXFunc
  241. BOOL CheckWndXMessages(void)
  242. {
  243.         MSG msg;
  244.         if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
  245.         {
  246.                 TranslateMessage(&msg);
  247.                 DispatchMessage(&msg);
  248.                 return TRUE;
  249.         }
  250.         return FALSE;
  251. }

  252. //=============================================================================
  253. //WaitForWndXMessages:
  254. //等待消息。窗口关闭后返回假
  255. //-----------------------------------------------------------------------------
  256. WXFunc
  257. BOOL WaitForWndXMessages(void)
  258. {
  259.         MSG msg;
  260.         if(GetMessage(&msg,NULL,0,0))
  261.         {
  262.                 TranslateMessage(&msg);
  263.                 DispatchMessage(&msg);
  264.                 return TRUE;
  265.         }
  266.         else
  267.                 return FALSE;
  268. }
复制代码
WndX.h:
  1. //=============================================================================
  2. //作者:0xAA55
  3. //论坛:[url]http://www.0xaa55.com/[/url]
  4. //版权所有 2013-2014 技术宅的结界
  5. //请保留原作者信息,否则视为侵权
  6. //-----------------------------------------------------------------------------
  7. #ifndef _WINDOWX_
  8. #define        _WINDOWX_

  9. #include<Windows.h>

  10. #ifndef WXFunc
  11. #define        WXFunc
  12. #endif // !WXFunc

  13. #ifndef WXCall
  14. #define        WXCall                WINAPI
  15. #define        WXCallP                WXCall*
  16. #endif // !WXCall

  17. #pragma pack(push,1)

  18. typedef struct
  19. {
  20.         UINT        uMsg;
  21.         WNDPROC        pCallBack;
  22. }MsgCallBack,*MsgCallBackP;

  23. typedef struct
  24. {
  25.         HWND                        hWnd;

  26.         LPCTSTR                        szTitle;
  27.         LPCTSTR                        szClass;
  28.         ATOM                        aClass;

  29.         UINT                        uNbMsgCallBacks;
  30.         MsgCallBackP        pMsgCallBacks;

  31.         void                        *pUserData;
  32. }WndX,*WndXP;

  33. #pragma pack(pop)

  34. #ifdef __cplusplus
  35. extern"C"
  36. {
  37. #endif // __cplusplus


  38. WXFunc        void        InitWndXGlobal(HINSTANCE hInstance);//初始化WndX库
  39. WXFunc        void        DestroyWndXGlobal(void);//结束WndX库的使用

  40. WXFunc        WndXP        CreateWndX(void*pUserData);//创建WndX对象
  41. WXFunc        void        DestroyWndX(WndXP pThis);//销毁WndX对象

  42. //=============================================================================
  43. //InitWndX:
  44. //初始化WndX
  45. //-----------------------------------------------------------------------------
  46. WXFunc        BOOL        InitWndXA
  47. (
  48.         WndXP pThis,
  49.         DWORD dwStyle,
  50.         DWORD dwExStyle,
  51.         LPCSTR szTitle,
  52.         LPCSTR szClass,
  53.         int x,int y,
  54.         int Width,int Height,
  55.         HWND hWndParent,
  56.         HMENU hMenu,
  57.         int nCmdShow
  58. );

  59. WXFunc        BOOL        InitWndXW
  60. (
  61.         WndXP pThis,
  62.         DWORD dwStyle,
  63.         DWORD dwExStyle,
  64.         LPCWSTR szTitle,
  65.         LPCWSTR szClass,
  66.         int x,int y,
  67.         int Width,int Height,
  68.         HWND hWndParent,
  69.         HMENU hMenu,
  70.         int nCmdShow
  71. );

  72. #ifdef UNICODE
  73. #define        InitWndX        InitWndXW
  74. #else
  75. #define        InitWndX        InitWndXA
  76. #endif // UNICODE

  77. //给WndX对象添加指定的消息的处理函数
  78. WXFunc        BOOL        AddWndXMsgHandler(WndXP pThis,UINT uMsg,WNDPROC pfnCallBack);
  79. //移除WndX对象指定的消息处理函数
  80. WXFunc        void        RemoveWndXMsgHandler(WndXP pThis,UINT uMsg);
  81. //移除WndX对象所有的消息处理函数
  82. WXFunc        void        ClearWndXMsgHandler(WndXP pThis);

  83. //检查消息
  84. WXFunc        BOOL        CheckWndXMessages(void);
  85. //等待消息。窗口关闭后返回假。没有消息则不返回。
  86. WXFunc        BOOL        WaitForWndXMessages(void);

  87. #ifdef __cplusplus
  88. }
  89. #endif // __cplusplus

  90. #endif // !_WINDOW_
复制代码
SRC:
WndX.c (7.34 KB, 下载次数: 0, 售价: 1 个宅币)
WndX.h (2.25 KB, 下载次数: 0, 售价: 1 个宅币)
完整的工程: WndX.7z (6.98 KB, 下载次数: 5, 售价: 10 个宅币)
回复

使用道具 举报

发表于 2014-9-11 22:07:38 | 显示全部楼层
好诶,大神发福利咯,麻麻再也不用担心我用C开发界面费脑筋啦!
回复 赞! 靠!

使用道具 举报

发表于 2019-12-6 12:58:11 | 显示全部楼层
感谢大神分享,可以方便使用了。
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-22 11:15 , Processed in 0.038286 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表