::NPTEAM:: Network Programer Team

검색 :
RSS 구독 : 글 / 댓글 / 트랙백 / 글+트랙백

[API] Rect 관련 API 함수


BOOL DrawFocusRect( HDC hDC, CONST RECT * lprc );
점선의 포커스 활성화 이미지를 그린다.

int FillRect( HDC hDC, CONST RECT *lprc, HBRUSH hbr );
특정 브러쉬로 내부를 체운다.

int FrameRect( HDC hDC, CONST RECT *lprc, HBRUSH hbr );
1픽셀의 브러쉬로 외곽선을 체운다.

BOOL InvertRect( HDC hDC,  CONST RECT *lprc );
Rect 영역을 반전 시킨다.

BOOL SetRect( LPRECT lprc, int xLeft, int yTop, int xRight, int yBottom );
Rect 영역 설정

BOOL SetRectEmpty( LPRECT lprc );
비운다.

BOOL CopyRect( LPRECT lprcDst, CONST RECT *lprcSrc );
복사한다.

BOOL InflateRect( LPRECT lprc, int dx, int dy );
RECT 확장하기

BOOL IntersectRect( LPRECT lprcDst,  CONST RECT *lprcSrc1,  CONST RECT *lprcSrc2 );
Rect1, Rect2의 교집합 Rect를 구한다.

BOOL UnionRect(LPRECT lprcDst, CONST RECT *lprcSrc1, CONST RECT *lprcSrc2 );
Rect1, Rect2의 합집합 Rect를 구한다.

BOOL SubtractRect( LPRECT lprcDst,  CONST RECT *lprcSrc1, CONST RECT *lprcSrc2 );
Rect1에서 Rect2를 뺀 Rect를 구한다.

BOOL OffsetRect( LPRECT lprc,  int dx, int dy );
Rect를 x, y 만큼 이동한다.

BOOL IsRectEmpty( CONST RECT *lprc );
Rect가 비어 있는지 검사한다.

BOOL EqualRect( CONST RECT *lprc1, CONST RECT *lprc2 );
Rect1과 Rect2가 같은지 비교한다.

BOOL PtInRect( CONST RECT *lprc,POINT pt );
Rect영역 안에 Point 좌표가 있는지 검사한다.

2006/11/15 13:22 2006/11/15 13:22

맨 위로

[MFC] 클래스 기본 헤더 정리

/////////////////////////////////////////////////////////////////////////////
// 클래스 전방 참조
class CBaseView;
 
class CGameView 
{
// Constructor and Destructor
public:
  CGameView();
  CGameView(CBaseView* pBaseView);
  virtual ~CGameView();
 
// Initialization
public:
 
// Methods
public:
 
// Properties Set...(), Get...()
public:
 
// Attributes
public:
 
}
 
2006/10/16 21:58 2006/10/16 21:58

맨 위로

메모리릭이 걸린 부분 찾기(Memory Leaks)

프로그램을 디버깅하다가 종료를 할경우 output 창에 메모리릭이 발생했다는 창을 종종 보게 된다.

Detected memory leaks!

Dumping objects ->

{10555} normal block at 0x003B7C50, 33 bytes long.

Data: <  2|            > D8 9C 32 7C 0B 00 00 00 10 00 00 00 01 00 00 00

프로그램이 수행되면서 10555번째로 new 를 수행하여 할당된 0x003B7C50 번지에 33바이트짜리 릭이 발생했다는 것이다.

코딩한 부분중에 의심 갈만한 new 가 어림직히 생각 나는경우 쉽게 해결할 수 있지만, 만일 프로젝트가 커진 상황이나,

여러명이 동시에 하나의 소스를 만지고 있을경우에는 이러한 부분을 찾기가 힘들어 진다. 이런상황에서 쉽게 찾을수

있는 방법을 소개한다.

가장 먼저 수행이 되는 파일(stdafx.h 같은곳)에 아래의 내용을 선언해 준다.

#define CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

그리고 가장 먼저 수행되는 코드에 break point 를 건다.

main()
{

  int a; // 이곳에 브포를 걸어 줍니다. 가장 먼저 수행되는 코드..
  int b;
  int* c = new int[100];

  // .. 쭉 코딩된곳..
}

debug 모드로 수행하면 main 바로 아랫 break point 에서 멈추게 된다.

그러면 Watch 창을 열고

이름 부분에 {,,msvcr71d.dll}_crtBreakAlloc

값 부분에 10555 를 넣는다.

그리고 계속 시작(F5)를 누르게 되면 해당되는 new 위치에서 수행이 멈추게 된다.

프로젝트가 단일쓰레드 프로그램이라면 윗 watch 창 이름 부분에

_crtBreakAlloc 을 넣어야 한다.

2006/10/02 23:39 2006/10/02 23:39

