菜单编写(VC_Win32)

http://blog.csdn.net/tcjiaan/article/details/8497535

http://blog.csdn.net/kz_ang/article/details/8130955

菜单在 .rc 文件中的格式


.rc 中的菜单格式

虽然现在微软的编译器中都会自动生成好用的 rc 资源但是还是可以了解下它内部代码的意义.

这里是不太建议直接在 .rc 文件中修改菜单因为修改了.rc 文件后还需在其他文件中修改对应地方,否则在编译中会报错.所以还是建议在编译器的资源管理器中修改对话框.

格式:

menuID MENU [,载入特性选项]

{

菜单项列表

}

说明:

  • menuID: 菜单资源标识
  • MEMU: 关键字
  • 载入特性: 
    • DISCARDABLE 当不再需要菜单时候菜单可丢弃
    • FIXED 将菜单保存在内存中固定位置
    • LOADONCALL 需要时加载菜单
    • MOVEABLE 菜单在内存中可移动
    • PRELOAD 立即加载菜单
  • 菜单项列表:
    • 弹出菜单/子菜单(POPUP)

      • 格式:

        • POPUP"子菜单名"[,选项]

          BEGIN

          …(菜单项成员)

          END

      • 说明:
        • POPUP:  关键字
        • 子菜单名:  "子菜单的名字&热键"
        • BEGIN:  子菜单中菜单项开始的标识
        • 选项:
          • MENUBARBREAK   菜单项纵向分隔标识
          • CHECKED   显示选中标识
          • INACTIVE   禁止一个菜单项
          • GRAYED   禁止一个菜单项并使其显示灰色
        • 菜单项成员:   子菜单或菜单项(定义如下所示)
        • END:   子菜单中菜单项结束的标识
    • 菜单项(MENUITEM)
      • 格式:  MENUITEM "菜单项名",菜单项标识符(ID)[,选项]
      • 说明:
        • MENUITEM:   关键字
        • 菜单项名:   "菜单项名字&热键"
        • 选项:
          • MENUBARBREAK   菜单项纵向分隔标识
          • CHECKED   显示选中标识
          • INACTIVE   禁止一个菜单项
          • GRAYED   禁止一个菜单项并使其显示灰色

菜单组成部分

  • 主菜单栏
  • 下拉式菜单框
  • 菜单项热键标识
  • 菜单项加速键标识
  • 菜单项分割线(占据菜单索引)

加载/卸载菜单


加载菜单

在 win32 界面程序中加载菜单有以下几种方式:

  • 在窗口类设计时候进行加载

    在定义 WNDCLASS 时对成员 lpszMenuName 赋予相对应的值

  • 在创建窗口时候进行加载

  • 动态加载菜单

代码示例:

.rc 资源内容

  1. IDR_MENU1 MENU
  2. BEGIN
  3. POPUP "菜单1"
  4. BEGIN
  5. POPUP "子菜单1.1"
  6. BEGIN
  7. MENUITEM "菜单项1.1.1",                    ID_40001
  8. MENUITEM "菜单项1.2.1",                    ID_40002
  9. END
  10. MENUITEM "菜单项1.2",                      ID_40003
  11. MENUITEM SEPARATOR
  12. MENUITEM "菜单项1.3",                      ID_40004
  13. MENUITEM "菜单项1.4",                      ID_40005
  14. END
  15. POPUP "菜单2"
  16. BEGIN
  17. MENUITEM "菜单项2.1",                      ID_40006
  18. MENUITEM "菜单项2.2",                      ID_40007
  19. END
  20. END

加载菜单:

  • 第一种加载方式(类设计时):

    1. WNDCLASS wndclass;
    2. ....
    3. wndclass.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1);
    4. //这里省略了窗体类创建时需要填写的其他信息.
  • 第二种加载方式(窗体创建时):

    1. HMENU hmenu;
    2. WNDCLASS wndclass;
    3. ....
    4. wndclass.lpszMenuName=NULL;
    5. //这里省略了一些窗体类的必要信息填写,和注册窗口类等操作
    6. //加载菜单到菜单句柄中
    7. hmenu=LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1));
    8. //在创建窗体时候载入菜单
    9. hwnd=CreateWindow("text","hellow world",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
    10. CW_USEDEFAULT,CW_USEDEFAULT,NULL,hmenu,hInstance,NULL);
  • 第三种加载方式(窗体创建后):

    1. HMENU hmenu;
    2. WNDCLASS wndclass;
    3. ....
    4. wndclass.lpszMenuName=NULL;
    5. //这里省略了一些窗体类的必要信息填写,和注册窗口类等操作
    6. //创建窗体
    7. hwnd=CreateWindow("text","hellow world",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
    8. CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
    9. //加载菜单到菜单句柄中
    10. hmenu=LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1));
    11. //动态的加载菜单到窗体中去
    12. SetMenu(hwnd,hmenu);

