본문 바로가기

프로그래밍/MFC (C++)44

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.
MFC ] Visual Studio에서 MySQL 라이브러리 추가하기 라이브러리는 소스코드를 비공개해 기술 유출은 방지하면서, 공통으로 사용될 수 있는 기능을 모듈화하여 외부와 공유하고 코드의 재사용성을 높이기 위해 존재한다. 또한 컴파일 시간을 단축할 수 있다. 라이브러리는 동적 라이브러리 .dll 과 정적 라이브러리 .lib 가 있는데 메모리를 효율적으로 쓰기 위해선 동적 방식이 좋다. .lib 파일은 링크 단계에서 필요하고 .dll 파일은 실행 단계에서 필요하다. 따라서 동적 방식은 배포할때 실행파일과 함께 배포해야하며 .dll 제작시 .lib도 같이 생성된다. 반면 정적 방식은 해당 .lib파일이 실행파일인 .exe 파일 안에 포함되는 형태이다. 아래는 MySQL 라이브러리를 추가하여 MFC 앱개발을 하기 위한 준비사항 MFC앱 - 대화상자기반 새 프로젝트 만들기 .. 2022. 7. 13.
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.
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.
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.
MFC ] 간단한 계산기 + 라디오 버튼 체크상태 확인하기 라디오 버튼 체크상태 확인하기 ((CButton*)GetDlgItem(IDC_RADIO1))->GetCheck() // SimpleCalDlg.h: 헤더 파일 // #pragma once // CSimpleCalDlg 대화 상자 class CSimpleCalDlg : public CDialogEx { // 생성입니다. public: CSimpleCalDlg(CWnd* pParent = nullptr);// 표준 생성자입니다. // 대화 상자 데이터입니다. #ifdef AFX_DESIGN_TIME enum { IDD = IDD_SIMPLECAL_DIALOG }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV 지원입니.. 2022. 7. 2.
MFC ] 새 프로젝트 만들기, 환경설정 비주얼 스튜디오에서 새 프로젝트로 MFC앱을 선택하고 없으면 '추가 도구 및 기능 설치'를 한다. 애플리케이션 종류는 대화 상자 기반 선택 C++ 개발환경으로 바꾸기 나중에 다시 일반 설정으로 돌아갈 수 있다. 화면 오른쪽에 자주 쓰는 도구상자와 속성 도킹해두기 리소스 뷰 아래 경로 또는 리소스파일.rc를 클릭해 GUI를 볼 수 있다. 2022. 7. 2.