鱼C论坛

 找回密码
 立即注册
查看: 6308|回复: 5

为什么全局变量在回调函数中变化值不改变?求大神解答。。。

[复制链接]
发表于 2015-2-4 15:14:14 | 显示全部楼层 |阅读模式
30鱼币
本帖最后由 漠水 于 2015-2-4 15:16 编辑

这里可以通过列表上面的文件下的“太烦”中组建输入会传递到全局变量all中,显示在主窗口,问题在代码247行 ,
问题在最后几行,我定义了一个全局变量line all ,为什么我在回调函数中改变all.n的值,在函数中all.n的值却没有变化。。。。,求解释
  1. // 输入控件.cpp : 定义应用程序的入口点。
  2. //

  3. #include "stdafx.h"
  4. #include "输入控件.h"
  5. #include<stdio.h>
  6. #include"strsafe.h"
  7. #define MAX_LOADSTRING 100

  8. //单个个体的数据
  9. typedef struct
  10. {
  11. TCHAR Text[20];
  12. }node;

  13. typedef struct
  14. {
  15. node name[100];
  16. int n;
  17. }line;


  18. // 全局变量:
  19. HINSTANCE hInst; // 当前实例
  20. TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
  21. TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
  22. line all; //定义一个可以存储的结构体

  23. // 此代码模块中包含的函数的前向声明:
  24. ATOM MyRegisterClass(HINSTANCE hInstance);
  25. BOOL InitInstance(HINSTANCE, int);
  26. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  27. INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
  28. INT_PTR CALLBACK Put(HWND, UINT, WPARAM, LPARAM);

  29. int APIENTRY _tWinMain(HINSTANCE hInstance,
  30. HINSTANCE hPrevInstance,
  31. LPTSTR lpCmdLine,
  32. int nCmdShow)
  33. {
  34. UNREFERENCED_PARAMETER(hPrevInstance);
  35. UNREFERENCED_PARAMETER(lpCmdLine);

  36. // TODO: 在此放置代码。
  37. MSG msg;
  38. HACCEL hAccelTable;

  39. // 初始化全局字符串
  40. LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  41. LoadString(hInstance, IDC_MY, szWindowClass, MAX_LOADSTRING);
  42. MyRegisterClass(hInstance);

  43. // 执行应用程序初始化:
  44. if (!InitInstance (hInstance, nCmdShow))
  45. {
  46. return FALSE;
  47. }

  48. hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY));

  49. // 主消息循环:
  50. while (GetMessage(&msg, NULL, 0, 0))
  51. {
  52. if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  53. {
  54. TranslateMessage(&msg);
  55. DispatchMessage(&msg);
  56. }
  57. }

  58. return (int) msg.wParam;
  59. }



  60. //
  61. // 函数: MyRegisterClass()
  62. //
  63. // 目的: 注册窗口类。
  64. //
  65. // 注释:
  66. //
  67. // 仅当希望
  68. // 此代码与添加到 Windows 95 中的“RegisterClassEx”
  69. // 函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
  70. // 这样应用程序就可以获得关联的
  71. // “格式正确的”小图标。
  72. //
  73. ATOM MyRegisterClass(HINSTANCE hInstance)
  74. {
  75. WNDCLASSEX wcex;

  76. wcex.cbSize = sizeof(WNDCLASSEX);

  77. wcex.style = CS_HREDRAW | CS_VREDRAW;
  78. wcex.lpfnWndProc = WndProc;
  79. wcex.cbClsExtra = 0;
  80. wcex.cbWndExtra = 0;
  81. wcex.hInstance = hInstance;
  82. wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY));
  83. wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
  84. wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  85. wcex.lpszMenuName = MAKEINTRESOURCE(IDC_MY);
  86. wcex.lpszClassName = szWindowClass;
  87. wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

  88. return RegisterClassEx(&wcex);
  89. }

  90. //
  91. // 函数: InitInstance(HINSTANCE, int)
  92. //
  93. // 目的: 保存实例句柄并创建主窗口
  94. //
  95. // 注释:
  96. //
  97. // 在此函数中,我们在全局变量中保存实例句柄并
  98. // 创建和显示主程序窗口。
  99. //
  100. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  101. {
  102. HWND hWnd;

  103. hInst = hInstance; // 将实例句柄存储在全局变量中

  104. hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  105. CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

  106. if (!hWnd)
  107. {
  108. return FALSE;
  109. }

  110. ShowWindow(hWnd, nCmdShow);
  111. UpdateWindow(hWnd);

  112. return TRUE;
  113. }

  114. //
  115. // 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
  116. //
  117. // 目的: 处理主窗口的消息。
  118. //
  119. // WM_COMMAND - 处理应用程序菜单
  120. // WM_PAINT - 绘制主窗口
  121. // WM_DESTROY - 发送退出消息并返回
  122. //
  123. //
  124. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  125. {
  126. int wmId, wmEvent;
  127. TCHAR szBuffer[128]; //缓存
  128. PAINTSTRUCT ps;
  129. HDC hdc;
  130. size_t ss; //记录长度
  131. all.n=0; //全局变量
  132. switch (message)
  133. {
  134. case WM_COMMAND:
  135. wmId = LOWORD(wParam);
  136. wmEvent = HIWORD(wParam);
  137. // 分析菜单选择:
  138. switch (wmId)
  139. {
  140. case IDM_PUT:
  141. if(DialogBox(hInst, MAKEINTRESOURCE(IDD_PUT), hWnd, Put))
  142. InvalidateRect(hWnd, NULL, TRUE);
  143. break;
  144. case IDM_ABOUT:
  145. DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
  146. break;
  147. case IDM_EXIT:
  148. DestroyWindow(hWnd);
  149. break;
  150. default:
  151. return DefWindowProc(hWnd, message, wParam, lParam);
  152. }
  153. break;
  154. case WM_PAINT:
  155. hdc = BeginPaint(hWnd, &ps);
  156. for(int k=0;k<=all.n;k++)
  157. {
  158. StringCchPrintf(szBuffer,128,TEXT("%d:%s"),all.n,all.name[all.n].Text); //记录要输出的字符串
  159. StringCchLength(szBuffer,128,&ss); //记录长度
  160. TextOut(hdc,all.n*15,0,szBuffer,ss); //输出位置(0,0)
  161. }
  162. EndPaint(hWnd, &ps);
  163. break;
  164. case WM_DESTROY:
  165. PostQuitMessage(0);
  166. break;
  167. default:
  168. return DefWindowProc(hWnd, message, wParam, lParam);
  169. }
  170. return 0;
  171. }

  172. // “关于”框的消息处理程序。
  173. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  174. {
  175. UNREFERENCED_PARAMETER(lParam);
  176. switch (message)
  177. {
  178. case WM_INITDIALOG:
  179. return (INT_PTR)TRUE;

  180. case WM_COMMAND:
  181. if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
  182. {
  183. EndDialog(hDlg, LOWORD(wParam));
  184. return (INT_PTR)TRUE;
  185. }
  186. break;
  187. }
  188. return (INT_PTR)FALSE;
  189. }

  190. // “put”框的消息处理程序。
  191. INT_PTR CALLBACK Put(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  192. {

  193. static TCHAR Text[1024];
  194. static HWND EDIT;
  195. UNREFERENCED_PARAMETER(lParam);
  196. switch (message)
  197. {
  198. case WM_INITDIALOG:
  199. return (INT_PTR)TRUE;
  200. case WM_COMMAND:
  201. EDIT = GetDlgItem(hDlg,IDC_EDIT1);//获取文本框句柄
  202. switch(LOWORD(wParam))
  203. {
  204. case IDC_EDIT1:
  205. switch(HIWORD(wParam))
  206. {
  207. case EN_UPDATE:
  208. GetWindowText(EDIT,Text,20);
  209. break;
  210. }
  211. break;
  212. case IDOK:
  213. _tcscpy_s(all.name[all.n].Text, sizeof(all.name[all.n].Text)/sizeof(all.name[all.n].Text[0]), Text);
  214. //如何将一个字符串的内容复制到另一个字符串里
  215. // MessageBox(hDlg,Text,all.name[all.n].Text,MB_OK);

  216. //问题在这里,为什么all.n的值不变
  217. all.n+=1; //值传递不会返回的!同类型同数值的不同数据?



  218. EndDialog(hDlg, LOWORD(wParam));
  219. return (INT_PTR)TRUE;
  220. case IDCANCEL:
  221. EndDialog(hDlg, LOWORD(wParam));
  222. return (INT_PTR)TRUE;
  223. }
  224. break;
  225. }
  226. return (INT_PTR)FALSE;
  227. }
复制代码




最佳答案

查看完整内容

。。。。。。。。。。。。。。下次能贴部分代码吗。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-2-4 15:14:15 | 显示全部楼层
。。。。。。。。。。。。。。下次能贴部分代码吗。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-2-4 19:58:39 | 显示全部楼层
自问自答有点伤心。。。。改变后的源代码:
  1. // 输入控件.cpp : 定义应用程序的入口点。
  2. //

  3. #include "stdafx.h"
  4. #include "输入控件.h"
  5. #include<stdio.h>
  6. #include"strsafe.h"
  7. #define MAX_LOADSTRING 100

  8. //单个个体的数据
  9. typedef struct
  10. {
  11.         TCHAR Text[20];
  12. }node;               

  13. typedef struct
  14. {
  15.         node name[100];
  16.         int n;
  17. }line;


  18. // 全局变量:
  19. HINSTANCE hInst;                                                                // 当前实例
  20. TCHAR szTitle[MAX_LOADSTRING];                                        // 标题栏文本
  21. TCHAR szWindowClass[MAX_LOADSTRING];                        // 主窗口类名
  22. line all;                                                                                //定义一个可以存储的结构体

  23. // 此代码模块中包含的函数的前向声明:
  24. ATOM                                MyRegisterClass(HINSTANCE hInstance);
  25. BOOL                                InitInstance(HINSTANCE, int);
  26. LRESULT CALLBACK        WndProc(HWND, UINT, WPARAM, LPARAM);
  27. INT_PTR CALLBACK        About(HWND, UINT, WPARAM, LPARAM);
  28. INT_PTR CALLBACK        Put(HWND, UINT, WPARAM, LPARAM);

  29. int APIENTRY _tWinMain(HINSTANCE hInstance,
  30.                      HINSTANCE hPrevInstance,
  31.                      LPTSTR    lpCmdLine,
  32.                      int       nCmdShow)
  33. {
  34.         UNREFERENCED_PARAMETER(hPrevInstance);
  35.         UNREFERENCED_PARAMETER(lpCmdLine);

  36.         // TODO: 在此放置代码。
  37.         MSG msg;
  38.         HACCEL hAccelTable;

  39.         // 初始化全局字符串
  40.         LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  41.         LoadString(hInstance, IDC_MY, szWindowClass, MAX_LOADSTRING);
  42.         MyRegisterClass(hInstance);

  43.         // 执行应用程序初始化:
  44.         if (!InitInstance (hInstance, nCmdShow))
  45.         {
  46.                 return FALSE;
  47.         }

  48.         hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY));

  49.         // 主消息循环:
  50.         while (GetMessage(&msg, NULL, 0, 0))
  51.         {
  52.                 if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  53.                 {
  54.                         TranslateMessage(&msg);
  55.                         DispatchMessage(&msg);
  56.                 }
  57.         }

  58.         return (int) msg.wParam;
  59. }



  60. //
  61. //  函数: MyRegisterClass()
  62. //
  63. //  目的: 注册窗口类。
  64. //
  65. //  注释:
  66. //
  67. //    仅当希望
  68. //    此代码与添加到 Windows 95 中的“RegisterClassEx”
  69. //    函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
  70. //    这样应用程序就可以获得关联的
  71. //    “格式正确的”小图标。
  72. //
  73. ATOM MyRegisterClass(HINSTANCE hInstance)
  74. {
  75.         WNDCLASSEX wcex;

  76.         wcex.cbSize = sizeof(WNDCLASSEX);

  77.         wcex.style                        = CS_HREDRAW | CS_VREDRAW;
  78.         wcex.lpfnWndProc        = WndProc;
  79.         wcex.cbClsExtra                = 0;
  80.         wcex.cbWndExtra                = 0;
  81.         wcex.hInstance                = hInstance;
  82.         wcex.hIcon                        = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY));
  83.         wcex.hCursor                = LoadCursor(NULL, IDC_ARROW);
  84.         wcex.hbrBackground        = (HBRUSH)(COLOR_WINDOW+1);
  85.         wcex.lpszMenuName        = MAKEINTRESOURCE(IDC_MY);
  86.         wcex.lpszClassName        = szWindowClass;
  87.         wcex.hIconSm                = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

  88.         return RegisterClassEx(&wcex);
  89. }

  90. //
  91. //   函数: InitInstance(HINSTANCE, int)
  92. //
  93. //   目的: 保存实例句柄并创建主窗口
  94. //
  95. //   注释:
  96. //
  97. //        在此函数中,我们在全局变量中保存实例句柄并
  98. //        创建和显示主程序窗口。
  99. //
  100. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  101. {
  102.    HWND hWnd;

  103.    hInst = hInstance; // 将实例句柄存储在全局变量中

  104.    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  105.       CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

  106.    if (!hWnd)
  107.    {
  108.       return FALSE;
  109.    }

  110.    ShowWindow(hWnd, nCmdShow);
  111.    UpdateWindow(hWnd);

  112.    return TRUE;
  113. }

  114. //
  115. //  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
  116. //
  117. //  目的: 处理主窗口的消息。
  118. //
  119. //  WM_COMMAND        - 处理应用程序菜单
  120. //  WM_PAINT        - 绘制主窗口
  121. //  WM_DESTROY        - 发送退出消息并返回
  122. //
  123. //
  124. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  125. {
  126.         int wmId, wmEvent;
  127.         TCHAR szBuffer[128];                //缓存
  128.         PAINTSTRUCT ps;
  129.         HDC hdc;
  130.         size_t ss;                                        //记录长度
  131.         //all.n=0;                                        //全局变量
  132.         switch (message)
  133.         {
  134.         case WM_CREATE:
  135.                 all.n=0;                        //全局变量数据改变必须在事件驱动中
  136.                 break;
  137.         case WM_COMMAND:
  138.                 wmId    = LOWORD(wParam);
  139.                 wmEvent = HIWORD(wParam);
  140.                 // 分析菜单选择:
  141.                 switch (wmId)
  142.                 {
  143.                 case IDM_PUT:
  144.                         if(DialogBox(hInst, MAKEINTRESOURCE(IDD_PUT), hWnd, Put))
  145.                         InvalidateRect(hWnd, NULL, TRUE);
  146.                         break;
  147.                 case IDM_ABOUT:
  148.                         DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
  149.                         break;
  150.                 case IDM_EXIT:
  151.                         DestroyWindow(hWnd);
  152.                         break;
  153.                 default:
  154.                         return DefWindowProc(hWnd, message, wParam, lParam);
  155.                 }
  156.                 break;
  157.         case WM_PAINT:
  158.                 hdc = BeginPaint(hWnd, &ps);
  159.                 for(int k=0;k<=all.n;k++)
  160.                 {
  161.                 //StringCchPrintf(szBuffer,128,TEXT("%d:%s"),all.n,all.name[all.n].Text);         //记录要输出的字符串
  162.                 StringCchPrintf(szBuffer,128,all.name[k].Text);         //记录要输出的字符串
  163.                 StringCchLength(szBuffer,128,&ss);                         //记录长度
  164.                 TextOut(hdc,0,k*15,szBuffer,ss);                //输出位置(0,0)
  165.                 }
  166.                 EndPaint(hWnd, &ps);
  167.                 break;
  168.         case WM_DESTROY:
  169.                 PostQuitMessage(0);
  170.                 break;
  171.         default:
  172.                 return DefWindowProc(hWnd, message, wParam, lParam);
  173.         }
  174.         return 0;
  175. }

  176. // “关于”框的消息处理程序。
  177. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  178. {
  179.         UNREFERENCED_PARAMETER(lParam);
  180.         switch (message)
  181.         {
  182.         case WM_INITDIALOG:
  183.                 return (INT_PTR)TRUE;

  184.         case WM_COMMAND:
  185.                 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
  186.                 {
  187.                         EndDialog(hDlg, LOWORD(wParam));
  188.                         return (INT_PTR)TRUE;
  189.                 }
  190.                 break;
  191.         }
  192.         return (INT_PTR)FALSE;
  193. }

  194. // “put”框的消息处理程序。
  195. INT_PTR CALLBACK Put(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  196. {

  197.         static TCHAR  Text[1024];
  198.         static HWND EDIT;
  199.         UNREFERENCED_PARAMETER(lParam);
  200.         switch (message)
  201.         {
  202.         case WM_INITDIALOG:
  203.                 return (INT_PTR)TRUE;
  204.         case WM_COMMAND:
  205.                 EDIT = GetDlgItem(hDlg,IDC_EDIT1);//获取文本框句柄
  206.                 switch(LOWORD(wParam))
  207.                 {
  208.                   case IDC_EDIT1:
  209.                            switch(HIWORD(wParam))
  210.                                 {
  211.                                  case EN_UPDATE:
  212.                                  GetWindowText(EDIT,Text,20);
  213.                                  break;
  214.                                 }
  215.                                 break;
  216.                 case IDOK:
  217.                          _tcscpy_s(all.name[all.n].Text, sizeof(all.name[all.n].Text)/sizeof(all.name[all.n].Text[0]), Text);
  218.             //如何将一个字符串的内容复制到另一个字符串里
  219.                         MessageBox(hDlg,Text,all.name[all.n].Text,MB_OK);

  220.                         //问题在这里,为什么all.n的值不变
  221.                          all.n+=1;         //值传递不会返回的!同类型同数值的不同数据?



  222.                         EndDialog(hDlg, LOWORD(wParam));
  223.                         return (INT_PTR)TRUE;
  224.                 case IDCANCEL:
  225.                         EndDialog(hDlg, LOWORD(wParam));
  226.                         return (INT_PTR)TRUE;
  227.                 }
  228.                 break;
  229.         }
  230.         return (INT_PTR)FALSE;
  231. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-2-6 07:37:20 | 显示全部楼层
debug一遍遍就知道了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-2-7 17:10:16 | 显示全部楼层
lixiaoshuai 发表于 2015-2-4 15:14
。。。。。。。。。。。。。。下次能贴部分代码吗。。。

我怕说不清楚。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-2-7 18:11:20 | 显示全部楼层
漠水 发表于 2015-2-7 17:10
我怕说不清楚。。。。

恩,编程有个kiss原则,keep it simple and stupid 浮躁的社会没人有耐心慢慢啦~\(≧▽≦) 都去泡妹子了~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 20:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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