맨 위로

[MFC] URL Encoding, Decoding

CString EnCodeStr(CString ToCode)
{
  CString RetStr,AddStr;
  int i,max;
  unsigned short asc;
  unsigned char c;
  max = (unsigned int)ToCode.GetLength();
  for(i=0;i<max;i++)
  {
    c = ToCode[i];
    asc = c;//(unsigned int)c;
    if(asc>47 && asc<58)
    {
      RetStr+=c;//Interim[(int)i];
    }
    else if(asc>64 && asc<91)
    {
      RetStr+=c;//Interim[(int)i];
    }
    else if(asc>96 && asc<123)
    {
      RetStr+=c;//Interim[(int)i];
    }
    else if(asc==32)
    {
      RetStr+="+";
    }
    else
    {
      AddStr.Format("%%%2x",asc);
      int iv = (int)AddStr.GetAt(1);
      if((int)AddStr.GetAt(1)==32)
      {
        AddStr.SetAt(1,'0');
      }
      RetStr+=AddStr;
    }
  }
  return RetStr;
}

CString DeCodeStr(CString ToCode)
{
  CString RetStr,AddStr;
  int i,max;
  unsigned short asc;
  unsigned char c;
  max = (unsigned int)ToCode.GetLength();
  for(i=0;i<max;)
  {
    c = ToCode[i];
    asc = c;//(unsigned int)c;
    if(asc==37)
    {
      AddStr=ToCode.Mid(i+1,2);
      i+=3;
      sscanf((LPCTSTR)AddStr,"%2x",&asc);
      RetStr+=(char)asc;
    }
    else if(asc==43)
    {
      RetStr += ' ';
      i++;
    }
    else
    {
      RetStr += c;
      i++;
    }
  }
  return RetStr;
}
 
2006/10/02 23:26 2006/10/02 23:26

맨 위로

[WTL] Visual Studio 6.0에서 설치 가능한 WTL 7.5, 8.0

[WTL] Visual Studio 6.0에서 설치 가능한 WTL 7.5, 8.0

http://sourceforge.net/projects/wtl 에서 다운로드 한 WTL에

비주얼 스튜디오 6.0에서 설치 가능하도록 AppWiz60/setup.js를 추가하여 압축한 파일
2006/10/02 22:09 2006/10/02 22:09

맨 위로

[SOCKET] CLOSEHANDLE,CLOSESOCKET,CLOSEEVENT,CLOSETHREAD

public:
void CLOSEHANDLE( HANDLE x )
{
  if( x != NULL )
  {
    CloseHandle(x);
    x = NULL;
  }
}

void CLOSESOCKET( SOCKET x )
{
  if( x != INVALID_SOCKET )
  {
    closesocket( x );
    x = INVALID_SOCKET;
  }
}

void CLOSEEVENT( HANDLE x )
{
  if( x != NULL )
  {
    SetEvent( x );
    CloseHandle( x );
    x = NULL;
  }
}

void CLOSETHREAD( HANDLE x )
{
  DWORD dwCode = 0;
 
  if( x != NULL )
  {
    if( GetExitCodeThread( x, &dwCode ) )
    {
      if( dwCode == STILL_ACTIVE )
      {
        WaitForSingleObject( x, 5000 );
        if( GetExitCodeThread( x, &dwCode ) )
        {
          if( dwCode == STILL_ACTIVE )
          {
            TerminateThread( x, dwCode );
          }
        }
      }
    }
    CloseHandle( x );
    x = NULL;
  }
}
 
2006/08/10 13:01 2006/08/10 13:01

맨 위로

[MFC] HINSTANCE 인스턴스 핸들 얻어오기

HINSTANCE hInstance = (HINSTANCE)GetWindowLong( hwnd, GWL_HINSTANCE );
 
2006/08/10 04:08 2006/08/10 04:08

맨 위로

[REG] NT계열 소켓 최대수 5000개 미만으로 설정되어 있음(서버관련)

참고로 NT System의 TCP에서의 소켓의 갯수는 5000개 미만입니다
즉 5000개 미만으로 제한되어 있다는거죠
이 수는 레지스트리 수정으로 변경할 수 있습니다.
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\MaxUserPort 이 부분을 수정하시면 됩니다.
2006/08/10 01:58 2006/08/10 01:58

맨 위로

[SOCKET] KeepAlive를 이용해서 TCP/IP 연결 주기적으로 확인하기

// Socket 생성
  BOOL bOptVal = 1;
  if( setsockopt( m_socListen, SOL_SOCKET, SO_KEEPALIVE, (const char *)&bOptVal, sizeof(bOptVal) ) == SOCKET_ERROR )
  {
    m_sError.Format( "Listen Socket SO_KEEPALIVE Error" );
    closesocket( m_socListen );
    m_socListen = INVALID_SOCKET;
    return FALSE;
  }

