본문 바로가기

old drawer/C, C++, MFC

[MFC] CListCtrl 선택된 항목 Index // 다중 선택시 void GetIndex() { int nItemCount = m_ctrlList.GetSelectedCount(); POSITION pos = m_ctrlList.GetFirstSelectedItemPosition(); for (int i = 0; i < nItemCount; i++) { int nIndex = m_ctrlList.GetNextSelectedItem(pos); } } // 단일 선택 int GetIndex() { int nSelectedItem = m_ctrlList.GetNextItem( -1, LVNI_SELECTED ); CString strKey = m_ctrlList.GetItemText(nSelectedItem, 0); if ( strKey == "") { .. 더보기
[MFC] CListCtrl에서 포커스를 잃어도 선택된 아이템 유지하는 옵션 CListCtrl listctrl; listctrl.ModifyStyle(0, LVS_SHOWSELALWAYS); 더보기
[MFC] CEdit 에서 Enter를 통한 줄바꿈 적용 http://mainia.tistory.com/599 CEdit 컨트롤을 사용해 한줄이 아닌 여러줄의 멀티라인 글을 쓸수 있도록 설정해야 할 때가 있다. Properties 에서 Mutility Line 으로 변경한다고 해서 설정이 끝나는 것은 아니다. 아래의 내용을 참고 하기 바란다. CEdit 박스에 Enter 키를 눌렀을때 줄바꿈을 적용하기 위해서는 우선 PreTranslateMessage 를 overriding 해야한다. MSG 값중 WM_KEYDOWN 와 VK_RETURN 이 Enter 에 해당한다. 그리고 Edit 박스에 Focus 가 있는지 판단해서 줄바꿈을 적용한다. BOOL CHelloDlg::PreTranslateMessage(MSG* pMsg) { if (pMsg->message ==.. 더보기
[MFC] CListCtrl 을 사용한 내용 삽입 Report 형식의 CListCtrl 에 자료 넣기 1. 컬럼을 추가한다. 2. Item을 추가한다. 3. SubItem을 추가한다. 컬럼을 추가해야, 컬럼에 텍스트를 설정해 넣을 수가 있다. 컬럼 추가는 다음과 같이 한다. CListCtrl L; L.InsertColumn(0, "Control...", LVCFMT_LEFT, 100); L.InsertColumn(1, "HI...", LVCFMT_LEFT, 100); 첫 번째 인자는 추가할 컬럼이 어느 위치로 들어 가야 하는지를 나타낸다. 중간에 끼워 넣을 것이라면 zero-based 인덱스로 했을 때 어느 위치로 넣을 것인지를 인자로 넘겨 주면 된다. 두 번째 인자는 표시될 텍스트이다. 세 번째는 옵션이며, 네 번째 인자는 추가한 컬럼의 폭(pixel.. 더보기
[MFC] SDI 프로젝트를 Dialog 처럼 사용하기 http://nowonbun.tistory.com/195 더보기
[MFC] 유니코드 사용하기 안녕하세요. rihwan (유인환) 입니다. 사실 오늘은 제가 글 쓰는 날은 아니지만, 가볍게 개발에 도움이 될만한 내용을 올려볼까 합니다. 저는 주로 Windows 개발만을 해왔기 때문에 Windows를 기반으로 하여 글을 써보도록 하겠습니다. 하지만 원하신다면 언제든지 이외의 환경으로 바꿀 수 있습니다. 한 프로그램에서 전세계의 글자를 동시에 표현하고 싶을 때. 채팅, 게임의 해외 퍼블리싱등을 생각할 때 Unicode 표현을 쓰게 되면 상당히 이익을 보게 됩니다. 약간의 역사적인 흐름을 보자면... 초기 컴퓨터를 생각해보면 당시에는 주로 영미권에서 컴퓨터를 개발해왔기 때문에 알파벳만 표시하면 되었습니다. 알파벳이 26자인가 그러고 그 외 기호들을 포함해도 모두 합쳐도 256개면 충분하던 시기이죠. 그.. 더보기
[MFC] Window 창 크기 조정 sdi로 프로젝트를 생성했다고 가정하고, MainFrm.cpp의 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)에서 cs.cx = 1024; //가로 크기 cs.cy = 768; //세로 크기 cs.style &= ~WS_THICKFRAME; //창 크기 조절 기능 비활성화 cs.style &= ~WS_MAXIMIZEBOX; //창 최대화버튼 비활성화 이렇게 되면 창 크기가 위에서 입력한 것으로 고정된다. 하지만 여기서 끝이 아님!! 기본 생성되는 ~(프로젝트명)App.cpp파일로 가서 InitInstance() 함수 내에 SetRegistryKey(_T("로컬 응용 프로그램 마법사에서 생성된 응용 프로그램")); 를 찾아 이 다음에(SetRegistryKey(.. 더보기
[C/C++] ReadFile, WriteFile /****************************************************************** * Function Name | WriteFile(CString strFilePath, CString strWrite) * Details | 특정 경로에 데이터를 저장 * Programmer | 김 경 환 * Parameter | * Return Value | CString strFilePath, CString strWrite *******************************************************************/ BOOL ToolDBHandler::WriteFile(CString strFilePath, CString strWrite) { ofstre.. 더보기
[C/C++] 중구난방 스터디 요약 1. NULL 포인터를 리턴하는 new 연산자 : 동적 메모리 할당이 실패로 돌아가는 경우, 옛날 표준의 경우 new 연산자는 NULL을 리턴하였다. 하지만 오늘날의 경우에는 헤더 파일 new에 선언되어 있는 bad_alloc 예외가 전달된다. 하지만 그 형태는 컴파일러 별로 다를 수 있으니 확인이 필요하다. 2. 디폴트 매개 변수와 함수 오버로딩 사용시 주의 사항 : #include int func(int a = 10){ return a+1; } int func(void){ return 10; } int main(void){ std::cout 더보기
[Effective C++ 요약] 11. operator=에서는 자기대입에 대한 처리가 빠지지 않도록 하자. class Widget{...}; Widget w; ... w = w; 혹은, a[i] = a[j]; *px = *py; 이상과 같은 경우에는 자기대입 혹은 중복참조가 일어날 가능성을 내포하고 있는 코드이다. 이런 경우, 만약 둘 다 같은 주소를 참조하고 있는 경우에 있어, 어느 한쪽이 해제가 될 경우 문제 발생의 원인이 될 수 있다. 다음을 보자. class Bitmap {....}; class Widget { ... private: Bitmap *pb; }; Widget& Widget::operator=(const Widget& rhs) { delete pb; pb = new Bitmap(*rhs.pb); return *this; } 이 상황에서 만약 pb와 rhs가 같은 객체를 가리키고 있다면?? .. 더보기
[Effective C++ 요약] #7 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하라. class TimeKeeper{ public: TimeKeeper(); ~TimeKeeper(); ... }; class AtomicClock:public TimeKeeper{...}; class WaterClock:public TimeKeeper{...}; class WristWatch:public TimeKeeper{...}; * 팩토리 함수(Factory Function, 새로 생성된 파생 클래스 객체에 대한 기본 클래스 포인터를 반환하는 함수) TimeKeeper* ptk = getTimeKeeper(); ... delete ptk; 여기서 getTimeKeeper()가 AtomicClock 객체에 대한 포인터를 반환한다고 했을 때, 해당 객체는 동적 생성이므로 힙(heap)에 위치하게 된다. 객.. 더보기
[C/C++] #ifdef, #ifndef 전처리기 사용법 전처리기에 대한 간단한 예를 들자면요. 윈도우를 보면 홈에디션, 프로페셔널 등등 각종 버젼이 있지요? 마이크로소프트에서 윈도우 버전을 만들때 홈에디션 따로, 프로페셔널 따로 만들까요? 그렇지는 않겠지요? 이와 마찬가지로 님이 만약에 인터넷에서 파일을 다운받는 프로그램을 만들었습니다. 여기에 속도제한을 두고 싶어요. 무료로 배포할때는 최고 속도를 10으로 돈주고 사는 사람에게는 최고 속도를 100으로 하고 싶습니다. #ifdef PRO_VER #define MAX_SPEED 100 #else #define MAX_SPEED 10 #endif 이렇게 해두고 제어코드는 다음과 같이 하면 되겠지요? if( speed > MAX_SPEED ) speed = MAX_SPEED; // 최고속도를 초과하면 강제적으로 .. 더보기
[C/C++] INI 함수 클래스 /////////////////////////////////////////////////////////////////// // Ini.h // // "CIni" is a simple API wrap class used for ini file access. // The purpose of this class is to make ini file access more // convenient than direct API calls. // // This file is distributed "as is" and without any expressed or implied // warranties. The author holds no responsibilities for any possible damages // o.. 더보기
[MFC] File Operations Source /** \file FileOperations.h Project: FopDemo\n Project type: MFC App\n Author: Vinnichenko Alexey\n E-mail: subj@mail.ru\n Description: Declaration of CFileOperation class and CFileExeption class. */ #include "resource.h" #define PATH_ERROR -1 #define PATH_NOT_FOUND 0 #define PATH_IS_FILE 1 #define PATH_IS_FOLDER 2 class CFExeption { public: CFExeption(DWORD dwErrCode); CFExeption(CString sErrTex.. 더보기
[MFC] Type Casting Source CString -> char (포인터 값으로 저장) CString str = "Hello"; char * ch = NULL; ch = (LPSTR)(LPCSTR)str; 또는 ch = str.GetBuffer(str.GetLength()); // str의 포인터 값을 ch에 저장한다. CString -> char (배열에 복사) CString str = "Hello"; char ch[100] = {0,}; strcpy(ch, (LPSTR)(LPCSTR)str, str.GetLength()); // NULL을 만나기 전까지의 문자를 str에서 ch로 복사한다. char -> CString (복사) char ch[] = "Hello"; CString str; str = ch; // operator = 연산자.. 더보기
[MFC] Tab Control 사용법 MFC프로그램을 하다보면, Tabcontrol을 만들어야 하는 경우가 생길 것이다. 그 탭컨트롤을 만드는 과정을 알아보자. 모든 프로그램은 Dialog based로 하는 것을 기준으로 한다. 우선 dialog based 프로젝트를 만든다. 다이어로그 베이스 프로젝트는 앞의 포스트에서 미리 설명을 하였다. test라는 프로젝트 이름으로 만들었다. 만든 뒤에, TODO:…. 된 부분을 지우고, 그림에서 보듯 Toolbox에서 Tab Control을 드래그 해서 아래와 같이 화면에 붙여 넣어준다. 만약 Toolbox가 보이지 않는다면, 메뉴바의 view에서 toolbox를 찾을 수 있다. 이렇게 만들어진 Tab에 이름을 정해주자. 그림에서 보듯이 Add Variable을 클릭한다. (변수 추가) 새로 창이 뜨.. 더보기
[C++] 자료형 크기 변수형에 대해 고민하다가 싹 조사하게 되었다. 엑셀 파일과 소스코드를 첨부했으니 필요하신분은 얼마든지 사용해주셔도...ㄷㄷㄷ 옛날부터 프로그래밍을 배운게 아니라 요즘들어 하고있는 나에게 다양한 변수명은 상당히 혼란스럽고 골칫덩이였다. 특히나 int와 long가 완전히 똑같으리라고는 상상도 하지 못했는데...끙... 실제 출력값 타입 크기 최소 최대 define 비고 약수 SHORT 2 -32,768 32,767 short 32767 USHORT 2 0 65,535 unsigned short 65535 INT 4 -2,147,483,648 2,147,683,647 int 약 21억 INT8 1 -128 127 signed char SHORT 보다 작음 127 INT16 2 -32,768 32,767 sig.. 더보기
[MFC] CString에서 line by line으로 읽기 CString teststr = _T("Line1\nLine2\r\nLine3\nLine4"); CString outputstr; for (int i = 0; i < teststr.GetLength(); i++) { if (teststr[i] == '\n') { MessageBox(outputstr, _T("String Parsing"), MB_OK); outputstr = ""; } else { if (teststr[i] != '\r') outputstr += teststr[i]; } } 더보기
[MFC] 기본 열기 동작(ID_FILE_OPEN 리소스) 재정의 하기 MFC에서 기본적으로 새파일,열기는 아래와 같이 구현됩니다. BEGIN_MESSAGE_MAP(CSpriteWndApp, CWinApp) // Standard file based document commands ON_COMMAND(ID_FILE_NEW, &CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, &CWinApp::OnFileOpen) // Standard print setup command ON_COMMAND(ID_FILE_PRINT_SETUP, &CWinApp::OnFilePrintSetup) END_MESSAGE_MAP() CWinApp 라는 Base 클래스의 OnFileOpen() 함수를 호출하게 되는 것이죠. 위 과정에서 통해서 일어나는 일을 순서대로 정리하자.. 더보기
[MFC] MFC 4대 클래스간 참조 방법 //각각 헤더파일 include #include "MainFrm.h" //메인프레임 헤더파일 #include "ClassDoc.h" //Doc클래스 헤더파일 #include "ClassView.h" //View를 include 할때는 반드시 Doc 헤더파일이 위에잇어야한다 #include "Class.h" //APP Class 의 헤더파일 void CClassView::OnMenuView() //뷰클래스 CClassApp *pApp=(CClassApp *)AfxGetApp(); //View -> App CMainFrame *pMain=(CMainFrame *)AfxGetMainWnd(); //View -> MainFrm CClassDoc *pDoc=(CClassDoc *)pMain->GetActiveDo.. 더보기
[MFC] 각종 기능 정리 MFC 요점정리!! 1. DC얻기 CClientDC dc(this); 2. Client 영역 구하기 GetClientRect(&rect); WM_SIZE 메시지발생후 cx,cy 사용 3. 문자열 사각형안에 그리기 pDC->DrawText(문자열,사각형,Style); Style: DT_BOTTOM - 문자열을 사각형 맨아래줄에배열 반드시 DT_SINGLELINE과 함께사용 DT_CENTER - 문자열을 가로중앙에 배치 DT_VCENTER - 문자열을 세로중앙에 배치 DT_LEFT,RIGHT - 문자열을 좌,우로 배치 DT_SINGLELINE - 문자열을 한줄로만 쓴다 4. Brush 사용법 CBrush brushname(RGB(red,green,blue)); //브러쉬 생성 CBrush *oldBrush=.. 더보기
[MFC] Keyboard event [키보드 자동입력 구현] [Win32] Keyboard event [키보드 자동입력 구현] VOID keybd_event( BYTE bVk, // virtual-key code BYTE bScan, // hardware scan code DWORD dwFlags, // flags specifying various function options DWORD dwExtraInfo // additional data associated with keystroke ); keybd_event() 함수API 자세한 설정은 MSDN을 찾아볼 수 있다. keybd_event(VK_LWIN,0,0,0); // Window Key keybd_event(0x4C,0,0,0); // L Key // Win_Key + L Key keybd_event(VK.. 더보기
[C/C++] 프로세스명으로 프로세스 종료(함수) 처음 의도는 어떤 프로세스에 시그널을 보내어 자체 로직에 따라 종료하는 로직을 찾은것이다. 하지만 찾는도중 프로세스명으로 프로세스를 종료하는 로직이 있기에 올려본다. 출처는 불분명하여 누가 올렸는지는 알수없다. 프로그램에 내용에 대해서는 차후 설명하기로 하고 VC++에서 컴파일 될수있는 몇가지 옵션만 올려본다. psapi.h는 visual studio 2003에서는 그냥 컴파일이 되며 6.0에서는 SDK를 설치해야만 한다. projectsetting -> link -> Object/library modles에 Psapi.lib를 추가해주어야한다. afx.h를 psapi.h보다 먼저 선언해주어야하며, 이후 컴파일이 순조롭게 진행된다면 문제가 없지만 다음과 같은 에러가 날수가 있다. uafxcwd.lib(t.. 더보기
[MFC]웹브라우저 컨트롤 호스팅시 스크립트 실행 안되게 하기 웹브라우저 컨트롤을 이용한 어플리케이션을 제작하거나 MSHTML을 이용하여 HTML을 파싱하는 등의 경우에 필요에 따라 웹 페이지의 스크립트를 꺼야 하는 경우가 있습니다. 제 생각에, 이걸 편하기 하기 위해 제공되는게 IDocHostUIHandler::GetHostInfo 메소드인 것 같더군요. VC++ 7 이상에는 MFC CHtmlView에 IDocHostUIHandler 처리 기능이 추가됐기 때문에 그냥 메소드 하나 오버라이드하여 손쉽게 처리할 수 있습니다. 이 내용은 자료실에서 제 ID로 검색해 보시면 찾으실 수 있습니다. 그런데 제 기억으로는 IE 6.0일 때 이 방법을 테스트 해본 것 같고.. 그때 정말 스크립트가 실행 안됐던 것 같은데 지금 다시 해보니 전혀 안 먹더군요. 아무리 해도 스크립트.. 더보기
[MFC] SDI View 창 크기 설정 및 조절기능 비활성화 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: CREATESTRUCT cs를 수정하여 여기에서 // Window 클래스 또는 스타일을 수정합니다. cs.cx = 1024; cs.cy = 768; cs.style &= ~WS_THICKFRAME; //창 크기 조절 기능 비활성화 cs.style &= ~WS_MAXIMIZEBOX; //창 최대화버튼 비활성화 return TRUE; } 더보기
[C/C++, MFC] 런타임 라이브러리 프로젝트 속성창 > C/C++ > 코드생성 > 런타임라이브러리에는 4가지 선택사항이 있다. - 다중 스레드(/MT) : 릴리즈 모드시, 정적으로 링크 - 다중 스레드 디버그(/MTd) : 디버그 모드시, 정적으로 링크 - 다중 스레드 DLL(/MD) : 릴리즈 모드시, 동적으로 링크 - 다중 스레드 디버그 DLL(/MDd) : 디버그 모드시, 동적으로 링크 다중 스레드 디버그(/MTd)로 변경한 경우, 만일 mfc를 사용하고 있는 경우, 일반 > MFC 사용 --> 정적 라이브러리에서 MFC 사용 으로 변경해야한다. 이는 라이브러리 링크를 정적으로 변경하였으므로, 라이브러리를 쓸 경우에도 정적 라이브러리를 쓰도록 변경해주어야 하는 이치다. http://blog.naver.com/monoari?Redire.. 더보기
[C++]프로그램 실행 ShellExecute(), ShellExecuteEx(), CreateProcess() http://www.codeproject.com/Articles/1842/A-newbie-s-elementary-guide-to-spawning-processes A newbie's elementary guide to spawning processes Introduction Often, we find questions coming from newbies on how to spawn a new process, how to open a particular document with the program associated with it, how to launch a web site, how to bring up the mail client's compose window, how to wait for a pro.. 더보기
[MFC] 버튼에 이미지 입히기 1. Button 생성 2. 속성 창에서 - Bitmap = True - Owner Draw = True 3. 다이얼로그에 CBitmapButton 클래스 멤버변서 하나를 추가 CBitmapButton m_BitmapButton; 4. OnInitDialog() 함수에서 m_BitmapButton.Attach(((CBitmapButton *)GetDlgItem(IDC_BITMAP_BUTTON))->m_hWnd); m_BitmapButton.LoadBitmaps(IDB_BITMAP_BUTTONUP, IDB_BITMAP_BUTTONDOWN, IDB_BITMAP_BUTTONUP, IDB_BITMAP_BUTTONX); m_BitmapButton.SizeToContent(); 를 추가해준다. 여기서 사용된 비트맵.. 더보기
WinExec() CreateProcess() ShellEcecute() ShellExecuteEx() Windows 95의 출현과 함께 문서의 개념이 중요성을 띠게 되었다. 이제는 실행파일이라는 개념이 좀더 복잡해 지고 단순히 구동한다는 의미를 떠나 아주 방대한 개념으로 자리 잡고 있다. 문서라고 하는 것은 시스템의 네임스페이스의 일부인 보다 일반적인 객체를 말하고자 하며, 이문서에 대하여 '열기(open)', '인쇄(print)', '탐색(explore)', '찾기(find)'를 하는 프로그램이 있다. 다시 말해서, 문서라는 것은 그것에 대해서 프로그램이 어떤 동사(Verb)를 실행할 수 있는 모든 아이템을 말한다. 지금의 프로그램 실행자의 모체였던 WinExec()에서 ShellExecuteEx()라는 함수로 그 진행이 옮겨가는 이유도 이해 따른다. 이 장에서는 다음과 같은 것들을 다룰 것이다. 1... 더보기
[Win32 API] ExpandEnvironmentStrings The following example uses the GetComputerName, GetUserName, GetSystemDirectory, GetWindowsDirectory, and ExpandEnvironmentStrings functions to get information that describes the system configuration. C++ Copy #include #include #include TCHAR* envVarStrings[] = { TEXT("OS = %OS%"), TEXT("PATH = %PATH%"), TEXT("HOMEPATH = %HOMEPATH%"), TEXT("TEMP = %TEMP%") }; #define ENV_VAR_STRING_COUNT (sizeof.. 더보기