일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- _sprintf
- __vsnprintf
- MFC
- Mqtt
- esp-wroom-32d
- wxWidget
- ExtendWith
- git 최초 설정
- 사전설치
- 의존주입
- OpenCPN
- 확인할 수 없는 외부 기호
- git 대용량 파일
- c++ set struct
- SQLite3
- LINK2001
- c++ Broadcast
- Console
- 설치 테스트
- Plugins
- 멀티바이트 문자 집합 사용
- Flutter
- OpenCPN설치
- .gitattributes
- __snprintf
- 정적 라이브러리에서 MFC 사용
- OpenXLSX 한글
- sts4
- winsock.h Broadcast
- c2678
- Today
- Total
세상을 이롭게
[MFC] COMBOBOX에 존재하는 Comport 목록 띄우기(Feat.Registry) 본문
시리얼통신이 필요한데, 하드코딩되어있던 부분을 바꾸기위해 해보다가 포스팅합니다.
https://stackoverflow.com/questions/1388871/how-do-i-get-a-list-of-available-serial-ports-in-win32
How do I get a list of available serial ports in Win32?
I have some legacy code that provides a list of the available COM ports on the PC by calling the EnumPorts() function and then filtering for the port names that start with "COM". For testing purpo...
stackoverflow.com
스택플로우에 좋은 글이 있어 적용해보려 합니다.
https://webnautes.tistory.com/654
MFC 사용 가능한 시리얼 포트 읽어오기
노트북에 USB TO SERIAL을 이용해서 연결된 장비의 경우 시리얼포트가 고정되어 있지 않을 경우도 있고.. 고정되더라도 COM1이 아니라 엉뚱한 숫자로 매번 접속할 때 마다 장비에서 사용하는 포트를
webnautes.tistory.com
좋은 글도 있어 참고해봅니다.
이미 엔터를 친 상태에서 다시 눌렀다면 Resource.h에 등록이 된 상태라고 보시면 됩니다.
Resource.h 에 등록이 되었다는것이 무엇인지 보여드리겠습니다.
저는 클린한게 컨셉이기 때문에 Resource.h까지 수정하려합니다.(안해도 상관없다는 이야기입니다.)
무턱대고 지웠다가 뭔가 오류가 뜨고 오류목록에
Key~~ 에러가 뜨신다면 Dialog에 남아있는 객체를 지우신 겁니다.
당황하지 않고 .rc 파일에 가서 확인후 지워줍니다.(혹은 Resource.h를 복구하세요)
COMBOBOX와 매칭되는 멤버 변수를 만들도록 하겠습니다.
MFC Class Wizard 를 실행 합니다. 단축키는 Cntl + Shift + x 입니다.
즉 이 부분을 직접 써넣어 주면 MFC Class Wizard 없이도 만들 수 있다는 말입니다.
가끔 에러때문에 안되시는 분들은 이방법으로 만들어 주시면 되겠습니다.
콤보박스에 이벤트를 입혀야 겠죠. 콤보박스를 살짝 한번만 눌러줍니다. 두번 누르면 다른 이벤트를 갖게 되니까요...
우리는 DropDown이벤트를 사용하겠습니다.
ComportDlg.h 에 시리얼 포트를 가져오는 함수를 하나 선언해 주겠습니다.
당연히 선언을 했으면 구현을 해줘야 겠죠?
void CComportDlg::OnCbnDropdownComboComport()
{
getSerialPort();
}
void CComportDlg::getSerialPort(){
HKEY hKey;
RegOpenKey(HKEY_LOCAL_MACHINE,TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"),&hKey);
TCHAR szData[20];
TCHAR szName[100];
DWORD index = 0;
DWORD dwSize = 100;
DWORD dwSize2 = 20;
DWORD dwType = REG_SZ;
m_comport.ResetContent();
memset(szData,0x00,sizeof(szData));
memset(szName,0x00,sizeof(szName));
while(ERROR_SUCCESS == RegEnumValue(hKey,index,szName,&dwSize,NULL,NULL,NULL,NULL)){
index++;
RegQueryValueEx(hKey,szName,NULL,&dwType,(LPBYTE)szData,&dwSize2);
m_comport.AddString(CString(szData));
memset(szData, 0x00, sizeof(szData));
memset(szName, 0x00, sizeof(szName));
dwSize =100;
dwSize2 =20;
}
RegCloseKey(hKey);
}
코드 복사 안되신느 분들은 아래 더보기 클릭해서 복사하시면 됩니다. 이런것에 시간낭비 하지 않기를 바라면서... .
void CComportDlg::OnCbnDropdownComboComport()
{
getSerialPort();
}
void CComportDlg::getSerialPort(){
HKEY hKey;
RegOpenKey(HKEY_LOCAL_MACHINE,TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"),&hKey);
TCHAR szData[20];
TCHAR szName[100];
DWORD index = 0;
DWORD dwSize = 100;
DWORD dwSize2 = 20;
DWORD dwType = REG_SZ;
m_comport.ResetContent();
memset(szData,0x00,sizeof(szData));
memset(szName,0x00,sizeof(szName));
while(ERROR_SUCCESS == RegEnumValue(hKey,index,szName,&dwSize,NULL,NULL,NULL,NULL)){
index++;
RegQueryValueEx(hKey,szName,NULL,&dwType,(LPBYTE)szData,&dwSize2);
m_comport.AddString(CString(szData));
memset(szData, 0x00, sizeof(szData));
memset(szName, 0x00, sizeof(szName));
dwSize =100;
dwSize2 =20;
}
RegCloseKey(hKey);
}
▷ CComboBox::AddString - 스트링을 더함.
▷ CComboBox::CComboBox - ComboBox 오브젝트를 생성(구성).
▷ CComboBox::Clear -현재 선택을 지움.
▷ CComboBox::CompareItem - 새로운 리스트 항목의 상태적 위치를 결정.
▷ CComboBox::Copy - 현재 선택을 Copy.
▷ CComboBox::Create - CComboBox를 생성.
▷ CComboBox::Cut - 제거된 텍스트를 복사.
▷ CComboBox::DeleteItem- 항목이 Combo 박스에서 제거.
▷ CComboBox::DeleteString - 스트링을 제거.
▷ CComboBox::Dir - 리스트를 더함.
▷ CComboBox::DrawItem - 양상이 변할 때 불려짐.
▷ CComboBox::FindString - 첫 번째 스트링을 찾음.
▷ CComboBox::FindStringExact - 첫 번째 리스트 박스 스트링을 찾음.
▷ CComboBox::GetCount - 항목의 수를 회복.
▷ CComboBox::GetCurSel - 현재 선택된 항목의 색인을 찾음
▷ CComboBox::GetDroppedControlRect - 스크린 좌표를 되찾음.
▷ CComboBox::GetDroppedState - 리스트 박스가 보일지를 결정.
▷ CComboBox::GetEditSel - 시작과 끝나는 문자의 위치를 얻음.
▷ CComboBox::GetExtendedUI - 디폴트, 확장 사용자 인터페이스의 결정.
▷ CComboBox::GetItemData - 항목과 관련된 비트값을 회복.
▷ CComboBox::GetItemDataPtr - 포인터로서 관련된 비트 값을 회복.
▷ CComboBox::GetItemHeight - 리스트 항목의 높이를 회복.
▷ CComboBox::GetLBText - 리스트 박스로 부터 스트링을 얻음.
▷ CComboBox::GetLBTextLen - 스트링의 길이를 지정.
▷ CComboBox::InsertString - 스트링의 삽입.
▷ CComboBox::LimitText - 텍스트의 길이를 제한.
▷ CComboBox::MeasureItem - Combo 박스 치수를 결정하기 위해 불려짐.
▷ CComboBox::Paste - 현재 커서 위치에서 편집 제어로 삽입.
▷ CComboBox::ResetContent - 모든 항목의 제거.
▷ CComboBox::SelectString - 스트링을 선택, 복사.
▷ CComboBox::SetCurSel - 스트링을 선택.
▷ CComboBox::SetEditSel - 편집 제어에서 문자들을 선택.
▷ CComboBox::SetExtendedUI - 디폴트, 확장 사용자 인터페이스의 선택.
▷ CComboBox::SetItemData - 항목과 관련된 값을 정함.
▷ CComboBox::SetItemDataPtr - 포인터에 대한 관련된 값을 정함.
▷ CComboBox::SetItemHeight - 높이를 지정.
▷ CComboBox::ShowDropDown - 리스트 박스를 보여주거나 숨김.
'MFC' 카테고리의 다른 글
MFC Console 창에 로그 출력하기 (0) | 2023.12.15 |
---|---|
[MFC] MFC 프로젝트 만들기(대화 상자 기반) VS2010 (0) | 2021.07.29 |
[MFC ERROR] 다음은 유효한 C/C++ 파일이 아닙니다. (0) | 2021.04.08 |