浼楁墍鍛ㄧ煡錛學indows涓婂浜庝竴涓繘紼嬪厑璁哥殑鏈澶DI鍙ユ焺鏁伴噺涓?999錛屽鏋滅▼搴忔湁澶ч噺鐨凣DI鍙ユ焺娌℃湁琚強鏃跺洖鏀訛紝閭d箞紼嬪簭灝變細琛ㄧ幇鐨勪笉姝e父銆傚鏋滆繖縐嶉棶棰樺彂鐢熷湪浠ュ墠鐨刉INDOWS 98騫翠唬錛岀敋鑷充細閫犳垚緋葷粺宕╂簝銆?/p>
鎵浠ワ紝榪欓噷鎴戝皢闄嗙畫璁板綍涓浜汫DI緙栫▼闇瑕佹敞鎰忕殑鍦版柟錛屼綔涓轟粖鍚庡崟鍏冩祴璇曚腑鐨勪竴閮ㄥ垎鏉ヨ繘琛岋細
1銆丆reate()蹇呴』Delete()錛屽寘鎷珻reateCompatibleDC
2銆丼electObject()蹇呴』鏄垚瀵瑰嚭鐜?/p>
3銆?H"鎵撳ご鐨勪竴浜汫DI鍙ユ焺錛屽湪浣跨敤瀹屽悗瑕佸強鏃墮噴鏀俱傚::DeleteObject(HBITMAP)錛?:DeleteDC(HDC)絳?/p>
4銆佽浣忎竴涓師鍒欙細鑷繁鍒涘緩鐨勪笢瑗胯鑷繁閲婃斁錛屽GetDC 瑕?ReleaseDC
5銆丮FC鐨凣DI鏈夊緢澶氶棶棰橈紝浣跨敤鐨勬椂鍊欒闈炲父灝忓績銆傚緩璁渶濂界洿鎺ョ敤SDK鍐欍備嬌鐢╓TL涓殑GDI涔熸槸涓涓笉閿欑殑閫夋嫨銆俉TL涓湁浜汫DI瀵硅薄鍦ㄥ0鏄庣殑鏃跺欏氨鍙互鍐沖畾鏄敱鏋愭瀯鍑芥暟鏉ュ府浣犻噴鏀撅紝榪樻槸鐢變綘鑷繁閲婃斁錛岄潪甯告柟渚褲?/p>
銆銆浠ュ墠鎴戞浘緇忓疄鐜拌繃瑙傚療鑰呮ā寮忥紙signal / slot )銆傛湁浣嶆湅鍙嬩笉浠ヤ負鐒訛紝涔熸妸浠栫殑瀹炵幇鍙戠粰鎴戙傝繖鏄敤綰集錛殑鏂瑰紡瀹炵幇鐨勶紝娌℃湁浣跨敤妯℃澘錛屼笉渚濊禆浜庡叾瀹冨簱銆傚簲璇ユ槸浠縅ava鎴朇#鎺ュ彛銆傝璁″緱涓嶉敊錛屽叿鏈変互涓嬬壒鐐癸細
銆銆錛戯級褰揝ubject鎴朞bserver 閿姣佹椂錛岃繛鎺ヨ嚜鍔ㄦ柇寮錛堟敞鍐岃嚜鍔ㄥ彇娑堬級錛屽綋鐒訛紝榪欎篃鏄疄鐜拌妯″紡鐨勯噸鐐廣?br>銆銆錛掞級鑰冭檻浜嗕互涓嬪洜绱狅細涓涓猄ubject鏄惁鍏佽澶氫釜Observer瑙傚療錛熶竴涓狾bserver鏄惁鍏佽鍚屾椂瑙傚療澶氫釜Subject? 鐢辨鍙垎涓轟竴瀵逛竴錛屼竴瀵瑰錛屽瀵瑰錛屼竴鑸殑GUI搴撲腑閮芥槸鍚庝袱縐嶆儏鍐碉紝浣嗚嚜宸卞啓鐨勭▼搴忎腑鍗寸涓縐嶆儏鍐靛眳澶氥傛墍浠ヤ粬鍑轟簬鏁堢巼錛岃璁′簡SimpleSubject鍜孲impleObserver銆?br>銆銆涓嶈凍涔嬪濡備笅錛?br>銆銆錛戯級Observer::update()鍙兘甯︽棤綾誨瀷鐨勫弬鏁幫紙濂借薄涔熸病鏈夋洿濂界殑鍔炴硶錛夈?br>銆銆錛掞級鐢變簬C++涓病鏈夊尶鍚嶇被錛屾墍浠ヤ嬌鐢ㄨ搗鏉ュ茍娌℃湁Java涓柟渚褲備簬鏄垜鍙堟坊鍔犱簡涓涓狾bserverAdapter銆?br>銆銆浣跨敤涓句緥錛?
class A : public Subject
{
int value;public:
void setValue(int v)
{
value = v;
notify(&value);
}
};
class B : public Observer
{
public:
void update(void* arg)
{
printf("A changed:%d", *(int*)arg);
}
};
void f(A* a, B* b)
{
a->connect(b);
a->setValue(1);
}
浣跨敤ObserverAdapter ,鍒欏彉鎴愪簡浠ヤ笅鎯呭喌錛?
class B
{
ObserverAdapter<B> observerOfA;
public:
B(A* a) : observerOfA(this, &B::valueChanged)
{
a->connect(&observerOfA);
}
void valueChanged(void* arg)
{
printf("A changed:%d", *(int*)arg);
}
};
銆銆浠g爜鍒嗕負涓や釜鏂囦歡錛欼Observer.h 鍜?Observer.h錛屽氨璐村湪涓嬮潰鍚э細
IObserver.h 銆錛?鎺ュ彛瀹氫箟
#pragma once
class ISubject;
class IObserver
{
public:
IObserver() {}
virtual ~IObserver() {};
virtual void update(void*) = 0;
protected:
virtual void addSubject(ISubject* ) = 0;
virtual void removeSubject(ISubject* ) = 0;
friend class ISubject;
private:
IObserver(IObserver const&);
IObserver& operator= (IObserver const&);
};
class ISubject
{
public:
ISubject() {}
virtual ~ISubject() {};
virtual void connect(IObserver*) = 0;
virtual void disconnect(IObserver*) = 0;
virtual bool isConnected(IObserver*) const= 0;
virtual void notify(void*) = 0;
protected:
void addObserver(IObserver* observer);
void removeObserver(IObserver* observer);
private:
ISubject(ISubject const&);
ISubject& operator= (ISubject const&);
};
Observer.h 銆錛?鍏蜂綋瀹炵幇
#pragma once
#include <cassert>
#include <set>
#include "IObserver.h"
//-------------------------------------------------------------------
inline void ISubject::addObserver(IObserver* observer)
{
observer->addSubject(this);
}
inline void ISubject::removeObserver(IObserver* observer)
{
observer->removeSubject(this);
}
//-------------------------------------------------------------------
class SimpleSubject : public ISubject
{
public:
SimpleSubject() : m_observer(0)
{
}
~SimpleSubject()
{
if (m_observer) removeObserver(m_observer);
}
virtual void connect(IObserver* observer)
{
assert(observer);
if (m_observer)
removeObserver(m_observer);
addObserver(observer);
m_observer = observer;
}
virtual void disconnect(IObserver* observer)
{
assert(observer && observer == m_observer);
removeObserver(m_observer);
m_observer = 0;
}
virtual bool isConnected(IObserver* observer) const
{
return observer == m_observer;
}
virtual void notify(void* arg)
{
if (m_observer) m_observer->update(arg);
}
private:
IObserver* m_observer;
};
//-------------------------------------------------------------------
class Subject : public ISubject
{
public:
Subject() : m_observers()
{
}
~Subject()
{
std::set<IObserver*>::iterator
it = m_observers.begin(),
e = m_observers.end();
for (; it != e; ++it)
{
removeObserver(*it);
}
}
virtual void connect(IObserver* observer)
{
assert(observer);
addObserver(observer);
m_observers.insert(observer);
}
virtual void disconnect(IObserver* observer)
{
assert(observer);
removeObserver(observer);
m_observers.erase(observer);
}
virtual bool isConnected(IObserver* observer) const
{
return m_observers.find(observer) != m_observers.end();
}
virtual void notify(void* arg)
{
std::set<IObserver*>::iterator
it = m_observers.begin(),
e = m_observers.end();
while (it != e)
{
(*it++)->update(arg); // observer can be disconnected in update()
}
}
private:
std::set<IObserver*> m_observers;
};
//-------------------------------------------------------------------
class SimpleObserver : public IObserver
{
public:
SimpleObserver() : m_subject(0)
{
}
~SimpleObserver()
{
if (m_subject) m_subject->disconnect(this);
}
ISubject* getSubject() const
{
return m_subject;
}
private:
virtual void addSubject(ISubject* subject)
{
if (m_subject) m_subject->disconnect(this);
m_subject = subject;
}
virtual void removeSubject(ISubject* subject)
{
assert(subject == m_subject);
m_subject = 0;
}
private:
ISubject* m_subject;
};
//-------------------------------------------------------------------
class Observer : public IObserver
{
public:
Observer() : m_subjects()
{
}
~Observer()
{
std::set<ISubject*>::iterator
it = m_subjects.begin(),
e = m_subjects.end();
while (it != e)
{
(*it++)->disconnect(this);
}
}
private:
virtual void addSubject(ISubject* subject)
{
assert(subject);
m_subjects.insert(subject);
}
virtual void removeSubject(ISubject* subject)
{
assert(subject);
m_subjects.erase(subject);
}
private:
std::set<ISubject*> m_subjects;
};
//-------------------------------------------------------------------
template <class T, class Base = SimpleObserver>
class ObserverAdapter : public Base
{
public:
ObserverAdapter(T* t, void (T::*f)(void*))
: m_obj(t), m_func(f)
{
}
virtual void update(void* arg)
{
(m_obj->*m_func)(arg);
}
private:
T* m_obj;
void (T::*m_func)(void*);
};
//-------------------------------------------------------------------
銆銆鍦ㄦ湁浜涙儏鍐典笅錛岄渶瑕佺敤鍒頒竴涓湁搴忕殑vector銆傚畠鐨勬湁搴忔搷浣滄湁涓夌錛氭煡鎵撅紝鎻掑叆錛屽垹闄ゃ?br>銆銆鎻掑叆瀹炵幇錛?
template <typename Container>
inline void ordered_insert(Container& c, typename Container::value_type const& t)
{
c.insert(std::upper_bound(c.begin(), c.end(), t), t);
}
template <typename Container, typename Cmp>
inline void ordered_insert(Container& c,銆typename Container::value_type const& t,銆Cmp cmp)
{
c.insert(std::upper_bound(c.begin(), c.end(), t, cmp), t);
}
銆銆鍒犻櫎瀹炵幇錛?
template <typename Container, typename It>
inline void erase_range(Container& c, std::pair<It, It> const& r)
{
c.erase(r.first, r.second);
}
template <typename Container>
inline void ordered_erase(Container& c, typename Container::value_type const& t)
{
erase_range(c, std::equal_range(c.begin(), c.end(), t));
}
template <typename Container, typename T, typename Cmp>
inline void ordered_erase(Container& c, T const& t, Cmp cmp)
{
erase_range(c, std::equal_range(c.begin(), c.end(), t, cmp));
}
銆銆鏌ユ壘鍙氳繃binary_search, lower_bound, upper_bound, 鎴栬卐qual_range瀹炵幇銆傚鏋滆瀹炵幇綾諱技map鐨勫叧閿瓧鎼滅儲錛屾湁涓涓妧宸э紝灝辨槸鐢ㄦ瘮杈冨嚱鏁拌繘琛岄噸杞斤紝姣斿瀛︾敓瑕佹寜瀛﹀彿鏌ユ壘錛屽垯鐢ㄤ互涓嬪畾涔夛細
struct Student
{
int id;
std::string name;
struct LessThan
{
bool operator() (Student const& x, Student const& y)
{
return x.id < y.id;
}
bool operator() (Student const& x, int id)
{
return x.id < id;
}
bool operator() (int id, Student const& y)
{
return id < y.id;
}
};
};
鏌ユ壘瀛﹀彿涓?鐨勫鐢燂細
std::vector<Student> students;
bool exist = std::binary_search(students.begin(), students.end(), 5, Student::LessThan());
鍒犻櫎瀛﹀彿涓?鐨勫鐢燂細
ordered_erase(students, 5, Student::LessThan());