728x90
반응형

MFC 36

[MFC] 중국어 읽어오기 (unicode, utf-lf)

Unicode 유니코드는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준이다. 이는 유니코드 협회가 제정한다. 현재 컴퓨터에서 널리 사용되는 거의 모든 문자를 포함하며 110만 개 이상의 코드 포인트를 지정할 수 있다. 제록스와 애플의 공동 작업이 시초라 알려져 있다. 이후 여러 기업이 참여한 임시 위원회가 구성되었고 IBM와 Microsoft를 비롯한 다수의 기업이 참가하여 1991년에 유니코드 컨소시엄을 설립하였고 현재 주도적인 여러 IT 기업이 여기에 참여하고 있다. Unicode 문서의 Header에 BOM(Byte Of Mark)을 확인하자 BOM은 Bye의 순서 표시다. Unicode의 파일이 시작되는 첫 부분에 보이지 않게, 2~3 Byte의 문자열을 추..

코드/MFC 2022.11.23

[MFC] Control의 Style 비교하기

MFC에서 Control들의 기능을 변경하기 위해서 CustomDraw를 하다 보면 Control을 속성을 확인해야 할 때가 있다. 그중에서도 특히 Style에 대한 비교가 필요한데 GetStyle()로 받을 수 있는 Style 옵션은 GetStyle()에서 Return 받은 값으로 바로 비교가 불가능하다. 스타일을 비교하려면 아래와 같은 작업이 필요하다. UINT nButtonStyle = GetWindowLong(m_hWnd, GWL_STYLE) & 0x0000000F; if (nButtonStyle == BS_GROUPBOX) { ... } } MFC에서 사용하는 스타일은 아래와 같다. 자신이 필요한 스타일을 비교하여 Control을 Customizing 하는 데 사용할 수 있다. MFC에서 사용하..

[MELSEC] MX Component 4.0 x64에서 ALTCOMCLI.h 에러 처리

[MFC] MX Component 4.0 x64에서 사용하기 Mitsubish의 MX Component를 x64에서 사용할 수 있는 것은 C#으로 가능하지 C++로는 불가능하다. 그렇기 때문에 COM으로 Service를 등록해서 인터페이스를 통한 작업을 할 수밖에 없다. ATL을 이용하여 서버 stormpy.tistory.com MX Component를 64비트에서 작업하려다 보면, atlcomcli.h 에러가 발생하는데, 이것은 com 초기화가 되지 않을 때 발생한다. 프로그램을 제대로 했다면, x86으로 컴파일을 하지 않고 x64로 컴파일을 한 뒤에는 지속적으로 해당 에러가 발생하게 된다. 이것은 x64 형식으로 레지스터리가 등록되었기 때문이다. 그래서 Client가 x64로 실행되면 당연히 x64로..

산업기술/MELSEC 2022.04.21

[MELSEC] MX Component 4.0 x64에서 사용하기

Mitsubish의 MX Component를 x64에서 사용할 수 있는 것은 C#으로 가능하지 C++로는 불가능하다. 그렇기 때문에 COM으로 Service를 등록해서 인터페이스를 통한 작업을 할 수밖에 없다. ATL을 이용하여 서버를 만들고 이를 이용하는 방법을 우선 숙지하자. [ATL/MFC] 32Bit Software를 64Bit Software에서 사용하기 C++에서 x86, x64 프로그램은 서로 호환해서 사용할 수 없어서 별도로 만들어 사용해야 한다. 모든 프로그램을 자신 혹은 팀이 만들어 나간다면 아무런 문제가 없다. 하지만 외부로부터 제공되는 stormpy.tistory.com 서버 만들기 이제 ATL의 기본 조작법을 익혔다면, 해당 프로젝트에 MX Component 기능들을 연결해야 한다..

산업기술/MELSEC 2022.04.19

[MFC] Frame Caption 고정하기

Single/Multi Document 에서 상단 Caption은 보통 '제목없음 - 프로젝트 이름'으로 나타난다. 이를 해결하기 위해서는 Frame의 Style 설정에서 TITLE을 변경하면 된다. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.style &= ~(FWS_ADDTOTITLE); cs.lpszName = L"User Application"; return TRUE; } Frame Style에서 FW..

[MFC] CString ↔ BSTR

BSTR은 여간해서 쓸 일이 잘 없는데, ATL을 쓰다 보면 종종 써야 해서 정리한다. BSTR은 Visual Basic 개발팀에 의해 만들어졌는데, Visual Basic이 포인터를 지원하지 못했기 때문이다. 그래서 IDispatch 인터페이스를 만들었다. Visual Basic과 COM 객체가 원활히 통신하기 위해서 COM에서 Visual Basic 문자열 타입을 지원하게 되는 결과로 만들어진 것이 바로 BSTR(Basic String)이다. BSTR은 COM에서 유니코드 문자열을 나타내는데 자주 사용된다. // BSTR -> CString BSTR bstr = ::AllocSysString(L"ABCD"); CString str = (CString) bstr; // CString -> BSTR CS..

[ATL/MFC] 32Bit Software를 64Bit Software에서 사용하기