程序源码:

  1. #include<windows.h>
  2. #include"resource.h"
  3. LRESULT CALLBACK textprom(
  4. HWND hwnd,      // handle to window
  5. UINT uMsg,      // message identifier
  6. WPARAM wParam,  // first message parameter
  7. LPARAM lParam   // second message parameter
  8. );
  9. int WINAPI WinMain(  HINSTANCE hInstance,  // handle to current instance
  10. HINSTANCE hPrevInstance,  // handle to previous instance
  11. LPSTR lpCmdLine,      // pointer to command line
  12. int nCmdShow          // show state of window
  13. )
  14. {
  15. WNDCLASS wndclass;
  16. HWND hwnd;
  17. HMENU hmenu;
  18. MSG msg;
  19. //设计窗口类
  20. wndclass.cbClsExtra=0;
  21. wndclass.cbWndExtra=0;
  22. wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
  23. wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
  24. wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);
  25. wndclass.hInstance=hInstance;
  26. wndclass.lpfnWndProc=textprom;
  27. wndclass.lpszClassName="text";
  28. wndclass.lpszMenuName=NULL;
  29. //wndclass.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1);
  30. wndclass.style=CS_HREDRAW | CS_VREDRAW;
  31. //注册窗口类
  32. if(!RegisterClass(&wndclass))
  33. {
  34. MessageBox(NULL,"create windows error!","error",MB_OK | MB_ICONSTOP);
  35. }
  36. //创建无菜单资源的窗口窗口
  37. hwnd=CreateWindow("text","hellow world",WS_DLGFRAME | WS_MINIMIZEBOX | WS_SYSMENU,0,0,
  38. 500,300,NULL,NULL,hInstance,NULL);
  39. /*
  40. //载入菜单资源
  41. hmenu=LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1));
  42. //创建有菜单资源的窗口
  43. hwnd=CreateWindow("text","hellow world",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
  44. CW_USEDEFAULT,CW_USEDEFAULT,NULL,hmenu,hInstance,NULL);*/
  45. //载入菜单资源,并在窗口加载菜单资源
  46. hmenu=LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1));
  47. SetMenu(hwnd,hmenu);
  48. //显示更新窗口
  49. ShowWindow(hwnd,nCmdShow);
  50. UpdateWindow(hwnd);
  51. //消息循环
  52. while(GetMessage(&msg,NULL,0,0))
  53. {
  54. TranslateMessage(&msg);
  55. DispatchMessage(&msg);
  56. }
  57. return msg.wParam;
  58. }
  59. LRESULT CALLBACK textprom(
  60. HWND hwnd,      // handle to window
  61. UINT uMsg,      // message identifier
  62. WPARAM wParam,  // first message parameter
  63. LPARAM lParam   // second message parameter
  64. )
  65. {
  66. switch(uMsg)
  67. {
  68. case WM_DESTROY:
  69. PostQuitMessage(0);
  70. break;
  71. }
  72. return DefWindowProc(hwnd,uMsg,wParam,lParam);
  73. }

运行结果:

卸载菜单

步骤:

代码示例:

  1. HMENU hmenu;
  2. switch(uMsg)
  3. {
  4. //添加鼠标右键单击事件响应处理,即卸载菜单
  5. case WM_LBUTTONDOWN:
  6. hmenu = GetMenu(hwnd);
  7. if(hmenu != NULL)
  8. {
  9. SetMenu(hwnd,NULL);
  10. DestroyMenu(hmenu);
  11. }
  12. break;
  13. .....

运行结果:

单击鼠标右键后

菜单常用的操作



菜单项常用操作 

  • 设置默认菜单项  SetMenuDefaultItem
  • 禁止或激活菜单项  EnableMenuItem
  • 设置默认菜单项  SetMenuDefaultItem
  • 修改菜单项  ModifyMenu
  • 设置或或取消菜单项选择标志  CheckMenuItem

菜单常用操作

  • 获取子菜单句柄  GetSubMenu
  • 获得窗口主菜单句柄  GetMenu
  • 动态创建空的弹出菜单  CreateMenu
  • 删除菜单项  DeleteMenu
  • 在菜单中插入菜单项  InsertMenu
  • 在菜单尾部增加菜单项  AppendMenu

菜单索引

在编写菜单操作前还需了解个很重要的概念,即了解菜单的结构,只有了解了这个结构,才能找到对应的菜单,子菜单或菜单项进行对应的操作.因为在操作菜单时需要获得对应的菜单句柄(如在上图子菜单1.1进行插入菜单项1.3.1操作时要获得子菜单1.1句柄),或操作菜单项时要获得对应的子菜单项的菜单句柄(如让上图菜单项1.1.1禁用时候需要获得子菜单1.1的句柄).然而在获取子菜单句柄时需要子菜单索引,所以对索引号的一些规则必须要有一定的了解.

简单规则如下:

    • 菜单索引基于0开始;
    • 分隔符也算一个菜单项,所以他也占据一个索引号

即如下图所示:

两个简单样例:

  • 在上图子菜单1.1进行插入菜单项1.3.1操作

    1. //在程序源码的显示更新窗口
    2. ShowWindow(hwnd,nCmdShow);
    3. UpdateWindow(hwnd);
    4. //在程序源码的显示更新窗口后插入
    5. //插入菜单项
    6. AppendMenu(GetSubMenu(GetSubMenu(GetMenu(hwnd),0),0),MF_ENABLED,40012,"菜单项1.1.3");

    程序运行结果:

      

  • 让上图菜单项1.1.1禁用:

    1. //在程序源码的显示更新窗口
    2. ShowWindow(hwnd,nCmdShow);
    3. UpdateWindow(hwnd);
    4. //在程序源码的显示更新窗口后插入
    5. //插入菜单项
    6. AppendMenu(GetSubMenu(GetSubMenu(GetMenu(hwnd),0),0),MF_ENABLED,40012,"菜单项1.1.3");
    7. //禁用菜单项
    8. EnableMenuItem(GetSubMenu(GetSubMenu(GetMenu(hwnd),0),0),0,MF_BYPOSITION | MF_GRAYED);

    运行结果:

创建弹出菜单


步骤:

  • 载入菜单资源

    (用 GetSubMenu,非 LoadMenu 或 getMenu,因为后两种获得的菜单句柄都是主菜单的句柄,而主菜单句柄不适合用 TrackPopupMenu 显示弹出菜单,若用的是主菜单句柄作为弹出菜单句柄时候效果如下图所示)

  • 调用 TrackPopupMenu 显示弹出菜单

流程图如下:

代码示例:

.rc 资源内容

  1. /***********************************************/
  2. //主菜单
  3. IDR_MENU1 MENU
  4. BEGIN
  5. POPUP "菜单1"
  6. BEGIN
  7. POPUP "子菜单1.1"
  8. BEGIN
  9. MENUITEM "菜单项1.1.1",                    ID_40001
  10. MENUITEM "菜单项1.2.1",                    ID_40002
  11. END
  12. MENUITEM "菜单项1.2",                      ID_40003
  13. MENUITEM SEPARATOR
  14. MENUITEM "菜单项1.3",                      ID_40004
  15. MENUITEM "菜单项1.4",                      ID_40005
  16. END
  17. POPUP "菜单2"
  18. BEGIN
  19. MENUITEM "菜单项2.1",                      ID_40006
  20. MENUITEM "菜单项2.2",                      ID_40007
  21. END
  22. END
  23. /***********************************************/
  24. //弹出菜单
  25. IDR_MENU2 MENU
  26. BEGIN
  27. POPUP "弹出菜单"
  28. BEGIN
  29. MENUITEM "弹出菜单项1.1",                    ID_A_40012
  30. MENUITEM "弹出菜单项1.2",                    ID_A_40013
  31. END
  32. END

加载弹出菜单

  1. hmenuPop=GetSubMenu(LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU2)),0);

