MFC对话框菜单中的可用COM端口列表

时间:2014-06-23 16:49:12

标签: c++ mfc

我被困住了。我对MFC有一点经验,并继承了前同事的MFC程序。

我想在菜单栏中添加可用com端口列表,以便用户可以选择他想要的任何内容。在程序的进一步运行期间,应该锁定此菜单。

我已经创建了菜单并将其添加到我的Dialog中。但是:

  1. 如何在初始化期间动态显示可用的COM端口列表?

  2. 如何确定选择了哪个端口?有什么东西吗?像一个返回值?

  3. 实际上第二个问题最让我感到烦恼。

    EDIT1: 更清楚:我已经知道如何获取可用的COM端口列表,目前我在组合框中显示它们。但我想用菜单代替它。

    Edit2:这是我到目前为止所得到的。问题1解决了!

    //create a menu object for main menu
    CMenu *menu = new CMenu();
    menu->CreateMenu();
    
    //another menu object for submenu
    CMenu *subMenu = new CMenu();
    subMenu->CreateMenu();
    
    //create subsubmenus
    CMenu *ComPortSelect = new CMenu();
    CMenu *ModeSelect = new CMenu();
    ComPortSelect->CreateMenu();
    ModeSelect->CreateMenu();
    //append available ports (portlist created earlier)
    for (INT_PTR i = 0; i < portlist.GetCount(); i++)
    {
        ComPortSelect->AppendMenu(MF_POPUP, ID_SHOW, portlist[i]);
    }
    ModeSelect->AppendMenu(MF_POPUP, ID_SHOW, _T("User"));
    ModeSelect->AppendMenu(MF_POPUP, ID_SHOW, _T("Expert"));
    //append subsubmenu to submenu
    subMenu->AppendMenu(MF_POPUP | MF_STRING, (UINT)ComPortSelect->m_hMenu, _T("ComPorts"));
    subMenu->AppendMenu(MF_POPUP | MF_STRING, (UINT)ModeSelect->m_hMenu, _T("Mode"));
    //append submenu to menu
    menu->AppendMenu(MF_POPUP | MF_STRING, (UINT)subMenu->m_hMenu, _T("Advanced"));
    SetMenu(menu);
    

2 个答案:

答案 0 :(得分:0)

我在前一段时间与一个程序连接到Arduino。我使用不同COM端口的不同型号的Arduinos,因此我还需要扫描可用的端口。

我现在忘记了它的确切细节,但是我打开COM端口时使用一种语法,我想是大约8或10,而对于任何更高编号的端口都是不同的。幸运的是,适用于较高编号端口的语法也适用于编号较低的端口 - 我的代码使用编号较高的端口语法,并且可以正常工作。

我用于非mfc win32项目的代码如下:

void initPortCombo(HWND combo)
{
    int curPort;
    char mPortName[16];
    HANDLE hCom;

    for (curPort=1; curPort<=20; curPort++)
    {
        sprintf(mPortName, "\\\\.\\COM%d", curPort);
        hCom = CreateFile(mPortName, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
        if (hCom != INVALID_HANDLE_VALUE)
        {
            sprintf(mPortName, "COM%d", curPort);
            CloseHandle(hCom);
            SendMessage(combo, CB_ADDSTRING, 0, (LPARAM)mPortName);
        }
    }
}

关于第二个问题,当您动态添加菜单选项时,需要指定菜单项具有的ID。因此,考虑到这一点,当您的WM_COMMAND处理程序触发时,您只需要反转添加菜单项时使用的逻辑。

例如,如果为菜单项指定ID(4000 + com_port_number),则可以从触发WM_COMMAND处理程序的控件的ID中减去4000。如果这导致有效数字(我猜是从1到20或您扫描到的任何端口号),那么您知道它是与您的某个com-port对应的菜单项。

只需添加动态菜单项,然后确定选择了哪一项。我不是MFC,所以无法帮助你。

答案 1 :(得分:0)

查找已安装的COM端口的一种方法是调用GetDefaultCommConfig API。在http://www.naughter.com/enumser.html

有一些示例代码

当用户选择菜单命令时,您会从菜单中收到WM_COMMAND消息,其中的参数包含所选菜单项的ID。您在消息映射中放置了一个ON_COMMAND_RANGE语句,以将这些消息路由到消息处理函数。