我被困住了。我对MFC有一点经验,并继承了前同事的MFC程序。
我想在菜单栏中添加可用com端口列表,以便用户可以选择他想要的任何内容。在程序的进一步运行期间,应该锁定此菜单。
我已经创建了菜单并将其添加到我的Dialog中。但是:
如何在初始化期间动态显示可用的COM端口列表?
如何确定选择了哪个端口?有什么东西吗?像一个返回值?
实际上第二个问题最让我感到烦恼。
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);
答案 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语句,以将这些消息路由到消息处理函数。