显示弹出菜单

  1. POINT p;
  2. switch(uMsg)
  3. {
  4. //添加鼠标左键单击事件响应处理,即显示弹出菜单
  5. case WM_RBUTTONDOWN:
  6. p.x=LOWORD(lParam);
  7. p.y=HIWORD(lParam);
  8. //将窗口坐标转换成屏幕坐标
  9. ClientToScreen(hwnd,&p);
  10. TrackPopupMenu(hmenuPop,TPM_LEFTALIGN | TPM_RIGHTBUTTON,p.x,p.y,0,hwnd,NULL);
  11. break;
  12. .....

程序运行结果(在鼠标右键单击后):

菜单加速键


.rc 中的菜单格式

格式:

  • 加速键ID  ACCELERATORS

    BEGIN

    键名,命令ID [,类型] [,选项]

    …  

    END

 说明:

  • 加速键ID:  一个字符串或者是1~65535之间的数字
  • ACCELERATORS:   关键字
  • BEGIN:   关键字,表示加速键列表的开始
  • 键名:   表示加速键对应的按钮,可以有3种方式定义
    • “^字母”:表示Ctrl键加上字母键.
    • “字母”:表示字母,这时类型必须指明是VIRTKEY
    • 数值:表示ASCII码为该数值的字母,这时类型必须指明为ASCII
  • 命令ID:   按下加速键后,Windows向程序发送的命令ID.如果想把加速键和菜单项关联起来,这里就是要关联期间项的命令ID
  • 类型:   用来指定键的定义方式,可以是 VIRTKEY 和 ASCII,分别用来表示“键名”字段定义的是虚拟键还是ASCII码
  • 选项:   可以是 Alt, Control 或 Shift 中的单个或多个,如果指定多个,则中间用逗号隔开,表示加速键是按键加上这些控制键的组合键.这些选项只能在类型是VIRTKEY的情况下才能使用
  • END 关键字,表示加速键列表的结束

编写菜单资源加速键

编写步骤:

  • 加载菜单加速键资源:   LoadAccelerators
  • 修改消息循环:  (即在消息循环中先把消息派送给转换菜单加速键,然后在派送给转换消息最后分配消息,如下图所示)

代码样例(为菜单项1.4增加快捷键 Crt+Alt+K):

.rc资源:

  1. IDR_ACCELERATOR1 ACCELERATORS
  2. BEGIN
  3. "K",            ID_40009,               VIRTKEY, CONTROL, ALT, NOINVERT
  4. END

加载菜单加速资源:

  1. HACCEL haccel;
  2. haccel=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR1));

更改消息循环:

  1. while(GetMessage(&msg,NULL,0,0))
  2. {
  3. if(!TranslateAccelerator(hwnd,haccel,&msg))
  4. {
  5. TranslateMessage(&msg);
  6. DispatchMessage(&msg);
  7. }
  8. }