// Bind()



Windows Registry Editor Version 5.00

; KeepAlive 1000ms 마다 체크 16진수로 3E8
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"KeepAliveTime"=dword:000003E8


2006/08/08 14:02 2006/08/08 14:02

맨 위로

[C++] min, max를 이용한 최대값 최소값 범위 제한하기

////////////////////////////////////////////////////////////////////////////////////////////////
// C 프로그래밍을 하다보면 최소값 0, 최대값 100 이렇게 값에 대한 제한을 걸어야 하는 경우가 많다.
// 이때 if 문을 사용하면 구문이 길어지므로 다음과 같이 min( a, b ) max( a, b ) define을 이용하여
// 1줄로 처리하는 것이 편하다.


// 최소값 0, 최대값 100으로 범위 제한하는 방법
int nRange = 50;

nRange = max( 0, min( 100, nRange ) );


// max 다음에 최소값, min 다음에 최대값을 넣어주면 된다.

출처 : TTF 블로그
 
2006/08/01 01:32 2006/08/01 01:32

맨 위로

CArray 를 qsort 함수를 이용하여 쉽게정렬하는 템플릿

// CArray 를 qsort 함수를 이용하여 쉽게 정렬하는 템플릿입니다.
// 핵심은 QSortCArray() 입니다.

#include "afxtempl.h"

// CArray 정렬 템플릿 함수

template<class T>
void QSortCArray( T& t, int (__cdecl *compare )(const void *elem1, const void *elem2 ) )
{
  if( t.GetSize() <= 0 )
  {
    return;
  }
 
  qsort( t.GetData(), t.GetSize(), sizeof( t[0] ), compare );
}


// int 자료형 비교 함수
int CompareInt( const void *elem1, const void *elem2 )
{
  int* p1 = (int*) elem1;
  int* p2 = (int*) elem2;
 
  if( *p1 > *p2 ) return +1;
  if( *p1 < *p2 ) return -1;
 
  return 0;
}

// CPoint 자료형 비교 함수
int ComparePoint( const void *elem1, const void *elem2 )
{
  CPoint* p1 = (CPoint*) elem1;
  CPoint* p2 = (CPoint*) elem2;
 
  if( p1->x > p2->x ) return +1;
  if( p1->x < p2->x ) return -1;
 
  return 0;
}


// qsort 시험
void test_qsort_carray()
{
  // int 자료형 정렬 테스트             
  CArray< int, int > a;
 
  a.Add( 9 );
  a.Add( 1 );
  a.Add( 3 );
  a.Add( 6 );
  a.Add( 8 );
 
  QSortCArray( a, CompareInt );
 
  for( int i=0; i<a.GetSize(); i++ )
  {
    TRACE( "%s:%d Value1 = %d \n", __FILE__, __LINE__, a[i] );
  }
 
  // CPoint 자료형 정렬 테스트       
  CArray< CPoint, CPoint > b;
 
  b.Add( CPoint( 4, 6 ) );
  b.Add( CPoint( 3, 5 ) );
  b.Add( CPoint( 7, 7 ) );
  b.Add( CPoint( 1, 8 ) );
  b.Add( CPoint( 9, 2 ) );
 
  QSortCArray( b, ComparePoint );
 
  for( i=0; i<b.GetSize(); i++ )
  {
    TRACE( "%s:%d Value1 = (%d,%d) \n", __FILE__, __LINE__, b[i].x, b[i].y );
  }
}


출처 : kyuseo
 
2006/07/25 10:27 2006/07/25 10:27

맨 위로

MYTRACE를 이용한 Debugging Log 만들기

//////////////////////////////////////////////////////////////////////////
// TRACE 재정의

#define MYTRACE( x )    TRACE( "▶ " #x " %s(%d)\n", __FILE__, __LINE__)
#define MYTRACE( x ) ATLTRACE( "▶ " #x " %s(%d)\n", __FILE__, __LINE__)


// 사용방법
MYTRACE( 이 부분에서 프로그램 시작 );
MYTRACE( 이 부분에서 프로그램 종료 );
위와 같이 MFC에서 TRACE, ATL에서 ATLTRACE를 재정의 해서
TRACE 내용과 파일명(라인번호)가 같이 나오도록 하였다.

(!주의사항) 사용시 MYTRACE 2개중에 하나는 주석 처리 하고 사용할 것

