创建子窗口类,使得子窗口有自己的处理过程。

子窗口类型WS_CHILD不能和WS_POPUP一起使用!
为什么子窗口要有自己的处理过程?
如果使用主窗口类来创建子窗口,那么子窗口和主窗口将公用窗口处理过程,此时,窗口处理过程在进行消息处理的时候,必须判断是哪个窗口的消息,非常不方便。
子窗口必须有自己的窗口类型WSCHILD,并且子窗口的父窗口句柄一定不能使NULL,子窗口的坐标主窗口的映射方式和客户区有关。否则CreateWindow函数就会失败。

客户定制消息:WL_USER+N,其中N可以是0x7FFF-WM_USER之间的任何值。发送窗口消息的函数:

  1. SendMessage
  1. LRESULT WINAPI SendMessage(
  2. _In_ HWND hWnd,
  3. _In_ UINT Msg,
  4. _In_ WPARAM wParam,
  5. _In_ LPARAM lParam
  6. );
  1. 将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。和函数PostMessage不同,PostMessage是将一个消息寄送到一个线程的消息队列后就立即返回。
    hWnd:  发送消息的目标窗口;
    Msg:   WMXXX消息;
    wParam 用户自定义的一个32位值;
    1param 用户自定义的一个32为值;
设置当前的背景色
  1. COLORREF SetBkColor(
  2. HDC hdc,
  3. COLORREF color
  4. );

用指定的颜色值来设置当前的背景色,如果指定的颜色值超出了当前设备的表示范围,则设置为最近似的、设备可以表示的颜色。

hdc:设置上下文句柄
color:标识新的背景颜色值。如果想要获得COLORREF的值,请使用RGB宏。
  1. 改变窗口位置
  1. BOOL WINAPI SetWindowPos(
  2. _In_ HWND hWnd,
  3. _In_opt_ HWND hWndInsertAfter,
  4. _In_ int X,
  5. _In_ int Y,
  6. _In_ int cx,
  7. _In_ int cy,
  8. _In_ UINT uFlags
  9. );
改变一个子窗口,弹出式窗口或顶层窗口的尺寸,位置和Z序。
hwnd:在z序中的位于被置位的窗口前的窗口句柄。该参数必须为一个窗口句柄
hWndlnsertAfter:用于标识在z-顺序的此 CWnd 对象之前的 CWnd 对象。如果uFlags参数中设置了SWP_NOZORDER标记则本参数将被忽略。可为下列值之一:
    • HWND_BOTTOM:值为1,将窗口置于Z序的底部。如果参数hWnd标识了一个顶层窗口,则窗口失去顶级位置,并且被置在其他窗口的底部。
    • HWND_NOTOPMOST:值为-2,将窗口置于所有非顶层窗口之上(即在所有顶层窗口之后)。如果窗口已经是非顶层窗口则该标志不起作用。
    • HWND_TOP:值为0,将窗口置于Z序的顶部。
    • HWND_TOPMOST:值为-1,将窗口置于所有非顶层窗口之上。即使窗口未被激活窗口也将保持顶级位置。

X:以客户坐标指定窗口新位置的左边界。

Y:以客户坐标指定窗口新位置的顶边界。

cx:以像素指定窗口的新的宽度。

cy:以像素指定窗口的新的高度。

uFlags:窗口尺寸和定位的标志。

改变指定窗口的属性

  1. LONG WINAPI SetWindowLong(
  2. _In_ HWND hWnd,
  3. _In_ int nIndex,
  4. _In_ LONG dwNewLong
  5. );
  1. hwnd    窗口句柄;
    nIndex:   要改变窗口的那个参数;
    dwNewLong 窗口参数的新值;

 获取窗口类信息

  1. BOOL WINAPI GetClassInfo(
  2. _In_opt_ HINSTANCE hInstance,
  3. _In_ LPCTSTR lpClassName,
  4. _Out_ LPWNDCLASS lpWndClass
  5. );

