본문 바로가기

전체 글879

MFC ] 다이얼로그 종료시 함수 호출 순서 OnClose, OnDestory, PostNcDestroy X 버튼을 눌러서 다이얼로그를 종료한경우 OnSysCommand start OnClose OnSysCommand end DestroyWindow start OnDestroy DestroyWindow end OnNcDestroy start PostNcDestroy OnNcDestroy end EndDialog(), OnOk(), OnCancel() 등을 이용하여 다이얼로그를 종료한경우 DestroyWindow start OnDestroy DestroyWindow end OnNcDestroy start PostNcDestroy OnNcDestroy end 출처 : https://wendys.tistory.com/117 보다시피 WM_CLOSE 메시지의 핸들러인 OnClose()는 EndDialog(), On.. 2022. 7. 15.
MFC ] CString 문자열 파싱하는 여러 방법 2022.07.14 - [프로그래밍/MFC (C++)] - MFC ] stringstream 사용하여 문자열 파싱하기 일전에 CString 타입을 string 타입으로 바꾸고 stringstream을 사용해서 파싱하는 방법에 대한 글을 적었는데 다른 방법도 있다. 1. AfxExtractSubString 을 사용하는 방법 int lineCount; lineCount = result.Replace('\n',','); for (int i = 0; i < lineCount; i++) { CString tmpID, tmpName, tmpAuthor, tmpPrice, tmpOther; AfxExtractSubString(tmpID, result, 5 * i + 0, ','); AfxExtractSubString.. 2022. 7. 14.
STM32 ] SysTick Timer Callback 함수 사용하기 이전에 분명 정리한 거 같은데 기록이 없어서 정리용도로 빠르게 테스트해봄 HAL_GetTick 함수를 따라가 보면 uwTick을 리턴하는 것으로 되어있다. 이 uwTick이 SysTick 타이머 클락 소스로 1밀리초마다 카운트되고 HAL_Delay 함수도 이 uwTick을 사용하고 있다. Drivers - STM32F4xx_HAL_Driver - Src - stm32f4xx_hal_cortex.c 파일에 가면 아래와 같이 있다. 그중에 HAL_SYSTICK_IRQHandler() 함수를 가져와 stm32f4xx_it.c 에 있는 SysTick_Handler() 함수 안에 넣는다. 그리고 아까 IRQHandler() 함수 바로 아래 있던 HAL_SYSTICK_Callback 함수를 가져와 전역구간에서 재정.. 2022. 7. 14.
MFC ] 리스트 컨트롤 제일 하단으로 내리는 법 m_list.SendMessage(WM_VSCROLL, SB_BOTTOM); 아래는 리스트 컨트롤 새로고침 시마다 자동으로 아래로 내려가게끔 한 것 2022. 7. 14.
MFC ] stringstream 사용하여 문자열 파싱하기 예제코드 CString result; string str = CT2CA(result); istringstream ss(str); string line; int i = 0; while(getline(ss, line, '\n')) { istringstream linestream(line); string cell; getline(linestream, cell, ','); m_list.InsertItem(i, cell.c_str()); int j = 0; while (getline(linestream, cell, ',')) { m_list.SetItem(i, j, LVIF_TEXT, cell.c_str(), NULL, NULL, NULL, NULL); j++; } i++; } '\n' 와 ',' 로 구분하는 형.. 2022. 7. 14.
MFC ] char* -> CString , CString -> char* 변환하기 char* -> CString 변환 char* h1 = "hello"; CString h2 = h1; 그냥 대입해주면 된다 = 연산자 오버로딩이 되어있기 때문이다. CString -> char* 변환 방법1 char* h1 = "hello"; CString h2 = h1; CString w1 = _T("world"); char* w2 = LPSTR(LPCTSTR(w1)); 방법2 CString w1 = _T("world"); char* w2 = w1.GetBuffer(0); 2022. 7. 14.
MFC ] MySQL 을 활용한 도서 관리 프로그램 (1) 깃허브 주소 : https://github.com/joeteo/bookManagerMFCandMysql.git GitHub - joeteo/bookManagerMFCandMysql Contribute to joeteo/bookManagerMFCandMysql development by creating an account on GitHub. github.com 자료 추가 및 선택 행 삭제 기능 구현 먼저 이전에 쓴 글을 참조해서 데이터 베이스를 생성하고 MySQL 라이브러리를 포함 시킨다. 2022.07.13 - [프로그래밍/MFC (C++)] - MFC ] Visual Studio에서 MySQL 라이브러리 추가하기 2022.07.13 - [데이터베이스] - MySQL ] HeidiSQL 기본 사용법 CM.. 2022. 7. 14.
MFC ] 시리얼 통신으로 LED 제어하기 (2) 이전 버전을 개선하였다. 2022.07.09 - [프로그래밍/MFC (C++)] - MFC ] 시리얼 통신으로 LED 제어하기 (1) MFC ] 시리얼 통신으로 LED 제어하기 (1) 깃허브 주소: https://github.com/joeteo/LEDSerialCMD GitHub - joeteo/LEDSerialCMD Contribute to joeteo/LEDSerialCMD development by creating an account on GitHub. github.com https://github.com/joeteo/.. eteo.tistory.com 깃허브 주소: https://github.com/joeteo/MFC_test01.git GitHub - joeteo/MFC_test01 Contri.. 2022. 7. 13.
MySQL ] HeidiSQL 기본 사용법 암호를 누르고 열기 세션명에서 오른쪽 클릭 - 데이터베이스 새로 생성 데이터 베이스에서 오른쪽 클릭 - 테이블 새로 생성 테이블을 클릭하고 컬럼을 추가하며 설정을 해준다. 정수는 INT형 문자열은 VARCHAR 문자 인코딩은 utf-8로 한다. 그 밖의 길이나 부호, NULL 허용, 0으로 채움 등 필요한 설정을 하고 디폴트값을 정해둘 수 있다. id와 같이 중복되면 안되는 기본키는 기본값을 자동으로 1씩 증가하게 AUTO_INCREMENT로 설정하고 프라이머리 키로 설정해준다. 반드시 테이블의 설정을 변경한 후 저장해줘야 적용이 된다. CRUD (Create, Read, Update, Date) 기본 쿼리문 예제 쿼리문을 입력하고 재생버튼을 누른 뒤 데이터 탭에 가서 F5를 눌러야 변경된 데이터가 보인.. 2022. 7. 13.
MySQL ] HeidiSQL 외부 접속 계정 추가하기 HeidiSQL 에서 사용자 인증 및 권한 관리 사용자 계정 추가 - 모든 곳에서 접근 허용 객체 추가로 특정 db에 대한 권한만 전체 허용 저장. 설정 끝. 일전에 올린적 있는 MysqlController.h 에 선언된 호스트 IP, User, Password, DB Name 등을 수정하면 MFC 프로그램으로 외부 DB에 접속해 관리할 수 있다. 2022. 7. 13.
MFC ] DoModal() 창 닫기, 강제 종료 this->EndDialog(IDCANCEL); 혹은 EndDialog(0); 해도 된다. 중요. 창 종료와는 별개로 할당받은 건 해제해줘야 한다. 참고. Modeless 모달리스 인 경우 창 생성시 DoModal() 대신 Create() 로 다이얼로그 생성하고 닫을 땐 EndDialog() 대신 DestroyWindow() 로 다이얼로그를 닫는다. 참고. 2022. 7. 13.
MFC ] 리스트 컨트롤에서 클릭된 아이템 값 가져오기 1. 클릭된 인덱스 알아내기 리스트 컨트롤 자체의 멤버변수인 .GetSelectionMark(); 을 사용한다. int clickindex = m_list.GetSelectionMark(); 아무것도 안눌렸을 때는 -1 반환 리스트 컨트롤 오른쪽 클릭 후 이벤트 처리 함수 추가 클래스 목록을 주의해서 확인하고 NM_CLICK을 선택한다. 생성된 함수안에 아래와 같이 입력한다. /* void CbookManagerDlg::OnNMClickList1(NMHDR* pNMHDR, LRESULT* pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. NM_LISTVIEW* pN.. 2022. 7. 13.
STM32 ] 소프트웨어적으로 Chattering 채터링현상 Debounce 디바운스하기 채터링이란 스위치의 접점이 닫히거나 열리는 순간 기계적인 진동에 의해 매우 짧은 시간 안에 스위치가 붙었다 떨어지는 것을 반복하는 현상으로 Bounce 라고도 한다. 디바운스는 채터링 현상을 억제하는 해결법을 말한다. 커패시터를 추가하는 등 하드웨어적인 방법이 있고 소프트웨어적으로 해결하는 방법이 있다. 아래에선 소프트웨어적으로 해결하는방법을 소개한다. 버튼은 외부 풀다운저항을 달아놨고 EXTI Rising Edge에 트리거 되도록 했다. NVIC 설정도 켜고 각각 버튼이 눌렸을 때 LED가 토글되게 소스코드를 짰다. 디바운스 코드 추가하지 않았을 때 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin==GPIO_PIN_8){ HAL_GPIO_To.. 2022. 7. 13.
MySQL ] MySQL 설치하기 및 HeidiSQL 설치하기 Community(GPL) 버전으로 설치 아카이브를 눌러 옛날 버전을 받도록 하겠다. 64bit용은 따로 없으며 32bit 용을 다운받으면 된다. 5.7.20 버전의 오프라인 설치파일 다운로드 MySQL 서버는 x64 버전으로 커넥터를 Visual Studio 개발환경에 맞춰 x86으로 한다. 의존성 문제로 설치가 필요한 경우 설치해준다. 이 다음은 디폴트로 설치한다. 비밀번호 넣고 이 뒤에도 디폴트 설치하면 끝난다. HeidiSQL 다운로드 받은 후 디폴트 설치한다. 암호를 입력하고 열기를 누른다. 호스트명 / IP 에 있는 127.0.0.1 은 Local Host를 뜻한다. 2022. 7. 13.
MFC ] Visual Studio에서 MySQL 라이브러리 추가하기 라이브러리는 소스코드를 비공개해 기술 유출은 방지하면서, 공통으로 사용될 수 있는 기능을 모듈화하여 외부와 공유하고 코드의 재사용성을 높이기 위해 존재한다. 또한 컴파일 시간을 단축할 수 있다. 라이브러리는 동적 라이브러리 .dll 과 정적 라이브러리 .lib 가 있는데 메모리를 효율적으로 쓰기 위해선 동적 방식이 좋다. .lib 파일은 링크 단계에서 필요하고 .dll 파일은 실행 단계에서 필요하다. 따라서 동적 방식은 배포할때 실행파일과 함께 배포해야하며 .dll 제작시 .lib도 같이 생성된다. 반면 정적 방식은 해당 .lib파일이 실행파일인 .exe 파일 안에 포함되는 형태이다. 아래는 MySQL 라이브러리를 추가하여 MFC 앱개발을 하기 위한 준비사항 MFC앱 - 대화상자기반 새 프로젝트 만들기 .. 2022. 7. 13.
Windows ] USB 시리얼 포트 변경하는 법 장치관리자 - 포트 - 오른쪽클릭 - 속성 포트설정 - 고급 - COM 포트번호 변경 2022. 7. 12.
STM32 ] GPS 를 이용한 자율주행 메카넘휠 프로젝트 인원 : 2인 사용 Tool : STM32Cube IDE, 앱인벤터 사용 언어 : C 소개영상 2022.07.03 - [MCU/STM32 (ARM Cortex-M)] - STM32 ] NEO-6M 모듈 사용 , GPS 데이터 파싱하는 법 - 프로젝트 준비과정 (1) STM32 ] NEO-6M 모듈 사용 , GPS 데이터 파싱하는 법 - 프로젝트 준비과정 (1) NEO-6M, GPS 수신 모듈 GPS는 Global Positioning Sytem 의 약자로 미국이 개발 및 관리하는 위성항법 시스템이다. 그리고 GPS 수신 모듈은 지구 궤도를 돌고 있는 위성으로부터 나온 데이터의 분석을 통해 eteo.tistory.com 2022.07.02 - [MCU/STM32 (ARM Cortex-M)] - S.. 2022. 7. 12.
MFC ] 시리얼 통신으로 LED 제어하기 (1) 깃허브 주소: https://github.com/joeteo/LEDSerialCMD GitHub - joeteo/LEDSerialCMD Contribute to joeteo/LEDSerialCMD development by creating an account on GitHub. github.com https://github.com/joeteo/MFC_test01.git GitHub - joeteo/MFC_test01 Contribute to joeteo/MFC_test01 development by creating an account on GitHub. github.com 첨부된 zip파일에서 필요한 부분을 머지하고 다이얼로그의 도구들과 메시지인 OnReceive와 OnThreadClosed는 직접 추가.. 2022. 7. 9.
MFC ] 통계자료, 스레드 Thread 를 사용하여 로드하기 깃허브 주소 : https://github.com/joeteo/CarAccidentList.git GitHub - joeteo/CarAccidentList Contribute to joeteo/CarAccidentList development by creating an account on GitHub. github.com 무거운 프로세스나 무한루프로 동작해야할 작업이 있다면 쓰레드를 생성해서 백그라운드로 작업을 넘기면 된다. 이전에 만든 교통사고 통계조사 프로그램에서 시간이 오래 걸릴 수 있는 파일 불러오기 부분을 스레드를 사용한 버전으로 수정하였다. UINT Load(LPVOID LpData) { CCarAccidentListDlg* target = (CCarAccidentListDlg*)(LpData.. 2022. 7. 9.
MFC ] 통계자료, 자식 다이얼로그 생성하고 부모 다이얼로그와 상호참조하기 리소스뷰 다이얼로그에서 리소스 추가 다이얼로그 새로 만들기 자식 다이얼로그 ID 바꿔주기 자식 다이얼로그의 클래스 추가 CNewDlg 라는 이름으로 생성하고 기본 클래스는 CDialogEx가 된다. 자식 다이얼로그에도 리스트 컨트롤을 만들고 변수 추가 자식 다이얼로그에는 처음 클래스 생성시 생성자, 소멸자, DoDataExchange 함수밖에 없다. 필요한 경우 가상함수에서 OnInitDialog와 메시지에서 Ondestroy를 추가한다. 부모 다이얼로그 .cpp 파일에서 자식 다이얼로그의 헤더를 추가하고 코드를 작성한다. 자식 다이얼로그 클래스를 생성하고 자식에게 부모 다이얼로그의 포인터를 넘겨주고 키워드 검색결과가 담긴 벡터를 주소로 넘긴 후 DoModal() 을 호출하여 새 창을 연다. Modal .. 2022. 7. 8.
MFC ] new 로 동적할당 한 건 창이 닫히기 전에 OnDestroy() 에서 delete로 해제하기 생성자에서 동적할당한건 소멸자에서 해제하면 될텐데 생성자가 아닌 곳에서 동적할당 한 것인데 할당해제할 시기가 마땅치 않은 경우 창이 닫히기 전에 해제하면 다음과 같이 해제하면 메모리 누수를 막을 수 있다. 프로젝트 - 클래스 마법사 해당되는 다이얼로그에서 메시지, WM_DESTORY 를 추가한다. 아래와 같이 OnDestory() 함수 안에 new 로 동적할당 한 것을 모두 delete 하는 코드를 추가한다. 큰 의미는 없지만 delete 후에 .clear() 까지 해줬다. void CCarAccidentListDlg::OnDestroy() { if (DC.getList().size() != 0) { for (int i = 0; i < DC.getList().size(); i++) { delete DC... 2022. 7. 6.
앱 인벤터 ] GPS 모듈, 지자기센서 디버깅용 간단 어플 만들기 - 프로젝트 준비과정 (3) 메카넘휠에 올라간 MCU와 통신하기 위한 어플의 블루투스 부분은 다른 팀원이 담당하고 센서의 정확도 확인용으로 개인적으로 간단히 만들어본 어플이다. 메뉴에서 연결 - AI 컴패니언을 통해 실시간으로 디버깅하며 어플을 만들 수 있다. 다 만들고 난 후 .apk 파일로 빌드한다. 스마트폰의 위치센서와 방향센서의 값을 확인한다. 방향센서의 값은 실시간으로 변하는데, 위도, 경도 값은 위성에서 받아오는거라 딜레이도 있고, 치명적으로 실외에서도 값이 계속 튀고 정확하지 않았다. 2022. 7. 6.
MFC ] CString -> string 변환, string-> CString 변환 CString -> string변환 CString cstr = _T("hello"); string str = CT2CA(cstr); string -> CString 변환 string str = "HELLO"; CString cstr; cstr = str.c_str(); 참고로 이거는 CString 타입을 선언 동시 초기화로 변환하면서 대입할 수가 없어서 위에처럼 단계를 거쳐서 했다. 2022. 7. 4.
MFC ] 통계 데이터 List Control (리스트 컨트롤) 에 로드하기 Data.h #pragma once #include #include using namespace std; #define COLUMN_NUMBER 13 #define LOCATION_NUMBER 11 class Data { private: CString siDo; CString siGunGoo; int accidentCount[LOCATION_NUMBER]; public: Data(string _siDo, string _siGunGoo, string* _accidentCount); CString& GetSiDo(); CString& GetSiGunGoo(); int GetAccidentCount(int idx); }; Data.cpp #include "pch.h" #include "Data.h" Data:.. 2022. 7. 4.
MFC ] Class 를 이용한 음료수 자판기 Drink.h #pragma once #include using namespace std; class Drink { public: CString name; int price; int stock; public: CString getName() const; void setName(const CString& name); int getPrice() const; void setPrice(int price); int getStock() const; void setStock(int stock); }; 멤버변수는 다 private으로 하고 getter, setter를 만들어 두었다. Drink.cpp #include "pch.h" #include "Drink.h" CString Drink::getName() const.. 2022. 7. 4.
라즈베리 파이 ] root 비밀번호 까먹었을 때 바꾸는 법 1. 라즈베리파이의 SD카드를 뽑아서 리더기에 넣고 PC의 USB 단자에 연결한다. 2. SD카드 안의 cmdline.txt 파일을 열어 수정한다. 문장 맨 마지막에 한 칸 띄우고(엔터치지 말고) 아래 문장을 추가한 후 저장한다.init=/bin/sh 3. 다시 SD카드를 라즈베리파이에 꽂고 전원을 연결한다. CLI 창이 뜨면 # 다음에 아래 명령어를 입력해 루트 시스템을 마운트한다. mount -o remount, rw / 4. passwd 사용자id를 친다. root 비밀번호를 까먹었다면 passwd root 라고 치고 새로운 비밀번호를 입력한다.passwd pi 5. sync 를 입력한다.sync 6. exec /sbin/init 으로 재부팅한다.exec /sbin/init 7. GUI 환경으로 재.. 2022. 7. 3.
STM32 ] NEO-6M 모듈 사용 , GPS 데이터 파싱하는 법 - 프로젝트 준비과정 (1) NEO-6M, GPS 수신 모듈 GPS는 Global Positioning Sytem 의 약자로 미국이 개발 및 관리하는 위성항법 시스템이다. 그리고 GPS 수신 모듈은 지구 궤도를 돌고 있는 위성으로부터 나온 데이터의 분석을 통해 현재 위치의 위도, 경도, 시간 등을 시리얼 통신을 통해 받아 볼 수 있는 모듈이다. 여러 송출원에서 신호를 쏘고 이를 모듈에서 수신하여 자신의 현재 위치를 계산하여 알아내는데, 수신기의 위치를 특정하기 위해서는 최소 4개의 위성이 필요하다. 이 중 3개 이상의 위성이 정확한 시간과 변위를 측정한 뒤 삼각점의 위치를 구하는 삼변 측량기법으로 위치를 파악하고, 3개 위성이 각각 측정하는 세 개의 범위가 서로 교차되는 지점이 수신기의 위치가 된다. 나머지 1개의 위성은 시간 오차.. 2022. 7. 3.
STM32 ] 지자기 센서 HMC5883L 으로 방위각 측정하기 - 프로젝트 준비 과정 (2) HMC5883L 은 3축 마그네틱 감지센서 (Magnetometer) 로 나침반처럼 방위각을 알아낼 수 있어 Compass module 이라고 불린다. I2C 통신을 사용하여 데이터를 추출한다. 요즘에는 HMC5883L 모듈이 단종되어 QMC5883L 이라는 칩이 유통되고 있는데 QMC5883L 모듈은 I2C slave address 와 register address 가 달라서 다른 라이브러리를 써야 한다. 나는 HMC5883L 모듈을 사용하였다. Specification Datasheet 참고. 지자기장(Magnetic field of the Earth) 은 지구의 내부로부터 태양풍과 만나는 곳까지 뻗어있는 자기장인데, 태양풍은 태양으로부터 방사되는 하전입자들의 흐름이다. 지구 표면에서의 규모 범위는 .. 2022. 7. 2.
MFC ] CString -> int 변환, int -> CString 변환 CString -> int 변환 CString m_val1 = _T("1234"); int temp=0; temp = _ttoi(m_val1); int -> CString 변환 int result = 4321; CString m_result; m_result.Format(_T("%d"), result); 2022. 7. 2.
MFC ] 간단한 음료수 자판기 + Static Text 글씨 크기 키우기 + 버튼 캡션 개행(\n)하기 해당 Static Text의 ID를 변경하여 특정하고 OnInitDialog()에 다음 내용 추가 CFont font; LOGFONT logfont; ::ZeroMemory(&logfont, sizeof(logfont)); logfont.lfHeight = 18; font.CreateFontIndirect(&logfont); GetDlgItem(IDC_STATIC_TITLE)->SetFont(&font);; font.Detach(); 버튼 캡션에 개행 넣기 // VDMachineDlg.h: 헤더 파일 // #pragma once #define COLA_PRICE500 #define CIDAR_PRICE600 #define FANTA_PRICE700 #define WATER_PRICE400 // CVDMa.. 2022. 7. 2.