最近学习Visual studio C++的软件开发,做个串口工具,使用combo box下拉选项选择串口号,有两种方式,第一种自动添加串口号到工具代码中,比如常见的一些串口工具可以选择COM1~COM9的串口号,只需要在代码初始化的时候,加入串口号序列就可以,或者也可以在combo box属性菜单Data中添加“COM1;COM2;COM3;……COM9;”,此种办法在实际使用的时候,会比较麻烦,因为本来只有2个串口,却要在10来个序列中选择一个。
因此还有另外一种比较常见的处理方式,这种方式是在程序启动的时候自动探测系统当前有的串口号,然后将其串口号值加入到combo box控件当中,这样的话更加省事,但是代码要多写一些相关内容,通过百度,找到响应的代码。其运行效果如下,本人的计算机当前只有两个虚拟串口COM5和COM6
具体代码如下
1 BOOL CMFC_Uart20160921Dlg::CheckComPort(void) 2 { 3 long lReg; 4 HKEY hKey; 5 DWORD MaxValueLength; 6 DWORD dwValueNumber; 7 lReg = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 8 0, KEY_QUERY_VALUE, &hKey); 9 if (lReg != ERROR_SUCCESS) //成功时返回ERROR_SUCCESS, 10 { 11 AfxMessageBox(TEXT("Open Registry Error!\n")); 12 return FALSE; 13 } 14 15 lReg = RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL, 16 &dwValueNumber, &MaxValueLength, NULL, NULL, NULL); 17 18 if (lReg != ERROR_SUCCESS) //没有成功 19 { 20 AfxMessageBox(TEXT("Getting Info Error!\n")); 21 return FALSE; 22 } 23 24 TCHAR *pValueName, *pCOMNumber; 25 DWORD cchValueName, dwValueSize = 10; 26 27 for (int i = 0; i < dwValueNumber; i++) 28 { 29 cchValueName = MaxValueLength + 1; 30 dwValueSize = 10; 31 pValueName = (TCHAR*)VirtualAlloc(NULL, cchValueName, MEM_COMMIT, PAGE_READWRITE); 32 lReg = RegEnumValue(hKey, i, pValueName, 33 &cchValueName, NULL, NULL, NULL, NULL); 34 35 if ((lReg != ERROR_SUCCESS) && (lReg != ERROR_NO_MORE_ITEMS)) 36 { 37 AfxMessageBox(TEXT("Enum Registry Error or No More Items!\n")); 38 return FALSE; 39 } 40 41 pCOMNumber = (TCHAR*)VirtualAlloc(NULL, 6, MEM_COMMIT, PAGE_READWRITE); 42 lReg = RegQueryValueEx(hKey, pValueName, NULL, 43 NULL, (LPBYTE)pCOMNumber, &dwValueSize); 44 45 if (lReg != ERROR_SUCCESS) 46 { 47 AfxMessageBox(TEXT("Can not get the name of the port")); 48 return FALSE; 49 } 50 51 CString str(pCOMNumber); 52 //m_ComboComControl.AddString(str); //把获取的值加入到ComBox控件中 53 54 VirtualFree(pValueName, 0, MEM_RELEASE); 55 VirtualFree(pCOMNumber, 0, MEM_RELEASE); 56 } 57 58 return TRUE; 59 60 }
最后我们只要在初始化代码中执行上述函数,然后默认让combo box选择第一个串口就可以了
CheckComPort();
m_ComboComControl.SetCurSel(0);//让combo box的control控件选择第一个串口号
第一种办法是让combo box关联一个CString变量m_comboCom,然后再初始化函数OnInitDialog()中添加下列代码
1 m_comboCom.AddString(_T("COM1")); 2 m_comboCom.AddString(_T("COM2")); 3 m_comboCom.AddString(_T("COM3")); 4 m_comboCom.AddString(_T("COM4")); 5 m_comboCom.AddString(_T("COM5")); 6 m_comboCom.AddString(_T("COM6")); 7 m_comboCom.AddString(_T("COM7")); 8 m_comboCom.AddString(_T("COM8")); 9 m_comboCom.AddString(_T("COM9")); 10 m_comboCom.AddString(_T("COM10")); 11 //m_comboCom.AddString(_T("COM11")); 12 m_comboCom.SetCurSel(0);
或者使用控件的属性功能,如下图所示
时间: 2024-10-14 00:34:01