void CMainScreen::OnTimer(UINT_PTR nIDEvent)
{
	switch( nIDEvent) {
	case 8888 : // TS2019 1220
		KillTimer( 8888);
		EraseLastCursor();
		break;
	}//switch

	CStatic::OnTimer(nIDEvent);
}


// TS2019 1220
void CMainScreen::VVOnMouseMove(UINT nFlags, CPoint point)
{
	CDC *pdc = GetDC();
	CRect rct;
	CPen pen, *op = NULL;

	GetClientRect( &rct);
	pen.CreatePen( PS_SOLID, 1, RGB(255,255,255));
	pdc->SetROP2( R2_XORPEN);
	op = pdc->SelectObject( &pen);

	if( m_oPoint.x == -1 && m_oPoint.y == -1) {
	} else if( rct.PtInRect( point) ) {
		pdc->MoveTo( m_oPoint.x, rct.top);
		pdc->LineTo( m_oPoint.x, rct.bottom);
		pdc->MoveTo( rct.left,  m_oPoint.y);
		pdc->LineTo( rct.right, m_oPoint.y);
	} else {
	}//if
	pdc->MoveTo( point.x, rct.top);
	pdc->LineTo( point.x, rct.bottom);
	pdc->MoveTo( rct.left,  point.y);
	pdc->LineTo( rct.right, point.y);
	pdc->SelectObject( op);
	ReleaseDC( pdc);

	m_oPoint =  point;
	SetTimer( 8888, 100, NULL); // 영역밖으로 벗어날때 커서 지우기

	CStatic::OnMouseMove(nFlags, point);
}

// TS2019 1220
void CMainScreen::EraseLastCursor()
{
	CRect rct;
	CPoint cu;
    
    SetCapture();
	GetCursorPos( &cu);
	ScreenToClient( &cu);
	ReleaseCapture();
	GetClientRect( &rct);
    
	if( rct.PtInRect( cu) == FALSE) {
		CDC *pdc = GetDC();
		CPen pen, *op = NULL;
		pdc->SetROP2( R2_XORPEN);
		pen.CreatePen( PS_SOLID, 1, RGB(255,255,255));
		op = pdc->SelectObject( &pen);
		pdc->MoveTo( m_oPoint.x, rct.top);
		pdc->LineTo( m_oPoint.x, rct.bottom);
		pdc->MoveTo( rct.left,  m_oPoint.y);
		pdc->LineTo( rct.right, m_oPoint.y);
		pdc->SelectObject( op);
		ReleaseDC( pdc);
		m_oPoint = CPoint( -1, -1);
	} else {		
		SetTimer( 8888, 100, NULL); // 영역밖으로 벗어날때 커서 지우기 확인 사살
	}//if
}

1. stdafx.h or pch.h 에 정의

#define __FILENAMEA__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) 
#define __FILENAMEW__ (wcsrchr(CString(__FILE__).GetString(), L'\\') ? wcsrchr(CString(__FILE__).GetString(), L'\\') + 1 : CString(__FILE__).GetString()) 

 

 

2. 사용 하기

// UNICODE
Trace( L"%s(%d): "L"%s\n", __FILENAMEW__, __LINE__, L"message"); 
// ANSI
Trace( "%s(%d): ""%s\n", __FILENAMEA__, __LINE__, "message"); 

 

3. 디버그 창에서 라인 클릭시 바로가기 문제 없음.

 

 

1. c#.DLL 프로젝트 생성

   Class Library(.NET Framework) 생성

   프로젝트 ==> 속성

   1.1 응용프로그램 ==> 어셈블리 정보 ==> 어셈블리를 COM에 노출(M) ==> 체크

   1.2 빌드 ==> COM interop 등록(C) ==> 체크  *) 출력 경로에 c#.tlb 파일이 자동 생성 된다.

 

2. tlh 생성 하려면

   프로젝트 파일이(*.sln) 있는곳에 c#.dll과 c#.tlb 파일을 위치 시킨다.

   프로젝트 출력 파일이 있는곳에 위치하면 c#.tlb파일이 삭제되어 에러 낸다.

   간혹) #import 지정 경로에 있지 않을때

           프로젝트 ==> 추가 ==> 기존항목 ==> ... ==> c#.tlh를 프로젝트에 포함 시킨다. 

  COM interop 등록(C) 체크 되어 있을때는 자동으로 생성 된다.

   VC++에서 클래스마법사 ==> 클래스 추가(C) ==> TypeLib의 MFC클래스

                                                                     ActiveX컨트롤의 MFC클래스

 