C++에서 x86, x64 프로그램은 서로 호환해서 사용할 수 없어서 별도로 만들어 사용해야 한다. 모든 프로그램을 자신 혹은 팀이 만들어 나간다면 아무런 문제가 없다. 하지만 외부로부터 제공되는 라이브러리나 개발이 종료된 라이브러리의 경우 32bit만 존재하는 경우가 종종 있다. 이럴 경우 두 프로그램의 통신을 이용하여 사용할 수 있다. 32bit 프로그램을 ATL로 둘러싸서 서버를 만든 후 64Bit 프로그램에서 해당 서버와 통신을 하게 된다. 서버 만들기 (ATL Project) Visual Studio에서는 ATL을 이용하여 서버 프로그램을 간단히 만들 수 있다. C++ 프로젝트에서 ATL/ATL Project를 선택한 뒤, Service(EXE)를 선택한 후 프로젝트를 생성한다. ServerX8..

[MFC] Control 보여주고 숨기기 (확인하기)

MFC에서 GUI를 구성할 때 사용하는 Control은 조건에 따라서 보여주거나 숨겨야 한다. 이때 사용하는 함수가 ShowWindow()이다. 편법으로는 MoveWindow()를 이용하여 Size를 0으로 만들어주면 되기도 한다. CEdit m_edit; // 라고 선언했다면, m_edit.ShowWindow(SW_SHOW); // 보여주기 m_edit.ShowWindow(SW_HIDE); // 숨기기 이때, SHOW/HIDE 상태를 확인하기 위해서는 IsWindowVisible() 함수를 사용할 수 있다. 물론 CEdit를 Subclassing 하여 OnShowWindow() 이벤트 내에서 선언된 변수에 정보를 저장하여 알 수도 있다. if (!m_edit.IsWindowVisible()) // SW..

[MFC] 따라하기 06. 순차적으로 원 그리기

1. 프로젝트 예제에 사용되는 내용 구동하는 시스템 제어하기 순차적으로 구동하는 시스템 만들기 [MFC] 따라하기 05. 여러 개의 원 그리기 1. 프로젝트 예제에 사용되는 내용 구동하는 시스템 제어하기 여러 시스템 구동하기 [MFC] 따라하기 04. 원이 그려지는 동작 만들기 1. 프로젝트 예제에 사용되는 내용 원을 이루는 함수 구하기 Clie stormpy.tistory.com 2. flag로 동작 구현하기 기존에 Timer의 동작으로 구동하던 방법을 bool 변수를 사용하여 그리기/멈추기를 구현해 보자. 3개의 start_flag를 배열로 만들어서 그리기 동작을 제어할 수 있다. 하나가 작업이 끝나면 다음 작업이 실시될 수 있도록 만들자. BOOL CDrawCircleDlg::OnInitDialog..

[MFC] 따라하기 05. 여러 개의 원 그리기

1. 프로젝트 예제에 사용되는 내용 구동하는 시스템 제어하기 여러 시스템 구동하기 [MFC] 따라하기 04. 원이 그려지는 동작 만들기 1. 프로젝트 예제에 사용되는 내용 원을 이루는 함수 구하기 ClientDC 2. CClientDC와 Ellipse()를 이용하여 원 그리기 Dialog Based 프로젝트를 만든 뒤, 버튼을 하나 추가하여 클릭으로 원을 그릴 수 있도록 stormpy.tistory.com 2. 시작, 일시정지, 정지 기능 만들기 '04. 원이 그려지는 동작 만들기' 프로젝트를 그대로 가져와서 버튼 3개를 만든다. 3개 모두 클릭 이벤트를 만들어 둔다. 그리기 : 원을 그리기를 처음부터 시작한다. 일시정지 : 원 그리기를 잠시 멈춘다. 정지 : 그리기를 멈춘다. 우선 그리기를 처음부터 하..

코드/MFC 2022.03.08

[MFC] 따라하기 04. 원이 그려지는 동작 만들기

1. 프로젝트 예제에 사용되는 내용 원을 이루는 함수 구하기 ClientDC 2. CClientDC와 Ellipse()를 이용하여 원 그리기 Dialog Based 프로젝트를 만든 뒤, 버튼을 하나 추가하여 클릭으로 원을 그릴 수 있도록 해보자. 위와 같이 원을 그리는 것은 어렵지 않다. Button Click 이벤트에 다음과 같이 작성하면 간단하게 작성할 수 있다. void CDrawCircleDlg::OnBnClickedDraw() { CClientDC dc(this); dc.Ellipse(10, 10, 100, 100); } CCleintDC는 window에서 device context를 가져온다. Ellipse()는 원을 그리는 함수다. OnInitDialog()에서는 CCleintDC을 이용해서..

코드/MFC 2022.03.08

[MFC] 따라하기 03. Edit box를 이용하여 여러 개의 사각형 그리기

