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



我卡住了。我对MFC只有一点经验,从以前的同事那里继承了一个MFC程序。

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

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

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

  2. 我如何知道哪个端口被选中?有什么。比如返回值?

其实第二个问题最让我烦恼。

Edit1:更清楚地说:我已经知道如何获得可用com端口的列表,目前我将它们显示在一个组合框中。但是我想用菜单来代替。

这是我目前得到的。问题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);

我玩了一个程序接口到Arduino前一段时间。不同型号的Arduinos,我使用了不同的COM端口,所以我也需要扫描可用的端口。

我现在忘记了它的确切细节,但是你可以在打开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或你扫描到的任何端口号),那么你就知道它是与你的一个comport对应的菜单项。

只是有一个游戏添加动态菜单项,然后确定哪一个被选中。我不懂MFC,所以没法帮你。

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

有一些示例代码

当一个菜单命令被用户选中时,你会收到一个来自菜单的WM_COMMAND消息,参数包括所选菜单项的ID。在消息映射中放入ON_COMMAND_RANGE语句,将这些消息路由到消息处理程序函数。

最新更新