3. CLSID_*과 IID_*를 생성 하려면

  #import "D:\...\c#.tlb" no_namespace named_guids 문을 소스에 포함하고 컴파일 하면

  c#.tlh 파일이 자동 생성된다.

  이때 생성된 c#.tlh 파일 내용중 "// Named GUID constants initializations "에 GUID가정의 되어 있다.

  EX)

//
// Named GUID constants initializations
//

extern "C" const GUID __declspec(selectany) LIBID_ExMakeDLL =
    {0x83a81205,0x6498,0x4330,{0xb4,0xdc,0xa5,0xf5,0x66,0xb7,0x3a,0x83}};
extern "C" const GUID __declspec(selectany) IID_ICallClass =
    {0x357ccedb,0x44a1,0x481e,{0xa4,0x2a,0x0d,0x4d,0xca,0x8c,0x5e,0xea}};
extern "C" const GUID __declspec(selectany) CLSID_Class2 =
    {0x199a04ba,0xbf3d,0x4a89,{0xbb,0x28,0x91,0x64,0x5a,0x5d,0x57,0x2c}};
extern "C" const GUID __declspec(selectany) IID__Class2 =
    {0x76618522,0x77a4,0x378b,{0xa8,0x45,0x50,0xe3,0xe6,0xf7,0xf1,0xae}};

3. C++에서 C# dll 사용은

	CoInitialize(NULL);
	HRESULT hr = CoCreateInstance(CLSID_Class2, NULL, CLSCTX_INPROC_SERVER, IID_ICallClass, reinterpret_cast<void**>(&pp));
	if (SUCCEEDED(hr)) {
		pp->setInfo( L"name", 27, L"8888-8888");
		pp->showInfo();
	}//if

 

 

 

 

StrSafe 함수들

문자열 함수는 말 그대로 문자열을 버퍼에 담고 출력하는 함수입니다. 주로 문자열 함수들은 문자열 버퍼의 포인터를 리턴하게 되는데요, 이 때문에 버퍼 오버플로우 현상이 일어날 수 있습니다. TCHAR* alphabet..

wonjayk.tistory.com

https://wonjayk.tistory.com/268

 

 

StrSafe 함수들

문자열 함수는 말 그대로 문자열을 버퍼에 담고 출력하는 함수입니다. 주로 문자열 함수들은 문자열 버퍼의 포인터를 리턴하게 되는데요, 이 때문에 버퍼 오버플로우 현상이 일어날 수 있습니다. TCHAR* alphabet..

wonjayk.tistory.com

 

AfxBeginThread

CWinThread* AfxBeginThread(
    AFX_THREADPROC pfnThreadProc,
    LPVOID pParam,
    int nPriority = THREAD_PRIORITY_NORMAL,
    UINT nStackSize = 0,
    DWORD dwCreateFlags = 0,
    LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);

CWinThread* AfxBeginThread(
    CRuntimeClass* pThreadClass,
    int nPriority = THREAD_PRIORITY_NORMAL,
    UINT nStackSize = 0,
    DWORD dwCreateFlags = 0,
    LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);

pfnThreadProc
작업자 스레드의 제어 함수를 가리킵니다. NULL일 수 없습니다. 이 함수는 다음과 같이 선언 해야 합니다.

UINT __cdecl MyControllingFunction( LPVOID pParam ); 

pThreadClass
CWinThread에서 파생 된 개체의 RUNTIME_CLASS입니다.


pParam
PfnThreadProc의 함수 선언에 대 한 매개 변수에 표시 된 대로 제어 함수에 전달할 매개 변수입니다.


nPriority
스레드의 원하는 우선 순위입니다. 

사용 가능한 우선 순위에 대 한 전체 목록과 설명은 Windows SDK의 Setthreadpriority 를 참조 하십시오.


nStackSize
새 스레드에 대 한 스택의 크기 (바이트)를 지정 합니다. 

0 인 경우 스택 크기는 생성 스레드와 동일한 크기의 스택으로 기본 설정 됩니다.