출처 : TTF블로그(http://www.npteam.net)
 
2006/07/17 02:49 2006/07/17 02:49

맨 위로

pragma message 이용해서 해야할 일 관리하는 법

//////////////////////////////////////////////////////////////////////////
// #pragma message TODO(msg) 재정의 - 해야할 일

#define LINE1(x) #x
#define LINE(x) LINE1(x)
#define TODO(msg) message ( __FILE__ "(" LINE(__LINE__) "): [TODO] " msg )


// 사용법 :
// #pragma TODO( "해야할 일" )



#pragma를 이용해서 프로젝트에 할일을 F4 단축키로 찾아갈 수 있게 하는 방법

사용법 윗 부분을 복사해서 stdafx.h.. 등의 위치에 복사한 후 소스코드 중간에
#pragma TODO( "WM_TIMER - 타이머 처리 미구현" )

이와 같이 추가하면 컴파일 후 Build 창에 내용이 표시된다.

출처 : TTF블로그(http://www.npteam.net)
 
2006/07/17 02:43 2006/07/17 02:43

맨 위로

[VC] 비주얼 스튜디오 6.0에서 UNICODE 컴파일 모드 추가하기

--------------------------------------------------
VC6에서 UNICODE 컴파일 모드의 추가는
--------------------------------------------------

1. Build메뉴->Configurations...를 클릭

2. 컴파일모드를 추가할 플젝 선택

3. Add 버튼 클릭

4. 컴팔모드 이름과 플랫폼 설정하시고, 2번째 콤보박스에서 님이 생성하고 싶은 모드의 설정값들과
  가장 유사한 설정값을 가진 모드를 선택합니다. (이 모드의 설정값을 복사해서 생성한다는 뜻입니다.)

  ex) Unicode Debug인 경우, 기본적으로 Win32 Debug를 setting하고,

       생성 후, _MBCS를 _UNICODE로 변경하면 됩니다.

5. OK버튼 클릭.

6. 컴파일시
  msvcrtd.lib(crtexew.obj): error LNK2001:unresolvec external symbol _WinMain@16
  라는 에러가 떨어지면 링크 탭에서
  /entry:"wWinMainCRTStartup"
  옵션을 추가함.

* VC++ 설치시 기본 옵션에 유니코드 라이브러리가 선택되지 않으므로 다시 설치해야 함.

  쉬운 방법은 CD에서  VC98\MFC 밑에 있는 모든 파일을 VC 설치 폴더에 붙여 넣으면 됨.

ETC 에러시...

이외의 그냥 참고

일단 'uafxcw.lib'라이브러리는 Unicode 컴파일시 Static Link Library 를 사용할경우

포함하는 파일입니다..


메뉴 중 [Project]/[Settings...]/[-C/C++]/[Preprocessor definitions] 항목에서

'_MBCS' 항목을 지우고 '_UNICODE' 형태로 하면 Unicode로 컴파일 됩니다..


그리고, 실행파일일 경우는 [Link] 힝목에서 Category를 Output으로 설정하고,

Entry-point symbol 항목에 'wWinMainCRTStartup'를 넣어 주셔야 합니다..


저같은 경우는 동적 라이브러리를 사용하기 때문에, 그런 에러가 나타나지 않는데,

만약 위와 같이 했는데도 링크 에러가 나타날 경우, [Link] 항목에서 Category를 General로 맞추시고,

Object/library modules: 항목에 직접 'uafxcw.lib'를 입력해 보세요..


######

Visual Studio 2005 에서는 프로젝트 위자드에서 유니코드 항목을 체크하고 언어를 영어로 해야 리소스에 있는 한글이 깨지지 않음.

######

2006/07/02 17:14 2006/07/02 17:14

맨 위로

[TCP] recv Helper 함수(버퍼 크기만큼 받을때까지..)

// TCP/IP recv를 버퍼 크기만큼 받을때까지 계속 받는 함수
int Receiven(SOCKET s, BYTE *lpBuff, int nBuffLength, int flags)
{
  ASSERT( IsBadWritePtr(lpBuff, nBuffLength) == FALSE );
 
  BYTE* pBuff = lpBuff;
  int nLeft = nBuffLength;
  int nError;
 
  while( nLeft > 0 )
  {
    int nRead = recv( s, pBuff, nLeft, int flags );
   
    // 파일 전송 에러 처리
    switch( nRead )
    {
    case 0:
      /* the connection has been closed */
      break;
     
    case SOCKET_ERROR:
      nError = WSAGetLastError();
     
      if( nError == WSAEWOULDBLOCK )
      {
      /* The socket is marked as nonblocking and
        the Receive operation would block. */

        TRACE0("Receiven - WSABLOCK\n");
        break;
      }
      else
      {
        TRACE1("Receiven() - Error Code = %d\n", nError);
        return SOCKET_ERROR;
      }
     
      break;
     
    default:
      if( nRead >= nBuffLength )
      {
        nLeft -= nRead;
        pBuff += nRead;
      }
      else
      {
        return nRead;
      }
     
      break;
    }
  }
 
  return ( nBuffLength - nLeft );
}
 
2006/05/14 00:32 2006/05/14 00:32

맨 위로