添加菜单项1.4 事件响应:

  1. switch(uMsg)
  2. {
  3. //添加鼠标左键单击事件响应处理,即卸载对话框
  4. case WM_RBUTTONDOWN:
  5. p.x=LOWORD(lParam);
  6. p.y=HIWORD(lParam);
  7. //将窗口坐标转换成屏幕坐标
  8. ClientToScreen(hwnd,&p);
  9. TrackPopupMenu(hmenuPop,TPM_LEFTALIGN | TPM_RIGHTBUTTON,p.x,p.y,0,hwnd,NULL);
  10. break;
  11. //添加菜单响应事件
  12. case WM_COMMAND:
  13. switch(LOWORD(wParam))
  14. {
  15. //添加菜单项1.4响应事件
  16. case ID_40009:
  17. MessageBox(hwnd,"success!","test",MB_OK);
  18. break;
  19. }
  20. break;
  21. .....

程序源码:

  1. #include<windows.h>
  2. #include"resource.h"
  3. HMENU hmenuPop;//弹出菜单句柄
  4. LRESULT CALLBACK textprom(
  5. HWND hwnd,      // handle to window
  6. UINT uMsg,      // message identifier
  7. WPARAM wParam,  // first message parameter
  8. LPARAM lParam   // second message parameter
  9. );
  10. int WINAPI WinMain(
  11. HINSTANCE hInstance,  // handle to current instance
  12. HINSTANCE hPrevInstance,  // handle to previous instance
  13. LPSTR lpCmdLine,      // pointer to command line
  14. int nCmdShow          // show state of window
  15. )
  16. {
  17. WNDCLASS wndclass;
  18. HWND hwnd;
  19. HMENU hmenu;
  20. MSG msg;
  21. HACCEL haccel;
  22. //设计窗口类
  23. wndclass.cbClsExtra=0;
  24. wndclass.cbWndExtra=0;
  25. wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
  26. wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
  27. wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);
  28. wndclass.hInstance=hInstance;
  29. wndclass.lpfnWndProc=textprom;
  30. wndclass.lpszClassName="text";
  31. wndclass.lpszMenuName=NULL;
  32. //wndclass.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1);
  33. wndclass.style=CS_HREDRAW | CS_VREDRAW;
  34. //注册窗口类
  35. if(!RegisterClass(&wndclass))
  36. MessageBox(NULL,"create windows error!","error",MB_OK | MB_ICONSTOP);
  37. //创建无菜单资源的窗口窗口
  38. hwnd=CreateWindow("text","hellow world",WS_DLGFRAME | WS_MINIMIZEBOX | WS_SYSMENU,0,0,500,300,NULL,NULL,hInstance,NULL);
  39. /*
  40. //载入菜单资源
  41. hmenu=LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1));
  42. //创建有菜单资源的窗口
  43. hwnd=CreateWindow("text","hellow world",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
  44. CW_USEDEFAULT,CW_USEDEFAULT,NULL,hmenu,hInstance,NULL);*/
  45. //载入菜单资源,并在窗口加载菜单资源
  46. hmenu=LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1));
  47. SetMenu(hwnd,hmenu);
  48. //载入弹出菜单资源
  49. hmenuPop=GetSubMenu(LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU2)),0);
  50. //hmenuPop=LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU2));
  51. //显示更新窗口
  52. ShowWindow(hwnd,nCmdShow);
  53. UpdateWindow(hwnd);
  54. //加载菜单加速资源
  55. haccel=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR1));
  56. //消息循环
  57. while(GetMessage(&msg,NULL,0,0))
  58. {
  59. if(!TranslateAccelerator(hwnd,haccel,&msg))
  60. {
  61. TranslateMessage(&msg);
  62. DispatchMessage(&msg);
  63. }
  64. }
  65. return msg.wParam;
  66. }
  67. LRESULT CALLBACK textprom(
  68. HWND hwnd,      // handle to window
  69. UINT uMsg,      // message identifier
  70. WPARAM wParam,  // first message parameter
  71. LPARAM lParam   // second message parameter
  72. )
  73. {
  74. POINT p;
  75. switch(uMsg)
  76. {
  77. //添加鼠标左键单击事件响应处理,即卸载对话框
  78. case WM_RBUTTONDOWN:
  79. p.x=LOWORD(lParam);
  80. p.y=HIWORD(lParam);
  81. //将窗口坐标转换成屏幕坐标
  82. ClientToScreen(hwnd,&p);
  83. TrackPopupMenu(hmenuPop,TPM_LEFTALIGN | TPM_RIGHTBUTTON,p.x,p.y,0,hwnd,NULL);
  84. break;
  85. //添加菜响应事件
  86. case WM_COMMAND:
  87. switch(LOWORD(wParam))
  88. {
  89. //添加菜单项1.4响应事件
  90. case ID_40009:
  91. MessageBox(hwnd,"success!","test",MB_OK);
  92. break;
  93. }
  94. break;
  95. case WM_DESTROY:
  96. PostQuitMessage(0);
  97. break;
  98. }
  99. return DefWindowProc(hwnd,uMsg,wParam,lParam);
  100. }

运行结果(在单击菜单项1.4或者按下Ctrl+Alt+K的组合键时):

时间: 2024-11-09 03:16:53

菜单编写(VC_Win32)的相关文章

jQuery 简单漂亮的导航菜单