dwCreateFlags
스레드의 생성을 제어 하는 추가 플래그를 지정 합니다. 이 플래그는 다음 두 값 중 하나를 포함할 수 있습니다.
CREATE_SUSPENDED 일시 중단 횟수가 1 인 스레드를 시작 합니다. 스레드의 실행을 시작 하기 전에 m_bAutoDelete 또는 파생 클래스의 멤버 CWinThread 와 같은 개체의 멤버 데이터를 초기화 하려면 CREATE_SUSPENDED를 사용 합니다. 초기화가 완료 되 면 CWinThread:: ResumeThread 를 사용 하 여 실행 스레드를 시작 합니다. 스레드는가 호출 될 때 CWinThread::ResumeThread 까지 실행 되지 않습니다.
0 생성 후 즉시 스레드를 시작 합니다.


lpSecurityAttrs
스레드에 대 한 보안 특성을 지정 하는 SECURITY_ATTRIBUTES 구조체를 가리킵니다. 

NULL 인 경우에는 만들기 스레드와 동일한 보안 특성이 사용 됩니다. 

이 구조에 대 한 자세한 내용은 Windows SDK를 참조 하세요.


반환 값
새로 만든 스레드 개체에 대 한 포인터 이거나, 오류가 발생 하는 경우 NULL입니다.


설명
의 AfxBeginThread 첫 번째 형태는 작업자 스레드를 만듭니다. 두 번째 폼은 사용자 인터페이스 스레드 또는 작업자 스레드로 작동할 수 있는 스레드를 만듭니다.
AfxBeginThread새 CWinThread 개체를 만들고 CreateThread 함수를 호출 하 여 스레드 실행을 시작 하 고 스레드에 대 한 포인터를 반환 합니다. 모든 개체를 생성 하는 데 실패 하는 경우 모든 개체의 할당이 제대로 취소 되는지 확인 하기 위해 전체 절차를 수행 합니다. 스레드를 종료 하려면 스레드 내에서 AfxEndThread 를 호출 하거나 작업자 스레드의 제어 함수에서를 반환 합니다.
다중 스레딩을 응용 프로그램에서 사용 하도록 설정 해야 합니다. 그렇지 않으면이 함수는 실패 합니다. 다중 스레딩을 사용 하도록 설정 하는 방법에 대 한 자세한 내용은 Visual C++ 컴파일러 옵션에서 /md,/Mt,/LD (런타임 라이브러리 사용) 를 참조 하세요.
에 대 AfxBeginThread한 자세한 내용은 다중 스레딩 문서 를 참조 하세요. 작업자 스레드 및 다중 스레딩 만들기: 사용자 인터페이스 스레드만들기

총.균.쇠.

- 제러드 다이아몬드 -  무기, 병균, 금속은 인류의 운명을 어떻게 바뀠는가?

 

위대한 한글로 공유하게 된 공감대

 

프롤로그, 현대 세계의 불평등에 대한 의문을 푼다.

 

1부. 인간 사회의 다양한 운명의 갈림길

  1장. 문명이 싹트기 직전의 세계 상황

 

 

 

 

 

총,균,쇠 [양장본]
국내도서
저자 : 재레드 다이아몬드(Jared M. Diamond),제러드 다이아몬드(Jared M. Diamond) / 김진준역
출판 : 문학사상 2013.03.04
상세보기

'' 카테고리의 다른 글

중력, 우주를 지배하는 힘  (0) 2019.11.25

https://developer.samsung.com/galaxy/foldable/techdocs

 

Technical Document | SAMSUNG Developers

Overview To make the best experience for foldable devices make sure your apps are ready to work seamlessly between two displays and be active in multi-window mode. App continuity Users will be able to control multiple displays on one mobile device. The app

developer.samsung.com

 

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788983097026&orderClick=LAG&Kc=

 

중력: 우주를 지배하는 힘

『중력: 우주를 지배하는 힘』은 뉴턴역학, 맥스웰 전자...

www.kyobobook.co.kr

 

 

중력, 우주를 지배하는 힘
국내도서
저자 : 오구리 히로시 / 박용태역
출판 : 지양사 2013.11.07
상세보기

 

'' 카테고리의 다른 글

총.균.쇠.  (0) 2019.11.25

+ Recent posts