hInstance: 当前程序的基地址,也就是程序的句柄;
1pclassName: 类名;
1pwndclass:    指向 WNDCLASS类型的指针;

画矩形

  1. BOOL Rectangle(
  2. HDC hdc,
  3. int left,
  4. int top,
  5. int right,
  6. int bottom
  7. );

画一个矩形,可以用当前的画笔画矩形轮廓,用当前画刷进行填充。

hdc: 设备环境句柄。
left: 指定矩形左上角的逻辑X坐标。
top: 指定矩形左上角的逻辑Y坐标。
right:   指定矩形右下角的逻辑X坐标。
bottom: 指定矩形右下角的逻辑Y坐标。
返回值:如果函数调用成功,返回值非零,否则返回值为0

获得当前程序基地址,或者HINSTANCE的函数:GetModuleHandle(NULL);

系统内置的窗口类型“BUTTON”
WL_COMMAND消息:
wParam:
lparam:

不使用子窗口类创建一个按钮,点击按钮按钮会变色,源码

  1. //#define _AFXDLL
  2. //#include<afx.h>
  3. #include<Windows.h>
  4. #include<tchar.h>
  5.  
  6. #ifndef _AFXDELL
  7. #define TRACE(a,b)
  8. #endif
  9.  
  10. LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
  11.  
  12. int WinMain(HINSTANCE hInst, HINSTANCE tmp, LPSTR szCmd, int nShow)
  13. {
  14. WNDCLASS WndClass;
  15. TCHAR* ClassName = TEXT("MyClass");
  16. HWND hwnd;
  17. MSG msg;
  18. HBRUSH hBrush;
  19.  
  20. hBrush = CreateSolidBrush(RGB(,,));
  21. WndClass.cbClsExtra = ;
  22. WndClass.cbWndExtra = ;
  23. WndClass.hbrBackground = hBrush;
  24. WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
  25. WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  26. WndClass.hInstance = hInst;
  27. WndClass.lpfnWndProc = WindProc;
  28. WndClass.lpszClassName = ClassName;
  29. WndClass.lpszMenuName = NULL;
  30. WndClass.style = CS_VREDRAW | CS_HREDRAW;
  31.  
  32. RegisterClass(&WndClass);
  33. hwnd = CreateWindow(ClassName, TEXT("Hello"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, , , NULL, NULL, hInst, NULL);
  34. ShowWindow(hwnd, nShow);
  35. UpdateWindow(hwnd);
  36.  
  37. while (GetMessage(&msg, NULL, , ))
  38. {
  39. TranslateMessage(&msg);
  40. DispatchMessage(&msg);
  41. }
  42. return ;
  43. }
  44. LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  45. {
  46. HDC hdc;
  47. PAINTSTRUCT pt;
  48. HBRUSH hBrush;
  49. static int status;
  50. switch (message)
  51. {
  52. case WM_CREATE:
  53. return ;
  54. case WM_SIZE:
  55. return ;
  56. case WM_PAINT:
  57. hdc = BeginPaint(hwnd, &pt);
  58. if(status == )
  59. {
  60. hBrush = CreateSolidBrush(RGB(, , ));
  61. SelectObject(hdc, hBrush);
  62. Rectangle(hdc, , , , );
  63. SetBkColor(hdc, RGB(, , ));
  64. TextOut(hdc, , , TEXT("OK"), );
  65. TextOut(hdc, , , TEXT("Hit me!"), );
  66. }
  67. else
  68. {
  69. hBrush = CreateSolidBrush(RGB(, , ));
  70. SelectObject(hdc, hBrush);
  71. Rectangle(hdc, , , , );
  72. SetBkColor(hdc, RGB(, , ));
  73. TextOut(hdc, , , TEXT("OK"), );
  74. TextOut(hdc, , , TEXT("Hit me!"), );
  75. }
  76. EndPaint(hwnd, &pt);
  77. return ;
  78. case WM_LBUTTONDOWN:
  79. if (LOWORD(lParam)> && LOWORD(lParam)< && HIWORD(lParam)< && HIWORD(lParam)>)
  80. {
  81. status = ;
  82. InvalidateRect(hwnd, NULL,TRUE);
  83. }
  84. return ;
  85. case WM_LBUTTONUP:
  86. InvalidateRect(hwnd, NULL,TRUE);
  87. status = ;
  88. return ;
  89. case WM_DESTROY:
  90. PostQuitMessage();
  91. return ;
  92. default:
  93. break;
  94. }
  95.  
  96. return DefWindowProc(hwnd, message, wParam, lParam);
  97. }

使用子窗口创建按钮

  1. .h
  2. //#pragma once
  3. //#define _AFXDLL
  4. //#include<afx.h>
  5. #include<Windows.h>
  6. #include<tchar.h>
  7.  
  8. #ifndef _AFXDELL
  9. #define TRACE(a,b)
  10. #endif
  11.  
  12. HWND CreateChild(HWND ParentHwnd, int x, int y, int cx, int cy);
  13. extern HINSTANCE G_hInst;
  1. .c
  2. #include"1.h"
  3. HINSTANCE G_hInst;
  4. LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
  5.  
  6. int WinMain(HINSTANCE hInst, HINSTANCE tmp, LPSTR szCmd, int nShow)
  7. {
  8. WNDCLASS WndClass;
  9. TCHAR* ClassName = TEXT("MyClass");
  10. HWND hwnd;
  11. MSG msg;
  12. HBRUSH hBrush;
  13.  
  14. hBrush = CreateSolidBrush(RGB(,,));
  15. G_hInst = hInst;
  16. WndClass.cbClsExtra = ;
  17. WndClass.cbWndExtra = ;
  18. WndClass.hbrBackground = hBrush;
  19. WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
  20. WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  21. WndClass.hInstance = hInst;
  22. WndClass.lpfnWndProc = WindProc;
  23. WndClass.lpszClassName = ClassName;
  24. WndClass.lpszMenuName = NULL;
  25. WndClass.style = CS_VREDRAW | CS_HREDRAW;
  26.  
  27. RegisterClass(&WndClass);
  28. hwnd = CreateWindow(ClassName, TEXT("Hello"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, , , NULL, NULL, hInst, NULL);
  29. ShowWindow(hwnd, nShow);
  30. UpdateWindow(hwnd);
  31.  
  32. while (GetMessage(&msg, NULL, , ))
  33. {
  34. TranslateMessage(&msg);
  35. DispatchMessage(&msg);
  36. }
  37. return ;
  38. }
  39. LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  40. {
  41. HDC hdc;
  42. PAINTSTRUCT pt;
  43. HBRUSH hBrush;
  44. static int status;
  45. static HWND child1,child2,child3;
  46. TCHAR buf[];
  47. switch (message)
  48. {
  49. case WM_CREATE:
  50. child1 = CreateChild(hwnd, , , , );
  51. child2 = CreateChild(hwnd, , , , );
  52. child3 = CreateChild(hwnd, , , , );
  53. return ;
  54. case WM_SIZE:
  55. return ;
  56. case WM_PAINT:
  57. hdc = BeginPaint(hwnd, &pt);
  58. EndPaint(hwnd, &pt);
  59. return ;
  60. case WM_USER+:
  61. hdc = GetDC(hwnd);
  62. if((LPARAM)child1==lParam)
  63. {
  64. TextOut(hdc,,,TEXT("Hit First button"),);
  65. }
  66. if((LPARAM)child2==lParam)
  67. {
  68. TextOut(hdc,,,TEXT("Hit Second button"),);
  69. }
  70. if((LPARAM)child3==lParam)
  71. {
  72. TextOut(hdc,,,TEXT("Hit Third button"),);
  73. }
  74. ReleaseDC(hwnd, hdc);
  75. ValidateRect(hwnd, NULL);
  76. return ;
  77. case WM_USER + :
  78. InvalidateRect(hwnd, NULL, TRUE);
  79. return ;
  80. case WM_DESTROY:
  81. PostQuitMessage();
  82. return ;
  83. default:
  84. break;
  85. }
  86.  
  87. return DefWindowProc(hwnd, message, wParam, lParam);
  88. }
  1. .c
  2. #include"1.h"
  3. extern HINSTANCE G_hInst;
  4. static LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
  5.  
  6. HWND CreateChild(HWND ParentHwnd, int x, int y, int cx, int cy)
  7. {
  8. WNDCLASS WndClass,MyWnd;
  9. TCHAR* ClassName = TEXT("MyChild");
  10. HWND hwnd;
  11. MSG msg;
  12. HBRUSH hBrush;
  13.  
  14. hBrush = CreateSolidBrush(RGB(, , ));
  15. WndClass.cbClsExtra = ;
  16. WndClass.cbWndExtra = ;
  17. WndClass.hbrBackground = hBrush;
  18. WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
  19. WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  20. WndClass.hInstance = G_hInst;
  21. WndClass.lpfnWndProc = WindProc;
  22. WndClass.lpszClassName = ClassName;
  23. WndClass.lpszMenuName = NULL;
  24. WndClass.style = CS_VREDRAW | CS_HREDRAW;
  25.  
  26. if (!GetClassInfo(G_hInst,ClassName,&MyWnd))
  27. {
  28. RegisterClass(&WndClass);
  29. }
  30.  
  31. hwnd = CreateWindow(ClassName, TEXT("OK"), WS_CHILD, x, y, cx, cy, ParentHwnd, NULL, G_hInst, NULL);
  32. ShowWindow(hwnd, SW_SHOW);
  33. UpdateWindow(hwnd);
  34.  
  35. //GetMessage第二个参数为NULL时,会获取所有消息。因为父窗口已经获取消息了,所以没必要再获取了
  36. /*while (GetMessage(&msg, NULL, 0, 0))
  37. {
  38. TranslateMessage(&msg);
  39. DispatchMessage(&msg);
  40. }*/
  41. return hwnd;
  42. }
  43.  
  44. LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  45. {
  46. HDC hdc;
  47. PAINTSTRUCT pt;
  48. HBRUSH hBrush;
  49. static int status;
  50. static int cx,cy;
  51.  
  52. switch (message)
  53. {
  54. case WM_CREATE:
  55. return ;
  56. case WM_SIZE:
  57. cx=LOWORD(lParam);
  58. cy=HIWORD(lParam);
  59. return ;
  60. case WM_PAINT:
  61. hdc = BeginPaint(hwnd, &pt);
  62. //TRACE(TEXT("status=%d\n"),status);
  63. if (status == )
  64. {
  65. hBrush = CreateSolidBrush(RGB(, , ));
  66. SelectObject(hdc, hBrush);
  67. Rectangle(hdc, , , cx,cy);
  68. SetBkColor(hdc, RGB(, , ));
  69. TextOut(hdc, ,, TEXT("OK"), );
  70. }
  71. else
  72. {
  73. hBrush = CreateSolidBrush(RGB(, , ));
  74. SelectObject(hdc, hBrush);
  75. Rectangle(hdc, , , cx,cy);
  76. SetBkColor(hdc, RGB(, , ));
  77. TextOut(hdc, ,, TEXT("OK"), );
  78. }
  79. EndPaint(hwnd, &pt);
  80. return ;
  81. case WM_LBUTTONDOWN:
  82. {
  83. status = ;
  84. InvalidateRect(hwnd, NULL, TRUE);
  85. SendMessage(hwnd,WM_PAINT,NULL,NULL);
  86. SendMessage(GetParent(hwnd), WM_USER + , NULL,(LPARAM)hwnd);
  87.  
  88. }
  89. return ;
  90. case WM_LBUTTONUP:
  91. status = ;
  92. InvalidateRect(hwnd, NULL, TRUE);
  93. SendMessage(GetParent(hwnd), WM_USER + , NULL,NULL);
  94. return ;
  95. case WM_DESTROY:
  96. PostQuitMessage();
  97. return ;
  98. default:
  99. break;
  100. }
  101.  
  102. return DefWindowProc(hwnd, message, wParam, lParam);
  103. }

还可以使用WIndows自身的button控件

  1. #include<Windows.h>
  2. #include<Windowsx.h>
  3.  
  4. LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
  5.  
  6. int WinMain(HINSTANCE hInst, HINSTANCE tmp, LPSTR szCmd, int nShow)
  7. {
  8. WNDCLASS WndClass;
  9. TCHAR* ClassName = TEXT("MyClass");
  10. HWND hwnd;
  11. MSG msg;
  12.  
  13. WndClass.cbClsExtra = ;
  14. WndClass.cbWndExtra = ;
  15. WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + );
  16. WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
  17. WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  18. WndClass.hInstance = hInst;
  19. WndClass.lpfnWndProc = WindProc;
  20. WndClass.lpszClassName = ClassName;
  21. WndClass.lpszMenuName = NULL;
  22. WndClass.style = CS_VREDRAW | CS_HREDRAW;
  23.  
  24. if (!RegisterClass(&WndClass))
  25. {
  26. MessageBox(NULL, TEXT("Gegister Class Fail!!"), TEXT("error"), MB_OK);
  27. return ;
  28. }
  29.  
  30. hwnd = CreateWindow(ClassName, TEXT("Hello"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, , , NULL, NULL, hInst, NULL);
  31. if (hwnd == NULL)
  32. {
  33. MessageBox(NULL, TEXT("Create Window Fail!!"), TEXT("error"), MB_OK);
  34. return ;
  35. }
  36. ShowWindow(hwnd, nShow);
  37. UpdateWindow(hwnd);
  38.  
  39. while (GetMessage(&msg, NULL, , ))
  40. {
  41. TranslateMessage(&msg);
  42. DispatchMessage(&msg);
  43. }
  44.  
  45. return ;
  46. }
  47.  
  48. LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  49. {
  50. HDC hdc;
  51. static HWND button;
  52. switch (message)
  53. {
  54. case WM_CREATE:
  55. button = CreateWindow(TEXT("button"), TEXT("OK"), WS_CHILD | WS_VISIBLE, , , , , hwnd, NULL, GetModuleHandle(NULL), NULL);
  56. //禁用按钮,按钮变灰色
  57. //Button_Enable(button, FALSE);
  58. Button_SetText(button,TEXT("测试"));
  59. return ;
  60. case WM_COMMAND:
  61. hdc = GetDC(hwnd);
  62. if (button == (HWND)lParam)
  63. {
  64. TextOut(hdc, , , TEXT("Hit Button"), );
  65. }
  66. if (BN_CLICKED == HIWORD(wParam)) //测试控件通知码
  67. {
  68. TextOut(hdc, , , TEXT("BN_CLICKED Hit Button"), );
  69. }
  70. ReleaseDC(hwnd, hdc);
  71. ValidateRect(hwnd, NULL);
  72. case WM_DESTROY:
  73. PostQuitMessage();
  74. return ;
  75. default:
  76. break;
  77. }
  78.  
  79. return DefWindowProc(hwnd, message, wParam, lParam);
  80. }

HIWORD(wParam)控件通知码

LOWORD(wParam)控件标识

lParam控件的窗口句柄

12 Windows编程——子窗口和系统内置窗口类“BUTTON”的更多相关文章

  1. windows 服务管理器使用系统内置帐户时密码的输入

    windows 服务管理器使用系统内置帐户时在选择帐户如network services后不需要输入密码,直接确认即可,系统会自动附加密码.

  2. windows 编程 —— 子窗口 与 子窗口控件

    目录: 子窗口与主窗口的交互 子窗口控件 按钮类别 button 滚动条类别 scrollbar 静态类别  static 编辑框类别 edit 清单方块 listbox 子窗口与主窗口的交互 创建窗 ...

  3. windows 编程 —— 子窗口类别化(Window Subclassing)

    对于子窗口控件,有时我们可能会想要获取子窗口的某些消息,比如在一个主窗口下有三个按钮,如果想要实现使用键盘Tab或者Shift-Tab键来使焦点切换于不同按钮之间,这时就可以使用子窗口类别化(Wind ...

  4. 【Windows编程】入门篇——win 32窗口的hello word!

    ✍  Windows编程基础 1.Win 32应用程序基本类型 1)  控制台程序 不需要完善的windows窗口,可以使用DOS窗口方式显示 2)  Win 32窗口程序 包含窗口的程序,可以通过窗 ...

  5. 16 Windows编程——系统内置窗口子类型之edit、ComboBox、ownerbutton、listbox

    edit类型的子窗口 ES_MULTILINE:多行输入文本框 窗口的消息: WL_COMMAND: EN_CHANGE:当edit窗口内的文本内容改变的时候,edit子窗口给父窗口发送一个WL_CO ...

  6. 13 Windows编程——系统内置窗口子类型之静态子窗口

    静态子窗口类型 wndclass:static 源码 #include<Windows.h> #include<Windowsx.h> HINSTANCE G_h; LRESU ...

  7. 15 Windows编程——系统内置窗口子类型之button

    button子类型BS_3STATE.BS_AUTO3STATE.BS_AUTOCHECKBOX 源码 #include<Windows.h> #include<Windowsx.h ...

  8. [Windows编程] 使用AttachThreadInput 来捕捉其它窗口的键盘输入

    在一些情况下(比如屏幕软键盘或者输入法程序),自己的窗口没有输入焦点但是想要当前焦点窗口的键盘输入消息,可以使用Win32 API函数AttachThreadInput()来解决这个问题.Attach ...

  9. 走进windows编程的世界-----对话框、文本框、button

    1 对话框的分类  2 对话框的基本使用方式  3 对话框资源  4 有模式对话框的使用 int DialogBox( HINSTANCE hInstance, LPCTSTR lpTemplate, ...

随机推荐

  1. Mac 高效 软件

    彻底卸载软件: cleanmymac 软件转移: AppDelete,选择一个软件归档,换台电脑从归档安装 finder类chrme标签页: XtraFinder

  2. es6 fetch方法请求接口

    fetch(url, { method: 'post', headers: { 'Content-type': 'application/x-www-form-urlencoded; charset= ...

  3. docker中使用Mysql8+phpmyadmin

    现在基本装这套都用docker了,有一些小坑在里面,简单说一下. 运行mysql比较简单,参考mysql⭐Docker Official Images,需要注意不要忘记暴露端口给phpmyadmin用 ...

  4. 【ARM-Linux开发】Linux查看设备驱动

    驱动操作命令: insmod / modprobe 加载驱动 rmmod                     卸载驱动 lsmod                       查看系统中所有已经被 ...

  5. Python 图形库

    1. 总体介绍 http://www.cnblogs.com/Vito2008/p/5264291.html 2.pygal http://rfyiamcool.blog.51cto.com/1030 ...

  6. EMR的fair-scheduler.xml

    cat /etc/ecm/hadoop-conf/fair-scheduler.xml <?xml version="1.0"?> <allocations> ...

  7. 系统获取 IP 工具类

    系统获取 IP 工具类 import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterf ...

  8. 强类型c语言 类型

    C 语言是一门强类型的语言,类型决定语言的特性,允许在相同类型进行运算. *强类型语言的特点:      1      先声明,后使用. 2      类型不可变. * 基本数据类型 * 数据类型的范 ...

  9. asp.net core-3.应用程序部署到iis

    asp.net core在部署到iis 上的时候,iis服务器要装一个AspNetCoreModule,网站—>模块  具体下载地址可以去网上搜索https://www.nuget.org/pa ...

  10. shell习题第20题:统计文件大小

    [题目要求] 加入需要每小时执行一个脚本.功能:当时间是0点和12点时,将/data/log/下的文件全部清空,注意只能清空文件内容而不能删除文件.而其他时间只需要统计一下每个文件的大小,一个文件一行 ...