본문 바로가기
728x90

프로그래밍 팁/C, C++20

Visual C++ Template와 STL Template 차이점 Visual C++의 템플릿 클래스와 STL의 템플릿 클래스는 모두 C++의 템플릿 기능을 활용하여 작성된 클래스입니다. 그러나 두 클래스의 차이점은 다음과 같습니다. 제공되는 기능의 차이점 Visual C++의 템플릿 클래스는 MFC(Microsoft Foundation Classes) 라이브러리에 속하는 클래스로, 다양한 기능을 제공합니다. 예를 들어, CArray 클래스는 동적 배열을 처리하는 기능을 제공하며, CMap 클래스는 키-값 쌍 데이터를 저장하는 기능을 제공합니다. 반면에 STL(Standard Template Library)의 템플릿 클래스는 C++ 표준 라이브러리에 포함되어 있으며, 다양한 기능을 제공합니다. STL의 템플릿 클래스 중 몇 가지는 vector, list, map, qu.. 2023. 3. 13.
Visual C++ 윈도우 키 막기 전체 화면으로 게임을 하거나, 작업 중에 "Win 키"가 눌리면서 화면이 아래로 내려가서 방해가 되는 경우가 있습니다. 이를 방지하기 위한 게임 및 애플리케이션 개발 시 사용할 수 있는 소스를 공개합니다. 아래의 소스는 Windows hook이라는 기술을 이용한 방법입니다. (Hook 이란 "가로채기"라는 뜻으로써, 시스템에 전달되는 이벤트를 먼저 가로채는 기술입니다. 보통은 가로챈 이벤트의 처리가 끝나면 반드시 CallNextHookEx함수를 호출하여 시스템에 전달 될 수 있도록 해야합니다.) 핵심 소스 부분 아래와 같이 "왼쪽 Windows 키"나 "오른쪽 Windows 키"가 눌린 경우 "CallNextHookEx(...)"함수를 호출하여 시스템으로 넘겨 해당 키에 대한 이벤트 처리를 하도록 넘기지.. 2022. 7. 18.
C, C++ 를 웹에서 실행 C, C++를 공부하거나 간단한 구문을 테스트하려면, 언어적인 제약으로 Visual Studio 혹은 gcc 같은 컴파일러가 있는 환경에서만 가능했었지만, 이제 온라인(웹)에서 실행할 수 있게 되었습니다. 바로 Programiz라는 사이트인데요. 아래와 같이 웹상에서 바로 코드를 작성하고 "Run"을 실행하면 결과창을 볼 수 있습니다. 이뿐만 아니라 실행 시 오류 메시지도 gcc컴파일 환경과 동일하게 출력해 주무로 간단 구문 테스트나, 공부하기에 정말 좋은 환경이라고 생각이 듭니다. 이 사이트에서는 "C"언어뿐만 아니라 "C++", "Python", "Java", "C#", "Javascript", "SQL" 언어도 지원해 주니, 더욱 유용하게 사용할 수 있을 것 같습니다. 아래는 해당 사이트의 C C.. 2022. 7. 13.
MFC - Drag and Drop 구현 DragAcceptFiles()함수와 WM_DROPFILES메세지를 이용해서 드래그앤드랍을 구현 할 수 있습니다. 다이얼로그 베이스 프로젝트에서 아래와 같이 헤더와 소스파일에서 구현하면 됩니다. CMFCDropFilesDlg.h protected: afx_msg void OnDropFiles(HDROP dropInfo); DECLARE_MESSAGE_MAP() CMFCDropFilesDlg.cpp BEGIN_MESSAGE_MAP(CMFCDropFilesDlg, CDialogEx) ON_WM_DROPFILES() END_MESSAGE_MAP() BOOL CMFCDropFilesDlg::OnInitDialog() { DragAcceptFiles(); // entire dialog list.DragAccept.. 2019. 4. 28.
크로스 플랫폼 개발 시 define문으로 구분하는 방법 크로스 플랫폼 개발 시 사용되는 define문 #ifdef _WIN32 // 윈도우 개발환경 #ifdef _WIN64 // 윈도우 64bit #else // 윈도우 32bit #endif #elif __APPLE__ // 애플 개발환경 #include "TargetConditionals.h" #if TARGET_IPHONE_SIMULATOR // iOS 시뮬레이터 #elif TARGET_OS_IPHONE // iOS 장치 #elif TARGET_OS_MAC // Mac OS #else # error "Unknown Apple platform" #endif #elif __linux__ // 리눅스 개발환경 #elif __unix__ // all unices not caught above // 유닉스 개발환.. 2019. 4. 17.
C, C++ - 구조체 생성자를 사용하여 초기화 일반적인 구조체 선언 후 초기화 구조체 정의 typedef struct _MY_STRUCT { char c; int i; char sz[100]; } MY_STRUCT; 구조체 정의 및 초기화 MY_STRUCT st; // 구조체 변수 정의 memset(&st, 0x0, sizeof(st)); // 구조체 초기화 생성자에서 초기화 구조체 정의 typedef struct _MY_STRUCT { char c; int i; char sz[100]; _MY_STRUCT() { memset(this, 0x0, sizeof(struct _MY_STRUCT)); } } MY_STRUCT; 구조체 정의 MY_STRUCT st; // 구조체 변수 정의함과 동시에 생성자에 의해서 초기화됨. 생성자에서 특정 값으로 초기화 .. 2019. 2. 19.
MFC - Visual Studio 6.0 with Platform SDK 2003 설정 Platform SDK 다운로드 링크주소는 아래와 같습니다. Windows® Server 2003 SP1 Platform SDK Full Download (Full 다운로드 버전) Windows® Server 2003 SP1 Platform SDK Web Install (Web 설치 버전) 1. Platform SDK 설치 후 헤더(Include files)와 라이브러리(Library files)폴더 설정을 아래와 같이 해 주세요. Visual Studio 6.0의 메뉴에서 Tool -> Options -> Directories 으로 가서 아래와 같이 설정 해 주세요. (※ Platform SDK 헤더와 라이브러리가 먼저 선택되도록 리스트에서 상단으로 옮겨주세요.) 2. Platform SDK 2003 .. 2019. 2. 19.
MFC - CString GetBuffer(), ReleaseBuffer() 사용 아래와 같이 char배열 포인터를 받아서 전화번호 문자열을 복사해주는 함수가 있다고 가정했을 때, void GetPhoneNumber(char *buf) { strcpy(buf, "010-1234-5678"); } 받은 전화번호 데이터를 다시 CString으로 처리해야하는 경우, 보통 아래와 같이 처리를 합니다. CString str; char sz[20] = { 0, }; GetPhoneNumber(sz); str = sz; // str 사용... 이를 CString의 GetBuffer(), GetRelease()함수를 사용하여 아래와 같이 간단하게 처리할 수 있습니다. CString str; GetPhoneNumber(str.GetBuffer(20)); str.ReleaseBuffer(); // st.. 2019. 1. 25.
C, C++ 문자열 인코딩(iconv) iconv 라이브러리를 활용하여 문자열 인코딩 하는 방법입니다. iconv 라이브러리 홈페이지는 "https://www.gnu.org"입니다. (다운로드: https://www.gnu.org/software/libiconv/#downloading) 최신 리눅스의 경우는 기본 설치가 되어 있으며, 설치가 안 되어 있는 경우는 apt-get, rpm 혹은 소스 설치하시면 됩니다. OS가 윈도우인 경우는 라이브러리 파일(*.tar.gz)안에 README.windows에 명시되어 있는대로 빌드하여 사용하시면 됩니다. 주요 함수 설명 iconv_t iconv_open(const char* tocode, const char* fromcode); 설명: 현재 문자셋, 변경할 문자셋을 지정하고 Conversion De.. 2016. 12. 23.
C, C++ 파일 존재 유무 확인 bool IsFileExist(char *szFileFullPath) { FILE *file = fopen(szFileFullPath, "r"); if (file) { fclose(file); return true; } return false; } 2016. 11. 21.
MFC - 폼뷰(FormView)를 다이얼로그(Dialog)처럼 테두리 없애기 "PreCreateWindow, OnInitialUpdate" 함수를 아래와 같이 재정의 해 줍니다. BOOL CMediaManagerView::PreCreateWindow(CREATESTRUCT &cs) { // TODO: CREATESTRUCT cs를 수정하여 여기에서 // Window 클래스 또는 스타일을 수정합니다. cs.style &= ~(WS_BORDER); //추가 cs.style &= ~(WS_THICKFRAME); //추가 cs.style &= ~(WS_DLGFRAME); //추가 return CFormView::PreCreateWindow(cs); } void CMediaManagerView::OnInitialUpdate() { GetParent()->ModifyStyleEx(WS_EX.. 2016. 10. 18.
MFC - 예외(Exception) 처리 (try catch, CException) Exception 에러 메세지창으로 띄우기 try { // Exception 발생 구문 } catch (CException *ex) { ex->ReportError(); } Excption 에러 메세지 얻어오기 try { // Exception 발생 구문 } catch (CException *ex) { TCHAR szMsg[1024] = {0,}; ex->GetErrorMessage(szMsg, 1024); CString strMsg; strMsg.Format(/*적절한 메세지 만들기*/); ::AfxMessageBox(strMsg); } 위에 예문을 토대로 함수를 만들어 봤습니다. Made by 꾸션 헤더 CString GetErrorDescription(CException *ex); CString G.. 2015. 2. 9.
MFC - GetLastError()에 해당하는 메세지 출력 GetLastError에 해당하는 메세지 얻어오기 LPVOID lpMsgBuf = NULL; CString strMsg; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL); if (!lpMsgBuf) { strMsg = (LPCTSTR)lpMsgBuf; LocalFree(lpMsgBuf); } 이를 토대로 함수를 만들어 보았습니다. Made by 꾸션 헤더 CString GetErrorDescription(DWORD dwLastErrorCode); CStr.. 2015. 2. 9.
MFC - [추천도서] Visual C++ 6 완벽가이드 2nd Edition Visual C++ 혹은 MFC를 공부를 막 시작하시려는 분들께 아래의 책을 소개해드립니다. 흔히, "눈깔이책"으로 유명한 책이죠. 2nd Edition으로도 알 수 있듯이 책의 구성이나 내용이 꽤 괜찮게 짜여져 있습니다. 각 Chapter별 예제도 CD로 제공하고 있어서, 초입단계 분들에게는 아주 유용하다고 생각됩니다. 목차는 아래와 같습니다. Part 1 기본 프로그래밍 Chapter 1 사전학습 Chapter 2 프로그램의 뼈대 Chapter 3 GDI를 이용한 그래픽 Chapter 4 대화상자와 컨트롤 Chapter 5 사용자 인터페이스 Chapter 6 도큐먼트의 데이터 관리 Part 2 고급 프로그래밍 Chapter 7 분할 윈도우와 다중 뷰 Chapter 8 다중 도큐먼트 프로그램 Chapt.. 2015. 2. 4.
MFC - 리스트컨트롤(CListCtrl) 대용량 데이터 처리 리스트 컨트롤에서 대용량의 데이터를 업데이트 하는 방법에 대해서 알아보겠습니다. CListCtrl클래스의 SetItemCount(), SetItemCountEx()함수를 사용하면 되는데, 사용 방법은 업데이트 할 데이터의 양을 먼저 위 두개의 함수를 사용하여 알려주고, 데이터를 입력하기만 하면 됩니다. 아래는 각 각의 함수를 사용하는 방법이며, MSDN에서 발췌하였습니다. CListCtrl::SetItemCount() https://msdn.microsoft.com/en-us/library/88tba5s4.aspx CString str; // Add 1024 items to the list view control. m_myListCtrl.SetItemCount(1024); for (int i = 0; i.. 2015. 2. 3.
728x90