1. 프로젝트 예제에 사용되는 내용 for문 사용 Edit box 사용법 [MFC] 따라하기 02. 버튼을 이용하여 사각형 그리기/지우기 1. 프로젝트 예제에 사용되는 내용 함수의 사용 버튼 사용의 이해 [MFC] 따라하기 01. 사각형 그리기 1. 프로젝트 예제에 사용되는 내용 Dialog Based 프로젝트 생성 방법 PaintDC()의 이해 2. 프로젝트 생 stormpy.tistory.com 2. for문과 이용하여 3 x 3 개수의 사각형 그리기 이전 글까지 진행하면 (10, 10)에서 (110, 110)에 이르는 100 x 100 pixel의 사각형을 그리게 된다. 이제부터는 똑같은 사각형을 3x3으로 9개를 그려보자. 사각형은 100 pixel의 변을 가지고 있기 때문에 10 pixel의 간..

코드/MFC 2022.03.02

[MFC] 따라하기 02. 버튼을 이용하여 사각형 그리기/지우기

1. 프로젝트 예제에 사용되는 내용 함수의 사용 버튼 사용의 이해 [MFC] 따라하기 01. 사각형 그리기 1. 프로젝트 예제에 사용되는 내용 Dialog Based 프로젝트 생성 방법 PaintDC()의 이해 2. 프로젝트 생성 MFC 응용프로그램 프로젝트를 만들기 위해서는 위 그림에 있는 버튼을 차례대로 누른다. File/New stormpy.tistory.com 2. 함수를 이용하여 사각형 그리기 사각형을 그리는 프로젝트에서 해당 기능을 떼어내어 함수로 옮겨보자. 함수의 이름은 DrawRectangle로 하며 반환 값은 없으므로 void로 선언하자. void CDrawRectDlg::DrawRectangle(CPaintDC& dc) { dc.MoveTo(10, 10); dc.LineTo(110, 1..

코드/MFC 2022.03.02

[MFC] 따라하기 01. 사각형 그리기

1. 프로젝트 예제에 사용되는 내용 Dialog Based 프로젝트 생성 방법 PaintDC()의 이해 2. 프로젝트 생성 MFC 응용프로그램 프로젝트를 만들기 위해서는 위 그림에 있는 버튼을 차례대로 누른다. File/New 메뉴를 선택한다. Project를 선택하면 Project 종류를 선택할 수 있다. Visual C++의 MFC 하위에 있는 'MFC Application'을 선택한다. 이때 하단의 Project 이름을 넣을 수 있다. ( Sample은 DrawRect이라고 정했다. ) MFC Application 프로젝트는 3가지를 선택할 수 있습니다. Single document : frame window가 있지만 child window가 아닌 프로젝트 Multiple document : fra..

코드/MFC 2022.03.02

[MFC] TreeCtrl Node 모두 확장하기

CTreeCtrl을 사용하여 아이템을 추가한 경우, 모두 닫혀 있게 되는데 매번 모두 여는 작업은 귀찮을 수 있다. 이를 위해서 한꺼번에 확장하는 함수를 만들어서 사용하게 된다. 우선 ITEM의 확장을 위해서는 간단하게 아래와 같이 만들 수 있다. ( 예는 Subclassing 한 경우다.) void CMxTreeCtrl::ExpandTree(HTREEITEM hItem) { if (this->ItemHasChildren(hItem)) { Expand(hItem, TVE_EXPAND); HTREEITEM hChild = GetChildItem(hItem); if (hChild) { do { ExpandTree(hChild); } while (hChild = GetNextSiblingItem(hChild)..

[MFC] ID_FILE_OPEN 재정의

Frame이 있는 프로젝트를 실행할 때, 기본적으로 제공하는 ID_FILE_OPEN의 경우, 이벤트를 실행하면 파일 다이얼로그가 열리고 해당 경로는 Document의 OpenDocumentFile를 호출하게 된다. 이때 읽을 파일의 확장자나 기능으로 추가하기 위해서는 재정의를 할 필요가 있다. BEGIN_MESSAGE_MAP(CTaskViewApp, CWinAppEx) ON_COMMAND(ID_APP_ABOUT, &CTaskViewApp::OnAppAbout) // Standard file based document commands ON_COMMAND(ID_FILE_NEW, &CWinAppEx::OnFileNew) ON_COMMAND(ID_FILE_OPEN, &CWinAppEx::OnFileOpen) E..

[MFC] App 혹은 Dll에서 콘솔 사용하기

DEBUG 모드에서 콘솔을 사용하면 LOG를 실시간으로 확인할 수 있기 때문에 편리하다. Dll이나 Application에서 콘솔을 사용하는 방법은 두 가지다. 첫 번째는 서브시스템으로 콘솔을 링크를 하는 것이다. #pragma comment(linker, "/subsystem:console") 해당 코드를 기입하면 콘솔 프로그램에서 사용할 수 있는 cout 등을 이용할 수 있다. 두 번째는 AllocConsole() 함수를 이용하는 것이다. AllocConsole() 함수를 실행한 후에는 WriteConsole() 함수로 콘솔에 텍스트를 적을 수 있다. 편리하게 사용하기 위해서 sprintf처럼 만들어 사용할 수 있다. #define dp(fmt,...) topeng::dbg_print( fmt, __..

728x90
반응형