6WinRes资源使用

  1. // 6WinRes.cpp : 定义应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include "6WinRes.h"
  5. #include "Resource.h"
  6. #include <iostream>
  7. #define PrintLog(x) WriteConsole(g_hStdout, x, strlen(x), NULL, NULL)
  8. HINSTANCE g_hInst = NULL; //窗口句柄
  9. HANDLE g_hStdout = NULL; //控制台句柄
  10. CHAR szText[256] = { 0 };
  11. BOOL OnSetCursor(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
  12. {
  13. //如果鼠标是在系统标题栏上,就返回FALSE
  14. int nHitTest = LOWORD(wParam);
  15. if (HTCLIENT != nHitTest)
  16. {
  17. //不在客户区,返回False
  18. //让DefWindowProc处理
  19. return FALSE;
  20. }
  21. //获得窗口的客户区
  22. RECT rcCilent = { 0 };
  23. GetClientRect(hWnd, &rcCilent);
  24. //获得当前光标的位置
  25. POINT ptPos = { 0 };
  26. GetCursorPos(&ptPos); //获得光标坐标
  27. ScreenToClient(hWnd, &ptPos); //获得客户区坐标
  28. //根据位置设置光标
  29. HCURSOR hCursor = NULL;
  30. if (ptPos.x < rcCilent.left / 2)
  31. {
  32. if (ptPos.y < rcCilent.bottom / 2)
  33. {
  34. hCursor = LoadCursor(NULL, IDC_SIZEALL);
  35. }
  36. else
  37. {
  38. hCursor = LoadCursor(NULL, IDC_CROSS);
  39. }
  40. }
  41. else
  42. {
  43. if (ptPos.y < rcCilent.bottom / 2)
  44. {
  45. hCursor = LoadCursor(NULL, IDC_WAIT);
  46. }
  47. else
  48. {
  49. hCursor = LoadCursor(NULL, IDC_UPARROW);
  50. }
  51. }
  52. //设置光标
  53. SetCursor(hCursor);
  54. return TRUE;
  55. }
  56. void OnCommand(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
  57. {
  58. int nCmdID = LOWORD(wParam);
  59. switch (nCmdID)
  60. {
  61. case ID_EXIT:
  62. PrintLog("ID_EXIT 触发\n");
  63. break;
  64. case ID_OPEN:
  65. PrintLog("ID_OPEN 触发\n");
  66. break;
  67. case ID_HELP:
  68. PrintLog("ID_HELP 触发\n");
  69. break;
  70. case ID_ABOUT:
  71. PrintLog("ID_ABOUT 触发\n");
  72. break;
  73. case ID_REGISTER:
  74. PrintLog("ID_REGISTER 触发\n");
  75. break;
  76. }
  77. //语法习惯
  78. //unsigned int nCmdID;
  79. //DWORD dwCmdID;
  80. //WORD wCmdId;
  81. //可以直接用 nCmdID 定义,代表数字
  82. }
  83. LRESULT CALLBACK WndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
  84. {
  85. switch (nMsg)
  86. {
  87. case WM_SETCURSOR:
  88. if (TRUE == OnSetCursor(hWnd, nMsg, wParam, lParam))
  89. {
  90. return 0;
  91. }
  92. //OnSetCursor(hWnd, nMsg, wParam, lParam); //VS2013直接用这句也可解决
  93. break;
  94. case WM_COMMAND:
  95. OnCommand(hWnd, nMsg, wParam, lParam);
  96. break;
  97. case WM_DESTROY:
  98. PostQuitMessage(0);
  99. break;
  100. }
  101. return DefWindowProc(hWnd, nMsg, wParam, lParam);
  102. }
  103. BOOL RegisterWnd(LPSTR pszClassName)
  104. {
  105. WNDCLASSEX wce = { 0 };
  106. wce.cbSize = sizeof(wce);
  107. wce.cbClsExtra = 0;
  108. wce.cbWndExtra = 0;
  109. wce.hbrBackground = HBRUSH(COLOR_BTNFACE + 1);
  110. wce.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_CURSOR1));
  111. wce.hIcon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_ICON3));
  112. wce.hIconSm = NULL;
  113. wce.hInstance = g_hInst;
  114. wce.lpfnWndProc = WndProc;
  115. wce.lpszClassName = pszClassName;
  116. wce.lpszMenuName = NULL;
  117. wce.style = CS_HREDRAW | CS_VREDRAW;
  118. ATOM atom = RegisterClassEx(&wce);
  119. if (atom == NULL)
  120. {
  121. return FALSE;
  122. }
  123. else
  124. {
  125. return TRUE;
  126. }
  127. }
  128. HWND CreateWnd(LPSTR pszClassName)
  129. {
  130. //加载字符串资源
  131. CHAR szTextCreate[256] = { 0 };
  132. LoadString(g_hInst, IDS_MAIN, szTextCreate, 256);
  133. //加载菜单
  134. HMENU hMainMenu = LoadMenu(g_hInst, MAKEINTRESOURCE(IDR_MENU1));
  135. //加载完之后要放在窗口上,放到CreateWindow函数里的倒数第三个就成
  136. HWND hWnd = CreateWindowEx(0, pszClassName, szTextCreate, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  137. CW_USEDEFAULT, NULL, hMainMenu, g_hInst, 0);
  138. return hWnd;
  139. }
  140. void ShowWnd(HWND hWnd)
  141. {
  142. ShowWindow(hWnd, SW_SHOW);
  143. UpdateWindow(hWnd);
  144. }
  145. void Msg(HWND hWnd)
  146. {
  147. //加载加速键,按X键触发退出消息
  148. HACCEL hAccel = LoadAccelerators(g_hInst, MAKEINTRESOURCE(IDR_ACCELERATOR1));
  149. //消息循环
  150. MSG msg = { 0 };
  151. while (GetMessage(&msg, NULL, 0, 0))
  152. { //增加加速键的消息处理
  153. if (!TranslateAccelerator(hWnd, hAccel, &msg)) //加速键,如果不返回零,则以前的消息 就不执行了
  154. { //正常消息处理
  155. //字符串消息处理
  156. TranslateMessage(&msg);
  157. //消息派发
  158. DispatchMessage(&msg);
  159. }
  160. }
  161. }
  162. void ConsoleWnd()
  163. {
  164. AllocConsole();
  165. g_hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
  166. CHAR szText[] = "Debug start:\n";
  167. WriteConsole(g_hStdout, szText, strlen(szText), NULL, NULL);
  168. }
  169. int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
  170. {
  171. g_hInst = hInstance;
  172. ConsoleWnd();
  173. RegisterWnd("oooo");
  174. HWND hWnd = CreateWnd("oooo");
  175. ShowWnd(hWnd);
  176. Msg(hWnd); //加速键处理
  177. return 0;
  178. }





posted @ 2016-06-10 08:16  -刀狂剑痴-  阅读(247)  评论(0编辑  收藏  举报