鼠标悬浮时菜单项向上移动成蓝底白字,点击之后底部会有蓝条表示当前选中项. 页面代码,菜单的每一项都是一个 div ,其中包括一个 ul 用来放置显示文字等,另一个 div 则是底部的蓝条,需要给第一项和最后一项设置不同的 class ,样式需要用到: <div id="nav"> <div class="navItem indexNavItem"> <ul class="navUl"> <li>首页

纯CSS实现二级下拉导航菜单

这是一款纯CSS菜单,二级下拉导航效果,是最简洁的CSS导航菜单,兼容性也很棒,IE7/8.火狐等都支持,而且它还是学习CSS菜单编写的典型教程,让你学会很多CSS技巧. 运行效果截图如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xm

Qt 鼠标右击菜单建立

这几天在公司进行鼠标右击菜单编写,为SoftPLC项目左边的工程树实现一个右键菜单,分别包括(新建(PPLC.SPLC).增加.删除.重命名.创建PCG文件).遇到一些问题,现在已经得到解决,分享一下: QWidget及其子类都可有右键菜单,因为QWidget有以下两个与右键菜单有关的函数: Qt::ContextMenuPolicy contextMenuPolicy () const void setContextMenuPolicy ( Qt::ContextMenuPolicy poli

Android 图像处理软件

在机器视觉实验室呆了有一年半时间了,但由于自己"任性".一直以来学习的内容都是自己来安排,我还是坚持认为没有最好和最简单的技术,只有自己喜欢的技术.不过说起来还是会觉得惭愧,经常听到师兄们谈论图像处理各种算法,可是一直到此软件诞生之前对机器视觉的知识可以说一概不知.自己研究的主要是Android系统的东西,从上层到下层都有所涉及.一直以来都想把自身所长和实验室主题联系上,这样可以多和实验室牛人沟通,也顺便刷刷存在感~由此向师兄师弟们请教一二,学了一点图像处理技术,做了一款Android

第一行代码读书笔记2+常见错误分析

总结下:?一个应用程序中,多个不同的activity之间,以及一个activity多个不同的实例间,又是怎样的通讯机制? 通常有四种: Intent用于组件之间的消息传递,可以跨进程与线程.但是跨进程需要和其他机制捆绑(比如binder). (注意:Binder机制是android中实现的进程间通信的架构) Handle 一般用于主线程(UI线程)界面的更新,通过消息传递机制来实现.(需要使用Looper).此机制一般用于线程通讯. Broadcast 一般和intent一起用,主要用于进程间通

使用jquery的trigger方法优化页面代码

我们做页面级联的时候经常会用到ajax处理数据,会为下拉菜单编写change事件. //城市和区域联动 $("#City").change(function () { var cityValue = $("#City").val(); if (cityValue == -1) { return; } $.ajax({ url: "/BI/GetAreaInfo", type: "GET", data: { Id: cityVa

52 java编程思想——创建窗口和程序片 程序片限制

52.java编程思想--创建窗口和程序片 程序片限制 出于安全缘故,程序片十分受到限制,并且有很多的事我们都不能做.您一般会问:程序片看起来能做什么,传闻它又能做什么:扩展浏览器中WEB 页的功能.自从作为一个网上冲浪者,我们从未真正想了解是否一个WEB 页来自友好的或者不友好的站点,我们想要一些可以安全地行动的代码.所以我们可能会注意到大量的限制: (1) 一个程序片不能接触到本地的磁盘.这意味着不能在本地磁盘上写和读,我们不想一个程序片通过WEB页面阅读和传送重要的信息.写是被禁止的,当然

京峰Linux Shell编程从入门到精通

课程介绍:Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令并把它送入内核去执行. -------------------课程目录------------------- <Shell编程从入门到精通> ├1.linux下shell编程基础入门_(new).mp4├2.Shell编程之变量及LAMP导航菜单编写_(new).mp4├3.Shell编程之IF条件语句各种案例演练_(new).mp4├4.使用if条件语句编写MySQL备份脚本_(new).mp4

100例SHELL脚本之六

[[email protected] ~]# cat selectmenu.sh #!/bin/bash ###menu select#########Dan Chen ######## ######2019-6-5####### PS3="Please input your choice: "while :doselect input in disk_patiton disk_use memory_use cpu_use ip_connection quitdocase $input