CAtlMap을 사용할 보통 KEY는 하나의 값을 사용합니다. 그런데 KEY 값이 하나가 아닌 두 개가 되어야 하나의 KEY가 되는 경우가 있습니다.

이럴 때는 KEY가 되는 것을 struct로 정의하고, CElementTraits을 상속 받는 Traits 클래스를 만들어야 합니다.

 

 

#include <atlcoll.h>
#include <boost/functional/hash.hpp>  // hash
를 만들기 위해 사용

// KEY가 될 유저 정의형
struct FRIENDKEY
{
    union
    {
        struct KEY
        {
            INT32    MyID;
            INT32  FriendID;
        };
        KEY Key;
        INT64 nValue;
    };

    FRIENDKEY() : nValue(0) {}
    FRIENDKEY(INT64 _value) : nValue(_value) {}
    FRIENDKEY(INT32 _MyID, INT32 _FriendID)
    {
        Key.MyID = _MyID;
        Key.FriendID = _FriendID;
    }
};

class FriendKeyTraits : public CElementTraits <FRIENDKEY>
{
public:
    static ULONG Hash(const FRIENDKEY& element) throw()
    {
        boost::hash<INT64> hasher;
        return (ULONG)hasher(element.nValue);
    }

    static bool CompareElements(const FRIENDKEY& a, const FRIENDKEY& b)
    {
        return (a.Key.nMyID == b.Key.MyID && a.Key.FriendID == b.Key.FriendID) ? true : false;
    };
};

struct FRIENDPRESENT
{
    INT32    a;
    INT32 b;
    char c;
    INT16 d;
};

 

typedef CAtlMap<FRIENDKEY, FRIENDPRESENT, FriendKeyTraits > MAP_FRIEND;
MAP_FRIEND m_Frinedlist;

 

bool IsExitFriendPresent( INT32 MyID, INT32 FriendID )
{
    FRIENDKEY FriendKey( MyID, FriendID );
    bool bIsExit = m_Frinedlist.Lookup( FriendKey );
    return bIsExit;
}

 

이거 말고 더 좋은 방법이나, KEY로 사용할 값이 3 개 이상인 경우는 어떻게 하면 좋을지 덧글이나 트랙백 부탁합니다.^^

저작자 표시
신고
by 흥배 2009.10.22 08:30

Window7 의 새로운 API Direct2D라는 것이 있습니다. 이것은 DirectX2D 기능을 Win32 API로 사용할 수 있는 것입니다.

 

저는 가장 최신의 Windows SDK설치 후 Visual Studio 2010 Beta1에서 Direct2D 예제를 빌드 해보니 빌드는 아주 잘 되었으나 실행이 제대로 되지 않았습니다.

이유는 D2D1CreateFactory 함수에서 에러가 발생했기 때문입니다. 에러는 I_GNOINTERFACE 였습니다. 처음에는 이유를 모라서 헤맸는데 검색을 해보니 인터페이스의 버전이 틀렸기 때문이었습니다.

 

제 PC에는 Windows SDK가 6.0A, 7.0, 7.0A 이렇게 총 3개가 설치 되어있어서 lib 파일과 헤더 파일의 버전이 서로 다르게 링킹 되었던 것 같더군요.

그래서 수동으로 lib 파일과 헤더 파일을 7.0으로 맞추니 문제 없이 실행 되었습니다.

 

Direct2D의 D2D1CreateFactory에서 실패가 발생하는 분들은 헤더 파일과 lib 파일의 디렉터리를 같은 SDK 디렉터리로 맞추면 아마 문제가 없을 것입니다.

저작자 표시
신고
by 흥배 2009.09.21 01:59
| 1 2 3 4 5 |