精华内容
下载资源
问答
  • 菜单项和菜单命令响应函数

    千次阅读 2012-03-08 16:47:23
    菜单项和菜单命令响应函数 1、创建基于单文档工程Menu,添加菜单项:IDM_TEST Test 2、通过类向导, IDM_...1、响应Test菜单项命令的顺序依次是:视图、文档类、框架类、应用程序类。 2、菜单命令消息路由的具体
      
    

    菜单项和菜单命令响应函数

    1、创建基于单文档工程Menu,添加菜单项:IDM_TEST  Test

    2、通过类向导, 为IDM_TEST在CMainFrame、CMenuView、CMenuDoc、CMenuApp下添加菜单命令响应函数,即WM_COMMAND响应函数。

    通过实验发现:

    1、响应Test菜单项命令的顺序依次是:视图、文档类、框架类、应用程序类。

    2、菜单命令消息路由的具体过程:

    ①点击某菜单项,框架类最先接到菜单命令消息。

    ②框架类把接收到得这个消息交给它的子窗口,即视图类。

    ③视图类根据命令消息映射机制查找自身是否对此消息进行了响应,如果响应了,就调用相应响应函数对这个消息进行处理,消息路由过程结束。

    ④如果视图类未对此消息响应,交给文档类,文档类同样查找自身是否对此消息进行了响应。

    ⑤如果文档类为作出响应,再交还给视图类,视图类把它交还给框架类。

    ⑥框架类查看自身,如果未响应,就把该菜单消息命令交给应用程序类进行处理。

    3、添加Test菜单项的命令响应函数后,在三处进行了添加:

    eg:在视图类中添加Test菜单命令响应函数

    ①在视图类头文件中,两个AFX_MSG注释宏间,添加了命令消息响应函数原型

    afx_msg void OnTest();

    ②在视图类的源文件中,两个AFX_MSG_MAP注释宏之间添加了ON_COMMAND宏,将菜单ID和命令响应函数关联起来。

    ON_COMMAND(IDM_TEST,OnTest)

    ③视图类源文件中有命令消息响应函数实现代码。

    相关知识注:

    1、资源ID号命名:eg:

    IDM:Menu/IDC:Cursor/IDI:Icon

    2、C*App/C*Doc都不是从CWnd派生,没有MessageBox成员函数,可以使用全局的MessageBox函数,或者使用应用程序框架的函数:AfxMessageBox

    int AfxMessageBox(LPCTSTR lpszText, UINT nType = MB_OK,

    UINT nIDHelp = 0)

    AfxMessgeBox函数后两个参数为默认值,只需给第一个参数赋值就行。

    eg:AfxMessageBox(“Hello”);

    菜单命令的路由

    Windows消息分类:

    ①标准消息:除WM_COMMAND之外,所有以WM_开头的消息都是标准消息。

    ②命令消息:以WM_COMMAND形式,来自菜单、加速键、工具栏按钮的消息。

    ③通告消息:WM_COMMAND形式,由控件产生,目的是向父窗口(通常是对话框)通知事件的发生。

    CWnd类派生于CCmdTarget类,凡是从CWnd派生的类即可接收标准消息,也可接收命令消息和通告消息。从CCmdTarget派生的类,只能接收命令消息和通告消息,不能接收标准消息。eg:该例中CMenuDoc和CWinApp都派生于CCmdTarget类,所以可以接收菜单命令消息,因为不是从CWnd类派生的,不能接收标准消息。

    消息路由

    命令消息使用的是ON_COMMAND宏,其路由过程同标准消息还是有区别的:

    ①OnWndMsg函数对消息类型判断,若是标准消息,利用一般消息映射机制,查找哪个类响应了当前消息。

    ②若是命令消息,交给OnCommand函数处理,在OnCommand函数中完成消息路由。

    ③若是通告消息,交给OnNotify函数处理。

    ④OnCommand和OnNotify最后都会调用OnCmdMsg函数。

    基本菜单操作

    1、认识菜单

     

    如图,【文件】为第一个子菜单,索引为0,【编辑】为第二个子菜单,索引为1。这些默认生成的子菜单都没有ID。

    【新建】为文件下第一个菜单项,索引为0,有自己ID:ID_FILE_NEW;

    【打印】ID为ID_FILE_PRINT,索引为5,而不是4。原因是其上有一分隔栏分隔栏在菜单项中占据索引位置。

    可以通过ID和索引访问菜单项,只能通过索引访问默认子菜单。

    2、菜单标记项

    使用示例:为【文件】子菜单中【新建】菜单项添加标记功能。

    在CMainFrame类得OnCreate函数中添加:

    GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION |

    MF_CHECKED);

    注:

    1、【文件】和【新建】索引号均为0

    2、CMenu* GetMenu() const;获得指向菜单栏的指针。GetMenu函数是CWnd类得成员函数。

    CMenu类提供许多菜单操作有关的成员函数,eg:

    CMenu* GetSubMenu(int nPos) const;获得指向nPos指定子菜单的指针

    3、为菜单项添加或移除标记的函数:

    UINT CheckMenuItem(UINT nIDCheckItem, UINT nCheck);

    nIDCheckItem指定需要处理的菜单项,取值由nCheck决定。

    nCheck指定如何设置菜单项,如何定位菜单项位置,取值为:

    MF_CHECKED:设置菜单项的复选标记

    MF_UNCHECKED:移走复选标记

    MF_BYPOSITION:根据菜单项位置访问菜单项,即第一个参数指定菜单项索引号

    MF_BYCOMMAND:根据菜单项的命令访问菜单项,即第一个参数指定菜单项命令ID

    3、默认菜单项

    菜单项粗体显示,为默认菜单项

    BOOL SetDefaultItem(UINT uItem, BOOL fByPos = FALSE);

    uItem:ID或索引,由参数2决定

    fByPos:FALSE表示参数1为ID,TRUE表为索引。

    使用示例:将【打印】设为默认菜单项

    GetMenu()->GetSubMenu(0)->SetDefaultItem(5,TRUE);

    GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_PRINT,TRUE);

    注:一个子菜单只能设定一个默认项

    4、图形标记菜单

    BOOL SetMenuItemBitmaps(UINT nPosition, UINT nFlags, const CBitmap* pBmpUnchecked, const CBitmap* pBmpChecked);

    参数一:ID或索引,由参数二决定

    参数二:MF_BYCOMMAND:参数一为ID

           MF_BYPOSITION:索引

    参数三:指定取消菜单项选中状态时位图

    参数四:指定选中时的位图

    使用示例:

    在CMainFrame类中添加成员变量:CBitmap m_bitmap

    导入或创建位图资源:ID为IDB_BITMAP1

    在CMainFrame的Oncreate函数中添加:

    m_bitmap.LoadBitmap(IDB_BITMAP1);

    GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,

    &m_bitmap,&m_bitmap)

    注:

    1、应将位图大小设置为图形标记菜单上显示的位图的尺寸,否则只显示部分。

    2、获得图形标记菜单上位图尺寸:

    int GetSystemMetrics(int nIndex);

    nIndex:指定希望获得那部分系统信息。

    值为SM_CXMENUCHECK或SM_CYMENUCHECK时,函数获取标记菜单上标记图形默认尺寸,前者表宽度,后者为高度。

    代码:

    CString str;

    str.Format(“x=%d,y=%d”,GetSystemMetrics(SM_CXMENUCHECK),

    GetSystemMetrics(SM_CYMENUCHECK));

    MessageBox(str);

    这样就可获得位图大小信息。

    5、禁用菜单项

    UINT EnableMenuItem(UINT nIDEnableItem, UINT nEnable);

    参数一:ID或索引,由参数二决定。

    参数二:可以是以下参数的组合

    MF_BYCOMMAND  MF_BYPOSITION   MF_DISABLED  MF_ENABLED  MF_GRAYED

    其中MF_DIABLED只不可用并不变灰,常将MF_DISABLED和MF_GRAYED联合使用。

    代码:CMainFrame的Oncreate函数中:

    GetMenu()->GetSubMenu(0)->EnableMenuItem(1,MF_BYPOSIONT

     | MF_DISBLED | MF_GRAYED);

    还要在CMainFrame的构造函数中将m_bAutoMenuEnable设为FALSE;

    m_bAutoMenuEnable = FALSE;

    注:

    1、原因:如果想要改变菜单项状态,就必须把m_bAutoMenuEnable设为FALSE,之后对菜单项状态的更改才起作用。

    2、将m_bAutoMenuEnable设为FALSE后,就不对ON_UPDATE_COMMAND_UI或ON_COMMAND消息进行响应处理,CMenu类的EnableMenuItem函数将能够正常工作。

    此后,原菜单项的默认设置将不起作用,需要用户设置(eg:原有的灰色项将不再为灰色)。

    6、移除和装载菜单

    1、BOOL SetMenu(CMenu* pMenu);pMenu若为NULL,当前菜单被移除。

    eg:CMainFrame的OnCreate函数中添加:

    SetMenu(NULL);//程序中菜单被移除

    2、重新装载

    CMenu menu;

    menu.LoadMenu(IDR_MAINFRAME);//IDR_MAINFRAME为菜单ID

    SetMenu(&menu);

    注:菜单资源同位图资源一样,也要加载到菜单对象中,然后调用SetMenu把菜单设置为刚刚加载的菜单对象。

    注:此处的错误:menu是一局部变量,会引发错误。

    1、方法一:将menu设为CMainFrame的成员变量

    2、方法二:使用Detach将菜单句柄同菜单对象分离,就不会受menu生存期的影响。

    即添加:menu.Detach();

    MFC菜单命令更新机制

    1、如果要在程序中设置某个菜单项的状态,通过类向导添加UPDATE_COMMAND_UI消息响应函数,然后在函数中进行相应设置。

    2、添加了UPDATE_COMMAND_UI消息响应函数后

    当要显示菜单时,操作系统发出WM_INITMENUPOPUP消息,然后由程序窗口的基类如CFrameWnd接管

    它创建一个CCmdUI对象,与程序中第一个菜单项关联,调用该对象的一个成员函数DoUpdate()。

    该函数发出CN_UPDADTE_COMMAND_UI消息,该消息带有一个指向CCmdUI对象的指针。

    这时,系统判断是否存在一个ON_UPDATE_COMMAND_UI宏去捕捉该消息。

    如果找到就交给相应消息响应函数去处理。函数中利用传递过来的CCmdUI对象去调用相应函数。

    更新完第一个菜单项后,同一个CCmdUI对象就设置为与第二个菜单项相关联,依次进行直到完成所有菜单项的设置。

    3、工具栏和菜单栏上对应项ID相同。工具栏中分隔符也占据索引。工具栏和菜单栏对应项索引值不同。

    4、菜单项的维护依赖CN_UPDATE_COMMAND_UI消息。通过在消息映射中添加ON_UPDATE_COMMAND_UI宏来捕获。

    4、使用示例:

    通过类向导为ID_EDIT_CUT添加UPDATE_COMMAND_UI响应函数。

    这样在CMainFrame类的消息映射中就添加了一个ON_UPDATE_COMMAND_UI宏。

    ON_UPDATE_COMMAND_UI(ID_EDIT_CUT,OnUpdateEditCut)

    在OnUpdateEditCut中添加:

    void CMainFrame::OnUpdateEditCut(CCmdUI* pCmdUI)

    {

        pCmdUI->Enable();//使菜单项可用

        //pCmdUI->Enable(FALSE);// 使菜单项禁用

    //此时pCmdUI指向ID_EDIT_CUT菜单项

    }

    快捷菜单

    TrackPopupMenu函数显示一快捷菜单。

    BOOL TrackPopupMenu(UINT nFlags, int x, int y, CWnd* pWnd,

    LPCRECT lpRect = NULL);

    nFlags:菜单在屏幕上显示位置

    x,y:显示位置处得x和y坐标

    pWnd:快捷菜单拥有者

    lpRect:指定一矩形区域。用户在区域内单击鼠标,快捷菜单也保持显示。设为NULL,则在快捷菜单范围外单击鼠标,菜单消失。默认值为NULL。

    示例:

    添加一菜单资源IDR_MENU1,添加相应菜单项。

    在CMenuView的OnRButtonDown函数中添加:

    CMenu menu;

    menu.LoadMenu(IDR_MENU1);

    CMenu* pPopup = menu.GetSubMenu(0);

    ClientToScreen(&point);

    pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,

    point.x, point.y, this);

    析:

    1、视窗覆盖在主框架之上,所以未在CMainFrame类中添加代码,而是在C*View类中。

    2、TrackPopupMenu中坐标是屏幕坐标,而鼠标单击处坐标是窗口客户区坐标(以程序窗口左上角为坐标原点),因此应把客户区坐标转化为屏幕坐标。

    使用ClientToScreen。

    3、this指针表明快捷菜单为视窗类所有。若让其为主框架类所有,this改为GetParent()。但这样只是给主框架类获得消息处理的机会,如果视窗类和主框架类中都有快捷菜单菜单项单击事件响应函数,视窗类中的函数会响应。

    动态菜单操作

    包括:针对弹出菜单的动态操作和针对菜单项的动态操作

    1、添加菜单项目:

    BOOL AppendMenu(UINT nFlags, UINT_PTR nIDNewItem = 0,

    LPCTSTR lpszNewItem = NULL);

    nFlags:指定新添加的菜单项目的状态信息

    nIDNewItem:参数一为MF_POPUP,nIDNewItem为顶层菜单句柄,否则为要添加的新菜单项ID。参数一为MF_SEPATATOR,nIDNewItem值被忽略。

    lpszNewItem:参数一为MF_STRING,lpszNewItem为指向要添加的新菜单项目的文本指针。参数一为MF_OWNERDRAW,lpszNewItem为指向该菜单项目的一个附加数据的指针。参数一为MF_SEPARATOR,lpszNewItem值被忽略。

    代码:

    CMenu menu;

    menu.CreateMenu();

    GetMenu()->AppendMenu(MF_POPUP,(UINT)menu.m_hMenu,”Test”);

    menu.Detach();

    析:

    1、可用menu.CreatePopupMenu();创建一弹出菜单并与menu对象关联。

    2、menu.Detach();将菜单句柄和对象分离。也可使用将menu设为CMainFrame的成员变量的方式。(解决局部变量造成的错误问题)

    3、CMenu类的成员变量m_hMenu是菜单句柄,为HMENU类型,强制转换为UINT类型。

    2、插入菜单项

    BOOL InsertMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem = 0, LPCTSTR lpszNewItem = NULL);

    nFlags在AppendMenu的nFlags基础上添加:MF_BYCOMMAND(此时nPostion为一菜单命令标识,表明在nPostion指定菜单项后添加)或MF_BYPOSITION(此时nPosition为索引值,表新添加项的位置)。

    示例:

    CMenu menu;

    menu.CreateMenu();

    GetMenu()->InsertMenu(2,MF_POPUP | MF_POSITION,

    (UINT)menu.m_hmenu,”Test”);

    //在索引2位置添加菜单子菜单Test

    menu.AppendMenu(MF_STRING,111,”Hello”);

    menu.AppendMenu(MF_STRING,112,”Well”);

    //在Test下添加菜单项

    GetMenu()->GetSubMenu(0)->AppendMenu(MF_STRING,113,”Welcome”);

    //在文件子菜单下添加菜单项Welcome

    GetMenu()->GetSubMenu(0)->InsertMenu(ID_FILE_OPEN,

    MF_COMMAND | MF_STRING,114,”VC编程”);

    //文件子菜单下,打开菜单项后添加菜单项

    GetMenu()->GetSubMenu(0)->InsertMenu(4,

    MF_POSITION | MF_STRING,115,”VC++”);

    //文件子菜单下,索引4位置添加菜单项

    menu.Detach();

    注:111为指向要添加的新菜单项的文本的指针。选择数据有什么要求?此处Hello为灰色禁用状态,若换为0,则为可用,为什么?

    3、删除菜单

    BOOL DelteMenu(UINT nPosition, UINT nFlags);

    可以删除子菜单及子菜单下一个菜单项。

    如果调用函数的是菜单栏对象,删除指定子菜单。

    如果是一子菜单对象,删除子菜单下菜单项。

    GetMenu()->DeleteMenu(1,MF_BYPOSITION);

    //删除了编辑子菜单

    GetMenu()->GetSubMenu(0)->DeleteMenu(1,MF_BYPOSITION);

    //删除了文件子菜单下的索引为1的菜单项

    4、动态添加菜单项的命令响应

    示例:Test子菜单下Hello菜单项,添加命令消息响应函数

    为a菜单项创建一菜单资源ID

    ①在Resource.h文件中,手工添加:

    #define IDM_HELLO 111

    ②原来的代码:

    menu.AppendMenu(MF_STRING,111,” Hello”);

    可以改为menu.AppendMenu(MF_STRING,IDM_A,” Hello”);

    ③为该菜单项添加命令消息响应函数

    遵循MFC消息映射机制,需要在三处进行添加。

    ⑴在响应该菜单项命令的程序类(本例为CMainFrame)头文件中添加响应函数原型。

    在声明消息映射宏(DECLARE_MESSAGE_MAP)之上,两个AFX_MSG注释宏后。(放在AFX_MSG注释宏后表示自己手动添加,放在之间是系统自动添加的)

    afx_msg void OnHello();

    ⑵在响应这个菜单项命令的程序类的源文件中消息映射表中添加消息映射。

    在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏之间,两个AFX_MSG_MAP注释宏之后。添加ON_COMMAND宏。(同样,放在AFX_MSG注释宏后表示自己手动添加,放在之间是系统自动添加的)

     

    ON_COMMAND(IDM_HELLEO,OnHello);

    ⑶原文件中添加函数体:

    void CMainFrame::OnHello()

    {

        MessageBox(“Hello clicked”);

    }

    电话本示例程序

    关键代码:

    1、创建基于单文档工程Draw

    在CDrawView类中添加成员变量:

    private:

    CString m_szText;//存输入字符

    int m_nIndex;//回车计数

    CMenu m_menu;//用于子菜单和菜单项的创建

    public:

    CStringArray m_strArray;//存储字符串,设为public是为CMainFrame类能够调用它

    2、构造函数中初始化:

    m_nIndex = -1;

    m_szText = “”;

    3、CDrawView类的OnChar函数中:

    CClientDC dc(this);

    if(0x0d == nChar)

    {

        if(0 == m_nIndex)

    {

        m_menu.CreatePopupMenu();

        GetParent()->GetMenu()->AppendMenu(MF_POPUP,

    (UINT)m_menu.m_hMenu,”PhoneBook”);

        GetParent()->DrawMenuBar();

    }

    m_menu.AppendMenu(MF_STRING,ID_PHONE1,

    m_szText.Left(m_szText.Find(‘ ‘)));

        m_strArray.Add(m_szText);

    m_szText.Empty();

    Invalidate();

    }

    else

    {

        m_szText += nChar;

        dc.TextOut(0,0,m_szText);

    {

    析:

    ①以前的示例在OnCreate函数中添加代码,OnCreate函数用于窗口的创建,再此对菜单栏的修改会立刻显示,但是窗口创建并显示完成之后,再去更改程序菜单中内容,需要对菜单栏进行重绘操作。

    CWnd类的DrawMenuBar成员函数用来完成菜单栏的重绘操作。

    ②视图没有菜单栏,对菜单栏的操作是在主框架类中,GetParent()获得视图父窗口(框架类窗口)

    ③回车后字符串清空,屏幕上的字符也要清除,用到Invalidate()

    3、还要为创建的菜单项添加消息响应函数,技巧是:

    在【帮助】子菜单后添加一系列菜单项,通过类向导添加消息响应函数,然后修改其与动态创建的PhoneBook下的菜单项关联。

    注意将函数声明和消息映射都放到注释宏外。

    4、在CMainFrame中重写OnCommand虚函数。

    OnCommand虚函数会把命令消息截获。这里我们只处理菜单项关联的命令函数,其余的仍交给基类路由。

    代码:

    int MenuCmdID = LOWORD(wParam);

    CMenuView* pView = (CMenuView*)GetActiveView();

    if(MenuCmdID >= IDM_PHONE1 && MenuCmdID <

    IDM_PHONE1+pView->m_strArray.GetSize())

    {

        CClientDC dc(pView);

        dc.TextOut(0,0,m_strArray.GetAt(MenuCmdID - IDM_PHONE1);

        return TRUE;

    }

    析:

    ①LOWORD宏取得当前消息的命令ID

    ②要用到视图类CMenuView的m_strArray成员变量,要先获得视图对象。

    CView* GetActiveView() const;

    返回一CView类型指针,程序需要CMenuView类型指针,要强制类型转换。

    ③在框架类中用到视图类类型,要在CMainFrame源文件中包含视图类头文件。

    #include “MenuView.h”

    另外,MenuView.h中引用了尚未定义的CMenuDoc类(CMenuView.cpp引用MenuView.h之所以没有问题,是因为:

    #include “MenuDoc.h”

    #include “MenuView.h”

    即在引用MenuView.h前引用了MenuDoc.h,提前获得了CMenuDoc类的定义。)

    我们可以吧MenuDoc.h的引用提前到MenuView.h中,剪切过去即可。

    ④return TRUE;的使用是因为:CMainFrame处理过命令消息后还是会把它交给基类,由基类(CFrameWnd)的OnCommand函数继续路由。CFrameWnd会把它交给程序的视图类:CMemuView。return TRUE;后就不会路由了。

     

    未知:必须手动添加命令消息响应?

    如何给添加的每个菜单项添加?

    P182有一点未看懂

     

     

     

    展开全文
  • 这些菜单项可以是ArcEngine提供的标准的命令或者工具,也可以是自定义的命令或者工具。  自定义的菜单项有两种创建方式:  1).实现IMenuDef 接口。   2). 利用ToolbarMenu实现。  下表

    ps: 该文主要翻译arcEngine提供的英文帮助文档

    1.自定义的菜单和子菜单通常用来把具有相似功能的菜单项放在一起。这些菜单项可以是ArcEngine提供的标准的命令或者工具,也可以是自定义的命令或者工具。

         自定义的菜单项有两种创建方式:
              1).实现IMenuDef 接口。 
              2). 利用ToolbarMenu实现。
         下表列出了这两种方法的不同之处。
    ImenuDefToolBarMenu
    只能包含ArcEngine提供的标准的命令或者工具作为菜单项可以包含Arcengine提供的标准组件;
    也可以包含继承了下面接口的自定义组件:
    ICommand、IMultiItem、IMenuDef、
    IPaletteDef、ToolbarMenu、ToolbarMenu、ToobarPalette
    只能放在toolBar上作为菜单可以放在toolbar上作为菜单
    可以作为对键盘或者鼠标相应的弹出菜单而出现在任何地方
    示例代码:
    class NavigationMenu implements IMenuDef{
        // Set the menu caption.
    
        public String getCaption(){
            return "Navigation";
        }
    
        //Set the menu name.
        public String getName(){
            return "Navigation";
        }
    
    
        // Set the number of menu items.
        public int getItemCount(){
            return 5;
        }
    
        /*
         *Set the implementation for every menu item.
         *Note that the number of cases in the getItemInfo() is equivalent 
         * to the number of items returned by getItemCount() method.
         */
    
        public void getItemInfo(int pos, IItemDef itemDef){
            try{
                switch (pos){
    
                    case 0:
                        itemDef.setID(ControlsMapZoomInFixedCommand.getClsid());
                        break;
                    case 1:
                        itemDef.setID(ControlsMapZoomOutFixedCommand.getClsid());
                        break;
                    case 2:
                        itemDef.setID(ControlsMapFullExtentCommand.getClsid());
                        break;
                    case 3:
                        itemDef.setID(ControlsMapZoomToLastExtentBackCommand.getClsid());
                        break;
                    case 4:
                        itemDef.setID(ControlsMapZoomToLastExtentForwardCommand.getClsid
                            ());
                        break;
                    default:
                        //Do nothing.
                }
            }
            catch (IOException ex){
                System.out.println("Exception in Custom Menu : " + ex);
                ex.printStackTrace();
            }
        }
    }
    利用toolbarMenu实现菜单
    //Instantiate ToolbarMenu.
    ToolbarMenu myToolbarMenu = new ToolbarMenu();
    myToolbarMenu.setCaption(� � �CustomMenu ");
    
    //Add standard components.
    myToolbarMenu.addItem(ControlsMapMeasureTool.getClsid(), 0,  - 1, false,
        esriCommandStyles.esriCommandStyleTextOnly); 
    
    //Add custom created commands or tools. 
    ICommand myCommand = new MyCommand(); myToolbarMenu.addItem(myCommand, 0,  - 1,
        false, esriCommandStyles.esriCommandStyleTextOnly); 
    
    //Add to the toolbar: variable pos specifies the position of the menu in the toolbar items.
    //The value -1 adds it to the end of the toolbar items.
    
    toolbarBean.addMenuItem(myToolbarMenu, pos, true, 0);



    2.环境菜单(也称上下文菜单)
         环境菜单的创建以及属性的设置与自定义菜单类似,区别在于环境菜单通常通过在某种环境下(比如鼠标点击)调用toolbarMenu.popup()来实现。
    3. 创建自定义的调色板
         右图显示的测试调色板菜单点击后的显示
         调色板与上面的菜单是类似的,不同的是调色板把所有的菜单项放在一个矩形框中,而菜单是把所有的菜单项从上到下依次排列显示。
         与自定义菜单的创建完全相似,调色板的创建也有两种方式:分别通过实现IPaletteDef接口,或者用ToolbarPalette类实现。
    4. 创建动态菜单项
         当菜单的菜单项的具体内容在程序运行前是不确定的,或者需要根据程序的状态进行变动的,MultiItems(动态菜单项)就有了用武之地。举个例子:一般word程序的File菜单的底部都会列出最近打开的文件,这些文件名就可以看作是动态菜单项。
         动态菜单项的创建需要继承IMultiItem接口,然后实现其中的四个函数:
         getName();getCaption(); 
         getItemCaption(int pos){在这用代码实现并返回根据系统运行状态变化的菜单项};
         onItemClikc(int pos){与菜单项对应的点击事件}。
    示例代码:
    public class SpatialBookmarks implements IMultiItem{
        private int activeBookmarkIndex =  - 1;
    
        //Return the MultiItem name.
        public String getName()throws IOException, AutomationException{
            return "Spatial Bookmarks";
        }
    
        //Return the MultiItem caption.
        public String getCaption()throws IOException, AutomationException{
            return "Spatial Bookmarks";
        }
    
        //Return the item caption specified by pos.
        public String getItemCaption(int pos)throws IOException, AutomationException{
            try{
                // Get focus map bookmarks.
                IMapBookmarks mapBookmarks = (IMapBookmarks)hookHelper.getFocusMap();
                // Get enumerator bookmarks.
                IEnumSpatialBookmark enumSpatialBookmarks = mapBookmarks.getBookmarks();
                enumSpatialBookmarks.reset();
                // Loop through the bookmarks to get bookmark names.
                ISpatialBookmark spatialBookmark = enumSpatialBookmarks.next();
                int bookmarkCount = 0;
                while (spatialBookmark != null){
                    // Get the correct bookmark.
                    if (bookmarkCount == pos){
                        // Return the bookmark name.
                        return spatialBookmark.getName();
                    }
                    bookmarkCount = bookmarkCount + 1;
                    spatialBookmark = enumSpatialBookmarks.next();
                }
            }
            catch (Exception e){}
            return "";
        }
    
        //Provide implementation for the onClick event for every item.
        public void onItemClick(int index)throws IOException, AutomationException{
            //Set the current active bookmark.
            this.activeBookmarkIndex = index;
            // Get the focus map bookmarks.
            IMapBookmarks mapBookmarks = (IMapBookmarks)hookHelper.getFocusMap();
            // Get enumerator bookmarks. 
            IEnumSpatialBookmark enumSpatialBookmarks = mapBookmarks.getBookmarks();
            enumSpatialBookmarks.reset();
            // Loop through the bookmarks to get bookmark to zoom to.
            ISpatialBookmark spatialBookmark = enumSpatialBookmarks.next();
            int bookmarkCount = 0;
            while (spatialBookmark != null){
                // Get the correct bookmark.
                if (bookmarkCount == index){
                    // Zoom to the bookmark.
                    spatialBookmark.zoomTo(hookHelper.getFocusMap());
                    // Refresh the map.
                    hookHelper.getActiveView().refresh();
                }
                bookmarkCount = bookmarkCount + 1;
                spatialBookmark = enumSpatialBookmarks.next();
            }
        }
    
    }

    展开全文
  • TortoiseSVN菜单项功能说明

    万次阅读 2009-03-27 16:39:00
    TortoiseSVN是windows下其中一个非常优秀的SVN客户端工具。通过使用它,我们可以可视化的管理我们的版本库。不过由于它只是一个客户端,...TortoiseSVN每个菜单项都表示什么意思01、SVN Checkout(SVN取出)点击SVN Che

    TortoiseSVN是windows下其中一个非常优秀的SVN客户端工具。通过使用它,我们可以可视化的管理我们的版本库。不过由于它只是一个客户端,所以它不能对版本库进行权限管理。

    TortoiseSVN不是一个独立的窗口程序,而是集成在windows右键菜单中,使用起来比较方便。


    TortoiseSVN每个菜单项都表示什么意思


    01、SVN Checkout(SVN取出)
    点击SVN Checkout,弹出检出提示框,在URL of repository输入框中输入服务器仓库地址,在Checkout directory输入框
    中输入本地工作拷贝的路径,点击确定,即可检出服务器上的配置库。

     

    02、SVN Update(SVN更新)
    如果配置库在本地已有工作拷贝,则取得最新版本只是执行SVN Update即可,点击SVN Update,系统弹出更新提示框,点击
    确定,则把服务器是最新版本更新下来

     

    03、Import(导入)
    选择要提交到服务器的目录,右键选择TortoiseSVN----Import,系统弹出导入提示框,在URL of repository输入框中输入
    服务器仓库地址,在Import Message输入框中输入导入日志信息,点击确定,则文件导入到服务器仓库中。

     

    04、Add(加入)
    如果有多个文件及文件夹要提交到服务器,我们可以先把这些要提交的文件加入到提交列表中,要执行提交操作,一次性把
    所有文件提交,如图,可以选择要提交的文件,然后点击执行提交(SVN Commit),即可把所有文件一次性提交到服务器上

     

    05、Resolving Conflicts(解决冲突)
       有时你从档案库更新文件会有冲突。冲突产生于两人都修改文件的某一部分。解决冲突只能靠人而不是机器。当产生冲
    突时,你应该打开冲突的文件,查找以<<<<<<<开始的行。冲突部分被标记:
    <<<<<<< filename
    your changes
    =======
    code merged from repository
    >>>>>>> revision
    Subversion为每个冲突文件产生三个附加文件:
    filename.ext.mine
    更新前的本地文件。
    filename.ext.rOLDREV
    你作改动的基础版本。
    filename.ext.rNEWREV
    更新时从档案库得到的最新版本。
    使用快捷菜单的编辑冲突Edit Conflict命令来解决冲突。然后从快捷菜单中执行已解决Resolved命令,将改动送交到档案
    库。请注意,解决命令并不解决冲突,而仅仅是删除filename.ext.mineandfilename.ext.r*文件并允许你送交。

     

    06、Check for Modifications(检查更新)
    点击Check for Modifications,系统列表所以待更新的文件及文件夹的状态.


    07、Revision Graph(版本分支图)
    查看文件的分支,版本结构,可以点击Revision Graph,系统以图形化形式显示版本分支.

     

    08、Rename(改名)
       SVN支持文件改名,点击Rename,弹出文件名称输入框,输入新的文件名称,点击确定,再把修改提交,即可完成文件改名

     

    09、Delete(删除)
       SVN支持文件删除,而且操作简单,方便,选择要删除的文件,点击Delete,再把删除操作提交到服务器

     

    10、Moving(移动)
       选择待移动的文件和文件夹;按住右键拖动right-drag文件(夹)到跟踪拷贝内的新地方;松开左键;在弹出菜单中选
    择move files in Subversion to here

     

    11、Revert(还原)
       还原操作,如刚才对文件做了删除操作,现在把它还原回来,点击删除后,再点击提交,会出现如上的提示框,点击删除后,再
    点击Revert,即已撤销删除操作,如果这时候点击提交,则系统弹出提示框:没有文件被修改或增加,不能提交

     

    12、Branch/Tag(分支/标记)
       当需要创建分支,点击Branch/Tag,在弹出的提示框中,输入分支文件名,输入日志信息,点击确定,分支创建成功,
    然后可查看文件的版本分支情况

     

    13、Switch(切换)
       文件创建分支后,你可以选择在主干工作,还是在分支工作,这时候你可以通过Switch来切换。

     

    14、Merge(合并)
       主干和分支的版本进行合并,在源和目的各输入文件的路径,版本号,点击确定。系统即对文件进行合并,如果存在冲
    突,请参考冲突解决。

     

    15、Export(导出)
       把整个工作拷贝导出到本地目录下,导出的文件将不带svn文件标志,文件及文件夹没有绿色的”√”符号标志。

     

    16、Relocate(重新定位)
       当服务器上的文件库目录已经改变,我们可以把工作拷贝重新定位,在To URL输入框中输入新的地址

     

    17、Add to Ignore List(添加到忽略列表)
       大多数项目会有一些文件(夹)不需要版本控制,如编译产生的*.obj, *.lst,等。每次送交,TortoiseSVN提示那些文
    件不需要控制,挺烦的。这时候可以把这些文件加入忽略列表。

     

    18、SVN其它相关功能
       客户端修改用户密码:
       打开浏览器,在地址栏内输入
    http://192.168.1.250/cgi-bin/ChangePasswd,启动客户端修改用户密码的界面,输入正确的用户名,旧密码,新密码(注意密码的位数应该不小于6,尽量使用安全的密码),点击修改即可.

     

    19、SVN Commit(版本提交)
    把自己工作拷贝所做的修改提交到版本库中,这样别人在获取最新版本(Update)的时候就可以看到你的修改了。

     

    20、Show log(显示日志)
    显示当前文件(夹)的所有修改历史。SVN支持文件以及文件夹独立的版本追溯。

     

    21、Repo-Browser(查看当前版本库)
    查看当前版本库,这是TortoiseSVN查看版本库的入口,通过这个菜单项,我们就可以进入配置库的资源管理器,然后就可
    以对配置库的文件夹进行各种管理,相当于我们打开我的电脑进行文件管理一样。

     

    22、Revision Graph(版本图形)
    查看当前项目或文件的修订历史图示。如果项目比较大型的话,一般会建多个分支,并且多个里程碑(稳定版本发布),通
    过这里,我们就可以看到项目的全貌。

     

    23、Resolved(解决冲突)
    如果当前工作拷贝和版本库上的有冲突,不能自动合并到一起,那么当你提交修改的时候,tortoisesvn就会提示你存在冲
    突,这时候你就可以通过这个菜单项来解决冲突。冲突的解决有两种,一种是保留某一份拷贝,例如使用配置库覆盖当前工作拷贝,或者反过来。还有一种是手动解决冲突,对于文本文件,可以使用tortoiseSVN自带的工具,它会列出存在冲突的地方,然后你就可以和提交者讨论怎么解决这个冲突。同时它也对Word有很好的支持

     

    24、Update to Revision(更新至版本)
    从版本库中获取某一个历史版本。这个功能主要是方便查看历史版本用,而不是回滚版本。注意:获取下来之后,对这个文
    件不建议进行任何操作。如果你做了修改,那么当你提交的时候SVN会提示你,当前版本已失效(即不是最新版本),无法提交,需要先update一下。这样你所做的修改也就白费了。

     

    25、Revert(回滚)
    如果你对工作拷贝做了一些修改,但是你又不想要了,那么你可以使用这个选项把所做的修改撤销

     

    26、Cleanup(清除状态)
    如果当前工作拷贝有任何问题的话,可以使用这个选项进行修正。例如,有些文件原来是版本控制的,但是你没有通过
    tortoiseSVN就直接删除了,但是tortoiseSVN还是保留着原来的信息(每个文件夹下都有一个.svn的隐藏文件夹,存放着当前文件夹下所有文件夹的版本信息)所以这就会产生一些冲突。可以使用cleanup来清理一下。

     

    27、GetLock/ReleaseLock(加锁/解锁)
    如果你不想别人修改某个文件的话,那么你就可以把这个文件进行加锁,这样可以保证只有你对这个文件有修改权。除非你
    释放了锁,否则别人不可能提交任何修改到配置库中

     

    28、Branch/tag(分支/标签)
         Branch是分支的意思。例如当在设计一个东西的时候,不同的人有不同的实现,但是没有经过实践检验,谁也不想直
    接覆盖掉其他人的设计,所以可以引出不同的分支。将来如果需要,可以将这些分支进行合并。
         tag是打标签的意思。通常当项目开发到一定程度,已经可以稳定运行的时候,可以对其打上一个标签,作为稳定版。
    将来可以方便的找到某个特定的版本(当然我们也可以使用版本号来查找,但是数字毕竟不方便)
    SVN对于分支和标签都是采用类似Linux下硬链接的方式(同一个文件可以存在两个地方,删除一个不会影响另一个,所做修
    改会影响另一个),来管理文件的,而不是简单的复制一份文件的拷贝,所以不会有浪费存储空间的问题存在。

     

    29、Export(导出)
    这个功能是方便我们部署用。当我们需要发布一个稳定版本时,就可以使用这个功能将整个工程导出到某个文件夹,新的文
    件夹将不会包含任何版本信息了。

     

    30、Relocate(版本库转移)
    当我们版本库发生转移的时候就需要用到这个功能了。例如我原先的版本库是建在U盘上的,现在转移到(复制整个配置库
    文件夹)开发服务器上,使用https代替文件系统的访问。因此就需要将原来的工作拷贝的目标版本库重新定位到开发服务器上。

     

    31、create patch(创建补丁)
    创建补丁。如果管理员不想让任何人都随便提交修改,而是都要经过审核才能做出修改,那么其他人就可以通过创建补丁的
    方式,把修改信息(补丁文件)发送给管理员,管理员审核通过之后就可以使用apply patch提交这次修改了。

    展开全文
  • UBOOT通用菜单menu的实现

    千次阅读 2017-12-26 11:28:35
    最近研究uboot代码时发现,其实uboot(版本2016)代码中有一个菜单框架,以及使用这个框架的一个具体例子,可以根据自己的需要进行适当的修改,用起来非常方便。 2.具体实现 菜单框架代码位于/common/menu.c文.....
    1. 概述
    在uboot中经常需要开发一个菜单,用来进行一些选项类的操作,如下图所示
    网上有很多介绍菜单的开发方法,但很多都是自己开发,没有统一的开发框架。最近研究uboot代码时发现,其实uboot(版本为2016)代码中有一个菜单框架,以及使用这个框架的一个具体例子,可以根据自己的需要进行适当的修改,用起来非常方便。
    2.具体实现
    菜单框架代码位于/common/menu.c文件中,这个是一个菜单框架,提供了对外的一些使用接口。
    使用这个框架代码的实例代码是位于/cmd/bootmenu.c,里面通过使用框架,完成了一个简单的菜单
     
    但这个实例代码在实际使用过程中,个人认为存在几个不足
    1.每个菜单项都是以环境变量的方式保存,不是很直观
    2.执行命令时,只能是调用run_command()执行基本的boot命令,不能将菜单和具体的某个实现函数关联到一起。
    3.不能进行菜单的级联
    4.执行完菜单选项后,不能继续回到当前菜单界面。
     
    针对上面的几个问题,把bootmenu.c中的代码修改一下,就可以实现一个很方便的菜单。
    修改的思路如下:
    1.bootmenu_create()函数
    源代码是通过对环境变量解析,循环获取bootmenu_entry,然后创建entry。entry中,有两个关键字段title和command,主要对这两个字段进行赋值。也就是完成对"key-value"的一个映射。
    修改点:
    通过环境变量定义菜单的选项,非常不直观,通过以下方式自定义一个结构体,看起来就直观很多。
    struct  bootmenu_item
    {
         char  title[64];              /* title of entry */
         char   command_key [64];        /* hush command of entry */
         void  (* command_fun ) ( void );
    };
    static   struct  bootmenu_item  items [] = {
         { "Modify Net Parameters" "modify_net_paras" , modify_net_paras},
         { "Download Boot" "download_boot" , download_boot},
         { "Download Image" "download_image" , download_image},
         { "Download DTB" "download_dtb" , download_dtb},
         { "U-Boot console" , ENTER_CONSOLE, enter_console},
         { "Exit" , EXIT_MENU, exit_menu},
    };
     
    通过定义一个bootmenu_item 类型的数组,直观的展现菜单选项的内容。bootmenu_create()中将解析环境变量修改为解析定义的数组即可。
     
    2.bootmenu_show()函数
    源代码在确定用户选择的entry后,选择该entry的command字符串,然后执行run_command(command, 0)命令,完成命令的执行。
    修改点:
    通过上面自定义的结构体,完成一个 command_keycommand_fun的映射。然后自己实现一个exec_command)()函数。由于框架帮我们匹配到了command_key,所以该函数主要是通过key找到对应的fun函数并执行。
    static   void  exec_command( char  *command_key)
    {
         int  i = 0;
         for  (i = 0; i <  sizeof (items) /  sizeof ( struct  bootmenu_item); i++)
         {
             if  (! strcmp (items[i].command_key, command_key))
             {
                 items[i].command_fun();
                 break ;
             }
         }
    }
     
    3.bootmenu_show()函数
    源码中,在执行完命令后,函数直接返回,那么菜单也不再显示,直接进入了uboot命令行界面。
    修改点:
    在执行完后,如果有些选项,我们需要再次显示,那么可以通过goto语句,跳到该函数的入口处,重新执行整个流程,从而打印出了整个菜单。
     
    通过以上的修改,就实现了利用uboot中的菜单框架,自定义实现了自己的uboot菜单,非常方便。
    展开全文
  • 我们在使用各种软件时,常常可以发现,许多软件在资源管理器的右键菜单中增加了自己的功能菜单,比如WinRAR、WinZIP、7Z等压缩软件等。本文将介绍如何编程实现增加自己的右键菜单。 阅读本文要求读者熟悉VC,了解COM...
  • VC(6.0-2010)中已经指明UPDATE_COMMAND_UI就是用来设置菜单命令按钮的状态的。 完全没有必要这样(会产生异常):  CMenu* menu =GetMenu();//经验证VC6.0中应该是 CMenu* menu =AfxGetMainWnd()->GetMenu(); ...
  • MFC应用程序中enable或disable菜单项

    千次阅读 2013-07-19 20:37:06
    在MFC应用程序中需要enable... 根据以往的经验,要解决这种问题,似乎应该有一个象EnableMenuItem之类的API函数,它的功能就是enable或disable菜单项。Windows中确实有这样的函数-但不是在MFC的应用中(经测试不能达到
  • 包含的基本属性有id,type和contextmenu—它指定了菜单类型是context,同时也指定了新的菜单项应该被显示的区域。 在示例中,当右击鼠标时,新的菜单项将出现在文档的任何地方,因为我们指定它的作用区域是body。 ...
  • 用MFC创建菜单按钮

    千次阅读 2008-03-24 16:53:00
    现在有不少的软件都有这样的一种界面效果:当用户单击某一个按钮之后,并不是简单地执行某种功能或弹出一个对话框,而是在按钮旁边弹出一个菜单,让用户作更详细地选择,这在某种程度上就代替了简单的对话框,而且较...
  • 本文通过多个操作示例,逐步向读者展示如何将自己喜欢的功能添加到鼠标右键菜单中。 ...操作:新增xxxcmd(将其默认值改自己喜欢的,如“命令提示符打开cmd_”),然后在其下新增command子项
  • 编写一个显示菜单的shell程序,利用函数实现简单的菜单功能,n的值由键盘输入: (1)计算1到n的奇数之和 (2)计算1到n的阶乘 (3)计算1到n的所有素数 (4)退出程序 Please enter function select and number: 1 ...
  • MFC菜单、子菜单、菜单项的控制

    千次阅读 2013-11-04 14:40:12
    [cpp] view plaincopyprint? ... CMenu::LoadMenu //加载一个菜单  BOOL LoadMenu( LPCTSTR lpszResourceName ); CWnd::GetMenu //获取菜单栏  CMenu* GetMenu( ) const; CMen
  • SVN命令的使用和功能详解

    万次阅读 2016-05-13 16:31:26
    命令的使用 1、检出 svn  co http://路径(目录或文件的全路径) [本地目录全路径]  --username 用户名 --password 密码svn co svn://路径(目录或文件的全路径) [本地目录全路径] --username用户名 --...
  • 在linux中可以通过nautilus-open-terminal很方便的在文件夹中打开终端(打开终端终端自动进入当前所在的路径),充分的利用了gui直观方便的特点,省去了大量切换路径的功夫。那么,在windows下是否可以做同样的...
  • 在VS中动态添加,删除菜单项

    千次阅读 2016-09-07 12:00:28
    在VC6.0中动态添加或者菜单项,是很容易的,有API可以直接操作. 有关菜单的操作主要用到CMenu类,当然也可用相应API函数,CMenu类只是MFC对API中操作菜单的函数的封装而已 不过能用类就尽量用类,类的组织方式好呗,...
  • 默认情况下,系统菜单只包括移动、关闭和关于对话框菜单项,本例是如何在系统菜单中添加自己的菜单项。 主要函数: 本例中主要用到的函数有两个:GetSystemMenu和AppendMenu 1、GetSystemMenu 函数功能:该函数...
  • 注意下:我的这套过滤只能用在nt6系统上 原因是使用一个nt6上才有的函数 见函数 PsGetProcessFullName 其实没必要自己来写获取全路径 因为minifilter已经给...在监控创建的时候,我在卸载post中的,我拒绝,在弹窗,2-3
  • SVN之右键菜单功能

    千次阅读 2016-08-16 11:17:38
    TortoiseSVN是windows下其中一个非常优秀的SVN客户端工具。通过使用它,我们可以可视化的管理我们的版本库。不过由于它只是一个客户端,所以它不...TortoiseSVN每个菜单项都表示什么意思 01、SVN Checkout(SVN取出
  • windows常用命令行命令

    万次阅读 多人点赞 2017-08-31 11:16:21
    注:/c表示执行完命令后关闭cmd窗口;/k表示执行完命令后保留cmd窗口 # 控制台命令窗口中一些技巧 复制内容:右键弹出快捷菜单,选择“标记(K)”,然后选中所需复制的内容,然后右键即可 粘贴内容:右键弹出快...
  • VC菜单编程知识

    千次阅读 2013-08-15 10:49:53
    顶层菜单项---顶层菜单里面的命令项(菜单项) 下拉菜单-----顶层菜单项被单击时出现的菜单 弹出菜单-----这种菜单很像下拉菜单,但是可以在屏幕任意位置弹出 菜单项-------出现菜单里的命令项  2.创建菜单的方法 1...
  • oled多级菜单实现方法

    万次阅读 多人点赞 2016-05-26 18:52:50
    主要是以结构体基础设计的,以12864显示函数代替了用户需要的函数功能,只需要修改相应的函数和索引号,就可以达到任意界面切换了是小弟研究了还久才搞定的,虽然网上也有这些,但是都不够系统,只有基本的东西,...
  • LearnVSXNow! #13- VS IDE中的菜单命令

    千次阅读 2014-01-15 22:15:54
    #13- VS IDE中的菜单命令  几乎所有的VSPackage都有用户交互,用户可以通过点击Visual Studio中的菜单或工具栏来激活VSPackage的功能或显示相关的界面。  在这一篇文章里,我们来看一下Visual Studio的菜单和...
  • Qt菜单栏、工具栏、状态栏介绍及工具栏action的动态增删显示实现方式 版本说明 版本 作者 日期 备注 0.1 loon 2018.11.12 初稿 目录 文章目录Qt菜单栏、工具栏、状态栏介绍及工具...
  • MATLAB制作GUI(2)-菜单切换功能

    千次阅读 多人点赞 2019-02-19 22:42:22
    在第一篇中我们已经介绍了基本GUI的... 创建两个菜单,在菜单属性栏中我们可以修改菜单的名称、标记,添加快捷方式等功能:   修改完成之后,点击查看按钮进行保存。 再次进入GUI编辑界面,这时我们创建一个...
  • 用Excel也能实现和Python数据分析一样的功能! 这是一篇关于如何用excel做数据分析的案例。目的是帮助大家,在遇到小型数据样本时,快速利用excel做分析。所以本篇文章的重点是分析思路+数据处理+可视化的实现,...
  • QT 菜单栏 工具栏 Qaction的创建

    千次阅读 2017-07-10 11:51:13
     应用程序可以通过菜单,工具栏按钮以及键盘快捷键来调用通用的命令。由于用户期望每个命令都能以相同的方式执行,而不管命令所使用的用户界面, 这个时候使用action来表示这些命令就显得十分有用。  Action
  • PB调用windowsAPI给菜单项添加位图

    千次阅读 2011-04-03 12:21:00
    摘要:本文介绍了一个利用Windows API函数来制作位图菜单的方法,具有较强的实用价值。 <br /> 关键词:Windows API;...然而,我们经常希望最终用户提供一些PowerBuilder并不能提供的功能
  • 实现功能:下拉菜单中是人名,两个文本框分别用来盛放性别、年龄,选中人名,性别年龄随之显示出来mydb数据库中存放mytab表,mytab表中的内容如下namesexagexiaoaman12xiaobwoman11xiaocman13mytab 思路:...
  • 摘 要:本文介绍了通过分析windows快捷方式扫描目录以及使用脚本语言结合批处理命令创建快捷方式的方法达到在“开始”菜单“运行”选项里输入自定义 “命令实现通过输入命令的方式打开/运行任文件(程序、文件及...
  • 浅谈C# WinForm中实现基于角色的权限菜单 作者:CodingMouse 日期:2008年12月14日 转载请注明文章来源:...基于角色的权限菜单功能实现在有开发经验的程序员看来仅仅是小菜一碟,然而

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 56,747
精华内容 22,698
关键字:

创建菜单后为实现菜单项的命令功能