锘??xml version="1.0" encoding="utf-8" standalone="yes"?>国产亚洲欧洲一区高清在线观看,久久网站热最新地址,国产欧美日韩在线视频http://m.shnenglu.com/vivence/c++ programmerzh-cnSun, 16 Nov 2025 06:36:17 GMTSun, 16 Nov 2025 06:36:17 GMT60AVL鏍?/title><link>http://m.shnenglu.com/vivence/archive/2011/06/17/AVLTree.html</link><dc:creator>EvilGhost</dc:creator><author>EvilGhost</author><pubDate>Fri, 17 Jun 2011 12:01:00 GMT</pubDate><guid>http://m.shnenglu.com/vivence/archive/2011/06/17/AVLTree.html</guid><wfw:comment>http://m.shnenglu.com/vivence/comments/148880.html</wfw:comment><comments>http://m.shnenglu.com/vivence/archive/2011/06/17/AVLTree.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/vivence/comments/commentRss/148880.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/vivence/services/trackbacks/148880.html</trackback:ping><description><![CDATA[<p> </p><p>AVLTree.h鏂囦歡</p> <p> </p><div id="hvzpftn" class="cnblogs_Highlighter"> <pre class="brush:cpp;gutter:false;">#ifndef AVL_TREE_H #define AVL_TREE_H #include <cassert> #include <algorithm> #ifdef _PRINT #include <vector> #include <iostream> #include <memory> #include <functional> #endif // _PRINT namespace ghost{ /// AVL鏍? template<typename ComparableT> class AVLTree{ public: typedef ComparableT DataType; private: /// 鑺傜偣錛岀紦瀛樹簡鑷韓鐨勯珮搴? struct Node_{ DataType data; // 鍙繘琛屾瘮杈冪殑鏁版嵁 Node_* pLeftChild; // 鎸囧悜宸﹀効瀛? Node_* pRightChild; // 鎸囧悜鍙沖効瀛? int height; // 浣滀負鏍硅妭鐐圭殑鏍戦珮搴︼紝 Node_() : pLeftChild(0) , pRightChild(0) , height(0) // 綰﹀畾鍙跺瓙楂樺害涓?錛屾晠鑺傜偣楂樺害鍒濆鍖栦負0 { } explicit Node_(const DataType& d) : data(d) , pLeftChild(0) , pRightChild(0) , height(0) // 綰﹀畾鍙跺瓙楂樺害涓?錛屾晠鑺傜偣楂樺害鍒濆鍖栦負0 { } Node_(const Node_&) = delete; Node_& operator =(const Node_&) = delete; }; Node_* pRoot_; // 鎸囧悜鏍硅妭鐐? public: /// 榛樿鍒濆鍖栦負絀烘爲 AVLTree() : pRoot_(0) { #ifdef _PRINT std::cout<<"鍒涘緩AVL鏍?<<std::endl; #endif // _PRINT } ~AVLTree() { Clear(); } AVLTree(const AVLTree&) = delete; AVLTree& operator =(const AVLTree&) = delete; public: /// 鑾峰彇鏍戦珮搴︼紝絀烘爲榪斿洖-1錛屽彧鏈変釜鑺傜偣榪斿洖0 int GetHeight() const{return GetHeight_(pRoot_);} #ifdef _PRINT /// 鎵撳嵃鑰咃紝鍗抽渶瑕佹墦鍗扮殑瀵硅薄 class Printer{ public: virtual ~Printer(){} public: virtual void Print() const{} virtual bool IsValid() const{return false;} }; typedef std::shared_ptr<Printer> PSharedPrinter; // 鎵撳嵃鑰呭叡浜寚閽? typedef std::vector<PSharedPrinter> PrinterContainer; // 鎵撳嵃鑰呭叡浜寚閽堢殑瀹瑰櫒 /// 鑺傜偣鎵撳嵃鑰? class NodePrinter : public Printer{ Node_* pNode_; size_t width_; PrinterContainer& nextPrinters_; public: NodePrinter(Node_* p, PrinterContainer& printers) : pNode_(p) , width_(0) , nextPrinters_(printers) { assert(pNode_); UpdateWidth(); } virtual ~NodePrinter(){} NodePrinter(const NodePrinter&) = delete; NodePrinter& operator =(const NodePrinter&) = delete; public: void UpdateWidth() { width_ = CalcDataWidth_(pNode_->data); } virtual void Print() const { // 璁$畻宸﹀彸瀛愭爲瀹藉害 size_t leftChildWidth = CalcWidth_(pNode_->pLeftChild); size_t rightChildWidth = CalcWidth_(pNode_->pRightChild); // +1鏄負浜嗗皢鏁版嵁闅斿紑 // 鎵撳嵃宸﹁竟絀虹櫧 for (size_t i = 0; i < leftChildWidth; ++i) { std::cout<<' '; } // 鎵撳嵃鑺傜偣 std::cout<<"["<<pNode_->data<<"]"; // 鎵撳嵃鍙寵竟絀虹櫧 for (size_t i = 0; i < rightChildWidth; ++i) { std::cout<<' '; } // 灝嗗乏鍎垮瓙鏀懼叆涓嬩竴灞傞渶瑕佹墦鍗扮殑鑺傜偣闆嗗悎涓? if (pNode_->pLeftChild) { nextPrinters_.push_back(PSharedPrinter(new NodePrinter(pNode_->pLeftChild, nextPrinters_))); } // 灝嗚嚜韜墍鍗犵┖浣嶆斁鍏ヤ笅涓灞傞渶瑕佹墦鍗扮殑鑺傜偣闆嗗悎涓? nextPrinters_.push_back(PSharedPrinter(new BlankPrinter(width_))); // 灝嗗彸鍎垮瓙鏀懼叆涓嬩竴灞傞渶瑕佹墦鍗扮殑鑺傜偣闆嗗悎涓? if (pNode_->pRightChild) { nextPrinters_.push_back(PSharedPrinter(new NodePrinter(pNode_->pRightChild, nextPrinters_))); } // 灝嗚嚜韜墍鍗犵┖浣嶆斁鍏ヤ笅涓灞傞渶瑕佹墦鍗扮殑鑺傜偣闆嗗悎涓? nextPrinters_.push_back(PSharedPrinter(new BlankPrinter(width_))); } virtual bool IsValid() const{return true;} }; /// 絀虹櫧鎵撳嵃鑰咃紝涓昏瀹屾垚鎵撳嵃鐖惰妭鐐規墍鍗犵敤鐨勭┖鐧? class BlankPrinter : public Printer{ size_t count_; public: explicit BlankPrinter(size_t c) : count_(c){} virtual ~BlankPrinter(){} public: virtual void Print() const { for (size_t i = 0; i < count_; ++i) { std::cout<<' '; } } }; /// 騫垮害浼樺厛鎵撳嵃鑺傜偣錛岀洰鍓嶅彧鏀寔鎵撳嵃int鍨嬫暟鎹? void Print() const { std::cerr<<"涓嶆敮鎸佹墦鍗扮殑鏁版嵁綾誨瀷錛?<<typeid(DataType).name()<<"\n"; } private: /// 璁$畻鍗佽繘鍒舵暟浣嶆暟 static size_t CalcDataWidth_(int n) { assert(false); } /** 璁$畻鏍戝搴? 鍥犱負綰﹀畾絀烘爲瀹藉害涓?錛屽彾瀛愬搴︿負1錛屾墍浠ユ爲瀹藉害絳変簬宸﹀彸瀛愭爲瀹藉害鍜?鏁版嵁鎵鍗犵殑浣嶆暟 */ static size_t CalcWidth_(const Node_* pRoot) { if (!pRoot) { return 0; } return CalcWidth_(pRoot->pLeftChild) + CalcWidth_(pRoot->pRightChild) + CalcDataWidth_(pRoot->data); } #endif // _PRINT public: /// 鎻掑叆鏁版嵁 void Insert(const DataType& data) { #ifdef _PRINT std::cout<<"鎻掑叆鏁版嵁錛?<<data<<std::endl; #endif // _PRINT Insert_(data, pRoot_); } /// 鍒犻櫎鏁版嵁 void Erase(const DataType& data) { #ifdef _PRINT std::cout<<"鍒犻櫎鏁版嵁錛?<<data<<std::endl; #endif // _PRINT Erase_(data, pRoot_); } /// 娓呯┖ void Clear() { #ifdef _PRINT std::cout<<"娓呯┖"<<std::endl; #endif // _PRINT // 閿姣佹墍鏈夎妭鐐? RecursDestroyNode_(pRoot_); pRoot_ = 0; } private: /// 鍒涘緩鑺傜偣 static Node_* CreateNode_(const DataType& data) { return new Node_(data); } /// 閿姣佽妭鐐? static void DestroyNode_(Node_* pNode) { delete pNode; } /// 閫掑綊閿姣佽妭鐐? static void RecursDestroyNode_(Node_* pNode) { if (pNode) { // 鍏堥掑綊閿姣佸瓙鑺傜偣 RecursDestroyNode_(pNode->pLeftChild); RecursDestroyNode_(pNode->pRightChild); // 鍐嶉攢姣佽嚜韜? DestroyNode_(pNode); } } /// 鑾峰彇鏍戦珮搴︼紝綰﹀畾絀烘爲楂樺害涓?1 static int GetHeight_(const Node_* pRoot) { return pRoot ? pRoot->height : -1; } /** 璁$畻鏍戦珮搴? 鍥犱負綰﹀畾絀烘爲楂樺害涓?1錛屽彾瀛愰珮搴︿負0錛屾墍浠ユ爲楂樺害絳変簬宸﹀彸瀛愭爲杈冮珮鑰呴珮搴?1 */ static int CalcHeight_(const Node_* pRoot) { assert(pRoot); // 鏂█鏍戝瓨鍦? return std::max(GetHeight_(pRoot->pLeftChild), GetHeight_(pRoot->pRightChild)) + 1; } /** 涓庡瓙鏍戣繘琛屽崟鏃嬭漿 鐢變簬鏃嬭漿鍚庤妭鐐瑰皢鎴愪負鍏跺師鍎垮瓙鐨勫効瀛愶紝鏁呰妭鐐規寚閽坧Node灝嗕細鎸囧悜鍏跺師鍎垮瓙 pChild1鎸囧悜琚棆杞殑鍎垮瓙鎴愬憳鎸囬拡錛宲Child2鎸囧悜鍙︿竴涓効瀛愭垚鍛樻寚閽? */ static void SingleRatateWithChild_(Node_*& pNode, Node_* Node_::* pChild1, Node_* Node_::* pChild2) { assert(pChild1 && pChild2); // 鏂█鎴愬憳鍙橀噺鎸囬拡鏈夋晥 assert(pNode); // 鏂█鑺傜偣瀛樺湪 // 鑺傜偣鐨勫効瀛?閲嶅畾鍚戜簬鍎垮瓙1鐨勫効瀛? Node_* pOriginalChild = pNode->*pChild1; pNode->*pChild1 = pOriginalChild->*pChild2; // 鑺傜偣鐨勫師鍎垮瓙1鐨勫効瀛?閲嶅畾鍚戜簬鑺傜偣 pOriginalChild->*pChild2 = pNode; // 鏃嬭漿涔嬪悗闇瑕侀噸鏂拌綆楅珮搴? pNode->height = CalcHeight_(pNode); pOriginalChild->height = CalcHeight_(pOriginalChild); // pNode鎸囧悜鍏跺師鍎垮瓙 pNode = pOriginalChild; } /// 涓庡乏瀛愭爲榪涜鍗曟棆杞? static void RotateWithLeftChild_(Node_*& pNode) { SingleRatateWithChild_(pNode, &Node_::pLeftChild, &Node_::pRightChild); } /// 涓庡彸瀛愭爲榪涜鍗曟棆杞? static void RotateWithRightChild_(Node_*& pNode) { SingleRatateWithChild_(pNode, &Node_::pRightChild, &Node_::pLeftChild); } /** 涓庡瓙鏍戣繘琛屽弻鏃嬭漿 鐢變簬鏃嬭漿鍚庤妭鐐瑰皢鎴愪負鍏跺師鍎垮瓙鐨勫効瀛愶紝鏁呰妭鐐規寚閽坧Node灝嗕細鎸囧悜鍏跺師鍎垮瓙 pChild1鎸囧悜琚棆杞殑鍎垮瓙鎴愬憳鎸囬拡錛宲Child2鎸囧悜鍙︿竴涓効瀛愭垚鍛樻寚閽? */ static void DoubleRatateWithChild_(Node_*& pNode, Node_* Node_::* pChild1, Node_* Node_::* pChild2) { assert(pChild1); // 鏂█鎴愬憳鍙橀噺鎸囬拡鏈夋晥 // 鍏堝鍎垮瓙榪涜涓嬈℃棆杞? SingleRatateWithChild_(pNode->*pChild1, pChild2, pChild1); // 鍐嶅鑷繁榪涜涓嬈℃棆杞? SingleRatateWithChild_(pNode, pChild1, pChild2); } /// 涓庡乏瀛愭爲榪涜鍙屾棆杞? static void DoubleRotateWithLeftChild_(Node_*& pNode) { DoubleRatateWithChild_(pNode, &Node_::pLeftChild, &Node_::pRightChild); } /// 涓庡彸瀛愭爲榪涜鍙屾棆杞? static void DoubleRotateWithRightChild_(Node_*& pNode) { DoubleRatateWithChild_(pNode, &Node_::pRightChild, &Node_::pLeftChild); } /** 紜畾宸﹀瓙鏍戞槸鍚﹁繃楂橈紙鐮村潖浜咥VL騫寵 鏉′歡錛夛紝鏄垯涓庡叾榪涜鏃嬭漿 褰撳湪宸﹀瓙鏍戜腑鎻掑叆鏂拌妭鐐癸紝鎴栬呭湪鍙沖瓙鏍戜腑鍒犻櫎鑺傜偣鏃朵嬌鐢? */ static void RatateWithLeftChildIfNeed_(Node_*& pNode) { // AVL騫寵 鏉′歡涓哄乏鍙沖瓙鏍戦珮搴︾浉宸笉瓚呰繃1 // 宸﹀瓙鏍戞瘮鍙沖瓙鏍戦珮2錛岄渶瑕侀氳繃鏃嬭漿鏉ヤ嬌涔嬮噸鏂拌揪鍒癆VL騫寵 鏉′歡 if (2 == GetHeight_(pNode->pLeftChild) - GetHeight_(pNode->pRightChild)) { if (GetHeight_(pNode->pLeftChild->pLeftChild) > GetHeight_(pNode->pLeftChild->pRightChild)) { // 宸﹀瓙鏍戠殑宸﹀瓙鏍戦珮浜庡乏瀛愭爲鐨勫彸瀛愭爲錛屽簲褰撲笌宸﹀瓙鏍戣繘琛屽崟鏃嬭漿 RotateWithLeftChild_(pNode); } else { // 宸﹀瓙鏍戠殑鍙沖瓙鏍戦珮浜庡乏瀛愭爲鐨勫乏瀛愭爲錛屽簲褰撲笌宸﹀瓙鏍戣繘琛屽弻鏃嬭漿 DoubleRotateWithLeftChild_(pNode); } } } /** 紜畾鍙沖瓙鏍戞槸鍚﹁繃楂橈紙鐮村潖浜咥VL騫寵 鏉′歡錛夛紝鏄垯涓庡叾榪涜鏃嬭漿 褰撳湪鍙沖瓙鏍戜腑鎻掑叆鏂拌妭鐐癸紝鎴栬呭湪宸﹀瓙鏍戜腑鍒犻櫎鑺傜偣鏃朵嬌鐢? */ static void RatateWithRightChildIfNeed_(Node_*& pNode) { // AVL騫寵 鏉′歡涓哄乏鍙沖瓙鏍戦珮搴︾浉宸笉瓚呰繃1 // 鍙沖瓙鏍戞瘮宸﹀瓙鏍戦珮2錛岄渶瑕侀氳繃鏃嬭漿鏉ヤ嬌涔嬮噸鏂拌揪鍒癆VL騫寵 鏉′歡 if (2 == GetHeight_(pNode->pRightChild) - GetHeight_(pNode->pLeftChild)) { if (GetHeight_(pNode->pRightChild->pRightChild) > GetHeight_(pNode->pRightChild->pLeftChild)) { // 鍙沖瓙鏍戠殑鍙沖瓙鏍戦珮浜庡彸瀛愭爲鐨勫乏瀛愭爲錛屽簲褰撲笌鍙沖瓙鏍戣繘琛屽崟鏃嬭漿 RotateWithRightChild_(pNode); } else { // 鍙沖瓙鏍戠殑宸﹀瓙鏍戦珮浜庡彸瀛愭爲鐨勫彸瀛愭爲錛屽簲褰撲笌鍙沖瓙鏍戣繘琛屽弻鏃嬭漿 DoubleRotateWithRightChild_(pNode); } } } /** 鎻掑叆鏂拌妭鐐癸細 濡傛灉褰撳墠鑺傜偣涓虹┖鍒欒鏄庢壘鍒頒簡鎻掑叆鐨勪綅緗紝鍒涘緩鏂拌妭鐐癸紝榪斿洖鎻掑叆鎴愬姛 濡傛灉鏁版嵁灝忎簬褰撳墠鑺傜偣鏁版嵁鍒欏埌宸﹀瓙鏍戜腑鎻掑叆錛屽鏋滄彃鍏ユ垚鍔燂紝鍙兘闇瑕佹棆杞嬌涔嬮噸鏂板鉤琛★紙宸﹀瓙鏍戣繃楂橈級錛岄噸鏂拌綆楅珮搴? 濡傛灉鏁版嵁澶т簬褰撳墠鑺傜偣鏁版嵁鍒欓亾鍙沖瓙鏍戜腑鎻掑叆錛屽鏋滄彃鍏ユ垚鍔燂紝鍙兘闇瑕佹棆杞嬌涔嬮噸鏂板鉤琛★紙鍙沖瓙鏍戣繃楂橈級錛岄噸鏂拌綆楅珮搴? 濡傛灉鏁版嵁絳変簬褰撳墠鑺傜偣鏁版嵁鍒欎粈涔堥兘涓嶅仛錛岃繑鍥炴彃鍏ュけ璐? */ static bool Insert_(const DataType& data, Node_*& pNode) { if (!pNode) { // 鎵懼埌浣嶇疆錛屽垱寤鴻妭鐐? pNode = CreateNode_(data); assert(pNode); // 鏂█鍒涘緩鑺傜偣鎴愬姛 return true; } else if (data < pNode->data) { // 灝嗚緝灝忕殑鏁版嵁鎻掑叆鍒板乏瀛愭爲 if (Insert_(data, pNode->pLeftChild)) { // 鎴愬姛鎻掑叆鏂拌妭鐐? // 濡傛灉闇瑕侊紝鍒欎笌宸﹀瓙鏍戣繘琛屾棆杞互緇存寔AVL騫寵 鏉′歡 RatateWithLeftChildIfNeed_(pNode); // 閲嶆柊璁$畻楂樺害 pNode->height = CalcHeight_(pNode); return true; } } else if (data > pNode->data) { // 灝嗚緝澶х殑鏁版嵁鎻掑叆鍒板彸瀛愭爲 if (Insert_(data, pNode->pRightChild)) { // 鎴愬姛鎻掑叆鏂拌妭鐐? // 濡傛灉闇瑕侊紝鍒欎笌鍙沖瓙鏍戣繘琛屾棆杞互緇存寔AVL騫寵 鏉′歡 RatateWithRightChildIfNeed_(pNode); // 閲嶆柊璁$畻楂樺害 pNode->height = CalcHeight_(pNode); return true; } } else { // 閲嶅鏁版嵁錛堜粈涔堜篃涓嶅仛錛屾垨鑰呰繘琛岃鏁幫級 } return false; } /** 鍒犻櫎鑺傜偣 鏌ユ壘琚垹闄ょ殑鑺傜偣錛? 濡傛灉褰撳墠鑺傜偣涓虹┖鍒欒鏄庢病鏈夋壘鍒拌鍒犻櫎鐨勮妭鐐癸紝榪斿洖鍒犻櫎澶辮觸 濡傛灉琚垹闄ょ殑鏁版嵁灝忎簬鑺傜偣鏁版嵁錛屽垯鍦ㄨ妭鐐圭殑宸﹀瓙鏍戜腑鏌ユ壘騫跺垹闄わ紝濡傛灉鍒犻櫎鎴愬姛錛屽彲鑳介渶瑕佹棆杞嬌涔嬮噸鏂板鉤琛★紙鍙沖瓙鏍戣繃楂橈級錛岄噸鏂拌綆楅珮搴? 濡傛灉琚垹闄ょ殑鏁版嵁澶т簬鑺傜偣鏁版嵁錛屽垯鍦ㄨ妭鐐圭殑鍙沖瓙鏍戜腑鏌ユ壘騫跺垹闄わ紝濡傛灉鍒犻櫎鎴愬姛錛屽彲鑳介渶瑕佹棆杞嬌涔嬮噸鏂板鉤琛★紙宸﹀瓙鏍戣繃楂橈級錛岄噸鏂拌綆楅珮搴? 濡傛灉琚垹闄ょ殑鏁版嵁絳変簬鑺傜偣鏁版嵁錛屽垯鎵懼埌琚垹闄ょ殑鑺傜偣錛屽紑濮嬪垹闄わ紝榪斿洖鍒犻櫎鎴愬姛 鍒犻櫎鑺傜偣榪囩▼錛屽皢琚垹闄ょ殑鑺傜偣浣滀負鏍囪鑺傜偣錛? 濡傛灉鏍囪鑺傜偣瀛樺湪宸﹀彸鍙屽瓙鏍戯紝鍒╃敤鍙沖瓙鏍戠殑鏈灝忚妭鐐圭殑鏁版嵁鏇挎崲姝よ妭鐐規暟鎹紝鐒跺悗鍒犻櫎鍙沖瓙鏍戠殑鏈灝忚妭鐐癸細 濡傛灉鍙沖瓙鏍戞湁宸﹀瓙鏍戯紝浠庡乏瀛愭爲涓壘鍒版渶灝忚妭鐐癸紝灝嗗叾鍙沖瓙鏍戞彁鍗囦竴綰э紝鍙兘闇瑕佹棆杞嬌鍏剁埗鑺傜偣閲嶆柊騫寵 錛堝叾鐖惰妭鐐圭殑鍙沖瓙鏍戣繃楂橈級錛岄噸鏂拌綆楀叾鐖惰妭鐐歸珮搴? 濡傛灉鍙沖瓙鏍戞病鏈夊乏瀛愭爲錛屾鏃跺彸瀛愭爲鍒欏嵆鏄渶灝忚妭鐐癸紝灝嗗叾鍙沖瓙鏍戞彁鍗囦竴綰? 鍙兘闇瑕佹棆杞嬌鏍囪鑺傜偣閲嶆柊騫寵 錛堟爣璁拌妭鐐圭殑宸﹀瓙鏍戣繃楂橈級錛岄噸鏂拌綆楁爣璁拌妭鐐歸珮搴? 濡傛灉鏍囪鑺傜偣涓嶅瓨鍦ㄥ乏鍙沖弻瀛愭爲錛屽垹闄ゆ爣璁拌妭鐐癸紝鎻愬崌鍏跺瓙鏍? */ static bool Erase_(const DataType& data, Node_*& pNode) { if (!pNode) { // 娌℃湁鎵懼埌鑺傜偣 return false; } else if (data < pNode->data) { // 鑺傜偣杈冨皬錛屽湪宸﹀瓙鏍戜腑鍒犻櫎 if (Erase_(data, pNode->pLeftChild)) { // 鎴愬姛鍒犻櫎鑺傜偣 // 濡傛灉闇瑕侊紝鍒欎笌鍙沖瓙鏍戣繘琛屾棆杞互緇存寔AVL騫寵 鏉′歡 RatateWithRightChildIfNeed_(pNode); // 閲嶆柊璁$畻楂樺害 pNode->height = CalcHeight_(pNode); return true; } } else if (data > pNode->data) { // 鑺傜偣杈冨ぇ錛屽湪鍙沖瓙鏍戜腑鍒犻櫎 if (Erase_(data, pNode->pRightChild)) { // 鎴愬姛鍒犻櫎鑺傜偣 // 濡傛灉闇瑕侊紝鍒欎笌宸﹀瓙鏍戣繘琛屾棆杞互緇存寔AVL騫寵 鏉′歡 RatateWithLeftChildIfNeed_(pNode); // 閲嶆柊璁$畻楂樺害 pNode->height = CalcHeight_(pNode); return true; } } else { // 鎵懼埌浜嗛渶瑕佽鍒犻櫎鐨勮妭鐐? if (pNode->pLeftChild && pNode->pRightChild) { // 瀛樺湪鍙屽瓙鏍戯紝鍒╃敤鍙沖瓙鏍戞渶灝忚妭鐐規浛鎹紝騫跺垹闄ゅ彸瀛愭爲鏈灝忚妭鐐? Node_* pMin = pNode->pRightChild; if (pNode->pRightChild->pLeftChild) { // 鍙沖瓙鏍戝瓨鍦ㄥ乏瀛愭爲錛屼粠鍙沖瓙鏍戠殑宸﹀瓙鏍戜腑鎵炬渶灝忚妭鐐? Node_* pMinParent = pNode->pRightChild; while (pMinParent->pLeftChild->pLeftChild) { pMinParent = pMinParent->pLeftChild; } pMin = pMinParent->pLeftChild; // 鎻愬崌鏈灝忚妭鐐圭殑鍙沖瓙鏍? pMinParent->pLeftChild = pMin->pRightChild; // 濡傛灉闇瑕侊紝鏈灝忚妭鐐圭殑鐖惰妭鐐瑰垯涓庡叾鍙沖瓙鏍戣繘琛屾棆杞互緇存寔AVL騫寵 鏉′歡 RatateWithRightChildIfNeed_(pMinParent); // 閲嶆柊璁$畻鏈灝忚妭鐐圭殑鐖惰妭鐐圭殑楂樺害 pMinParent->height = CalcHeight_(pMinParent); } else { // 鍙沖瓙鏍戜笉瀛樺湪宸﹀瓙鏍戯紝閭d箞鎻愬崌鍙沖瓙鏍戠殑鍙沖瓙鏍? pNode->pRightChild = pNode->pRightChild->pRightChild; } // 鐢ㄦ渶灝忚妭鐐規浛鎹? pNode->data = pMin->data; // 鍒犻櫎鏈灝忚妭鐐? DestroyNode_(pMin); // 濡傛灉闇瑕侊紝鍒欎笌宸﹀瓙鏍戣繘琛屾棆杞互緇存寔AVL騫寵 鏉′歡 RatateWithLeftChildIfNeed_(pNode); // 閲嶆柊璁$畻楂樺害 pNode->height = CalcHeight_(pNode); } else { // 涓嶅瓨鍦ㄥ弻瀛愭爲錛屽垯鐩存帴鐢ㄥ効瀛愭浛鎹? Node_* pTemp = pNode; pNode = pNode->pLeftChild ? pNode->pLeftChild : pNode->pRightChild; // 閿姣佽妭鐐? DestroyNode_(pTemp); } return true; } return false; } }; // class AVLTree #ifdef _PRINT template<> void AVLTree<int>::Print() const { if (!pRoot_) { return; } PrinterContainer nextPrinters; // 涓嬩竴灞傞渶瑕佹墦鍗扮殑瀵硅薄闆嗗悎 nextPrinters.push_back(PSharedPrinter(new NodePrinter(pRoot_, nextPrinters))); while (nextPrinters.end() != std::find_if(nextPrinters.begin(), nextPrinters.end(), std::mem_fn(&Printer::IsValid))) { auto printers(std::move(nextPrinters)); // 褰撳墠闇瑕佹墦鍗扮殑瀵硅薄闆嗗悎 // 鎵撳嵃涓琛? std::for_each(printers.begin(), printers.end(), std::mem_fn(&Printer::Print)); // 鎹㈣ std::cout<<std::endl; } } template<> size_t AVLTree<int>::CalcDataWidth_(int n) { if (0 == n) { return 1+2; // +2鏄負[]絎﹀彿鍗犱綅 } size_t ret = 2; // 2鏄負[]絎﹀彿鍗犱綅 if (0 > n) { // 澶嶆暟錛屾坊鍔犵鍙蜂綅 ++ret; n = -n; } while (n) { ++ret; n /= 10; } return ret; } #endif // _PRINT } // namespace ghost #endif // AVL_TREE_H </pre> </div> <p> </p> <p>main.cpp鏂囦歡</p> <p> </p><div id="hvzpftn" class="cnblogs_Highlighter"> <pre class="brush:cpp;gutter:false;">#define _PRINT #include "AVLTree.h" #include <iostream> #include <ctime> /// 鎵撳嵃AVL鏍? template<typename T> void PrintAVLTree(const ghost::AVLTree<T>& tree) { #ifdef _PRINT std::cout<<"--------------AVLTree--------------"<<std::endl; tree.Print(); std::cout<<"------------------------------------------"<<std::endl; #else std::cerr<<"鏈紑鍚墦鍗伴澶勭悊鍣紝涓嶆彁渚汚VL鏍戠殑鎵撳嵃錛乗n"; #endif // _PRINT } static const size_t TEST_DATA_COUNT = 10; // 嫻嬭瘯鏁版嵁鐨勪釜鏁? static const size_t TEST_DATA_LOWER_LIMIT = 0; // 嫻嬭瘯鏁版嵁鐨勪笅闄? static const size_t TEST_DATA_UPPER_LIMIT = 10; // 嫻嬭瘯鏁版嵁鐨勪笂闄? /// 闅忔満鏋勯犳祴璇曟暟鎹? int BuildTestData() { return TEST_DATA_LOWER_LIMIT + rand() % (TEST_DATA_UPPER_LIMIT-TEST_DATA_LOWER_LIMIT); } int main() { srand((int)time(0)); ghost::AVLTree<int> tree; // 闅忔満鎻掑叆嫻嬭瘯鏁版嵁 for (size_t i = 0; i < TEST_DATA_COUNT; ++i) { tree.Insert(BuildTestData()); PrintAVLTree(tree); } // 闅忔満鍒犻櫎嫻嬭瘯鏁版嵁 for (size_t i = 0; i < TEST_DATA_COUNT; ++i) { tree.Erase(BuildTestData()); PrintAVLTree(tree); } // tree.Insert(5); // PrintAVLTree(tree); // // tree.Insert(2); // PrintAVLTree(tree); // // tree.Insert(8); // PrintAVLTree(tree); // // tree.Insert(1); // PrintAVLTree(tree); // // tree.Insert(4); // PrintAVLTree(tree); // // tree.Insert(7); // PrintAVLTree(tree); // // tree.Insert(3); // PrintAVLTree(tree); // // tree.Insert(6); // 姝ゆ椂搴旇Е鍙戜竴嬈″崟鏃嬭漿 // PrintAVLTree(tree); return 0; } </pre> </div> <p> </p><img src="http://www.cnblogs.com/EvilGhost/aggbug/2083622.html?type=0" width="1" height="1" alt="" /><p>浣滆? <a target="_blank">Evil.Ghost</a> 鍙戣〃浜?2011-06-17 14:53 <a target="_blank">鍘熸枃閾炬帴</a></p><p>璇勮: 0銆<a target="_blank">鏌ョ湅璇勮</a>銆<a target="_blank">鍙戣〃璇勮</a></p><hr /><p>鏈鏂版柊闂伙細<br />· <a target="_blank">閮彴閾禐娌沖崡宸ヤ漢绱犺川浣?iPhone鐢熶駭钀芥埛閮戝窞</a><span style="color:gray">(2011-06-17 17:53)</span><br />· <a target="_blank">RIM棣栧腑榪愯惀瀹樼梾浼戠鑱?縐嬪閲嶈繑宸ヤ綔宀椾綅</a><span style="color:gray">(2011-06-17 17:50)</span><br />· <a target="_blank">鍦熻眴緗戜笅鍗婂勾璧寸撼鏂揪鍏嬩笂甯?铻嶈祫1.5浜跨編鍏?/a><span style="color:gray">(2011-06-17 17:48)</span><br />· <a target="_blank">浼燤cAfee鎬昏灝嗚煩妲借嚦鍒濆垱鍏徃鍑轟換CEO</a><span style="color:gray">(2011-06-17 17:47)</span><br />· <a target="_blank">鎼滀漢鍔熻兘姝e紡涓婄嚎 鎼滄悳紺懼尯鍖栨垬鐣ュ啀鍗囩駭</a><span style="color:gray">(2011-06-17 17:46)</span><br /></p><p>緙栬緫鎺ㄨ崘錛?a target="_blank">鍍忎漢鑴戜竴鏍鋒濊?鎻Kinect宸ヤ綔鍘熺悊</a><br /></p><p>緗戠珯瀵艱埅錛?a target="_blank">鍗氬鍥欏?/a>  <a target="_blank">鎴戠殑鍥瓙</a>  <a target="_blank">鏂伴椈</a>  <a target="_blank">闂瓨</a>  <a target="_blank">灝忕粍</a>  <a target="_blank">鍗氶棶</a>  <a target="_blank">鐭ヨ瘑搴?/a></p><br />鏂囩珷鏉ユ簮:<a >http://www.cnblogs.com/EvilGhost/archive/2011/06/17/AVLTree.html</a><img src ="http://m.shnenglu.com/vivence/aggbug/148880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/vivence/" target="_blank">EvilGhost</a> 2011-06-17 20:01 <a href="http://m.shnenglu.com/vivence/archive/2011/06/17/AVLTree.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>涓姝ヤ竴姝ュ疄鐜拌嚜宸辯殑妯℃嫙鎺т歡錛?錛夆斺旀秷鎭鐞?/title><link>http://m.shnenglu.com/vivence/archive/2011/04/24/Abstract_Widget_9.html</link><dc:creator>EvilGhost</dc:creator><author>EvilGhost</author><pubDate>Sun, 24 Apr 2011 02:48:00 GMT</pubDate><guid>http://m.shnenglu.com/vivence/archive/2011/04/24/Abstract_Widget_9.html</guid><wfw:comment>http://m.shnenglu.com/vivence/comments/144894.html</wfw:comment><comments>http://m.shnenglu.com/vivence/archive/2011/04/24/Abstract_Widget_9.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://m.shnenglu.com/vivence/comments/commentRss/144894.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/vivence/services/trackbacks/144894.html</trackback:ping><description><![CDATA[ <p> </p><p>榪欐鎴戜滑灝嗚緇橶idget澧炲姞涓浜涚姸鎬侊紝騫朵嬌鍏惰兘澶熸帴鍙楀嚭娑堟伅澶勭悊鎵╁睍錛屾祴璇曞伐紼嬩腑瀹炵幇浜嗕竴涓寜閽殑娑堟伅澶勭悊鎵╁睍銆?/p> <p><strong>Widget鐘舵侊細</strong></p> <p>涔嬪墠鐨勬帶浠跺彧鏄粯鍒朵簡涓涓竟妗嗭紝騫朵笖鎬繪槸浼氬湪紿楀彛涓樉紺恒傚疄闄呬笂鎴戜滑寰寰浼氬笇鏈涜兘澶熻鏌愪釜鎺т歡鏄劇ず鎴栬呴殣钘忋佸彲鐢ㄦ垨鑰呬笉鍙敤絳夌瓑錛岄偅涔堟帶浠跺簲璇ュ叿鏈夎兘澶熸爣璇嗚繖浜涚姸鎬佺殑灞炴э紝浜庢槸鎴戜滑緇橶idget澧炲姞浜嗙姸鎬佹蹇點?/p> <p> </p><div id="hvzpftn" class="cnblogs_code"> <pre><div><span style="color: #008000;">//</span><span style="color: #008000;"> 鐘舵佺浉鍏?/span><span style="color: #008000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;"> AddStates(size_t states);<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;"> SubStates(size_t states);<br></span><span style="color: #0000ff;">bool</span><span style="color: #000000;"> CheckState(widget::StateBitField s);</span></div></pre> </div> <p> </p> <p>涓婇潰鏄姸鎬佺浉鍏崇殑鍑犱釜鎺ュ彛錛屽寘鎷簡澧炲姞鐘舵佺粍錛屽噺灝戠姸鎬佺粍錛屾嫻嬬姸鎬併傝繖閲屾湁涓姸鎬佺粍鐨勬蹇碉紝鏄洜涓烘垜灝嗙姸鎬佺敤浣嶅煙鏉ュ疄鐜幫紝閭d箞浠栦滑灝卞彲浠ラ氳繃or榪愮畻鏉ュ緱鍒板涓姸鎬佺殑闆嗗悎錛屾垜灝辮繖涓泦鍚堢О涓虹姸鎬佺粍銆?/p> <p> </p><div id="hvzpftn" class="cnblogs_code"> <pre><div><span style="color: #0000ff;">enum</span><span style="color: #000000;"> StateBitField{<br> STATE_VISIBLE </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">, </span><span style="color: #008000;">//</span><span style="color: #008000;"> 鎺т歡鍙錛熷喅瀹氭帶浠舵槸鍚﹁緇樺埗</span><span style="color: #008000;"><br></span><span style="color: #000000;"> STATE_ENABLE </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;">, </span><span style="color: #008000;">//</span><span style="color: #008000;"> 鎺т歡鍙敤錛熷喅瀹氭帶浠舵槸鍚﹀搷搴旈紶鏍囬敭鐩樻秷鎭?/span><span style="color: #008000;"><br></span><span style="color: #000000;"> STATE_TRANSPARENT </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> </span><span style="color: #000000;"><<</span><span style="color: #000000;"> </span><span style="color: #800080;">2</span><span style="color: #000000;">, </span><span style="color: #008000;">//</span><span style="color: #008000;"> 鎺т歡閫忔槑錛熷喅瀹氭帶浠舵槸鍚﹀搷搴旈紶鏍囬敭鐩樻秷鎭互鍙婃槸鍚︽樉紺簍ooltip</span><span style="color: #008000;"><br></span><span style="color: #000000;">};</span></div></pre> </div> <p> </p> <p>鐩墠鎴戠粰Widget瀹氫箟浜?涓姸鎬侊細鍙銆佸彲鐢ㄣ侀忔槑銆傞粯璁ゅ垱寤虹殑Widget鏄笉鍙銆佷笉鍙敤銆佷笉閫忔槑鐨勶紝闇瑕佸湪鍒涘緩鎴愬姛鍚庢墜鍔ㄨ緗紝渚嬪錛?/p> <p> </p><div id="hvzpftn" class="cnblogs_code"> <pre><div><span style="color: #008000;">//</span><span style="color: #008000;"> 寤虹珛鏍規帶浠?/span><span style="color: #008000;"><br></span><span style="color: #000000;">auto pRootWidget </span><span style="color: #000000;">=</span><span style="color: #000000;"> ghost::Widget::Create();<br>pRootWidget</span><span style="color: #000000;">-></span><span style="color: #000000;">AddStates(</span></div><div><span style="color: #000000;">銆銆ghost::widget::STATE_VISIBLE</span><span style="color: #000000;">|</span><span style="color: #000000;">ghost::widget::STATE_ENABLE</span><span style="color: #000000;">|</span><span style="color: #000000;">ghost::widget::STATE_TRANSPARENT);</span></div></pre> </div> <p> </p> <p><strong>娑堟伅澶勭悊鎵╁睍錛?/strong></p> <p>閫氬父瀵逛簬鎺т歡鏉ヨ錛屾病鏈夋秷鎭鐞嗗氨絳変簬娌℃湁鐢熷懡鎰忎箟錛岄偅涔堜負Widget娣誨姞娑堟伅澶勭悊鎵╁睍灝辨剰鍛崇潃浣縒idget媧昏搗鏉ワ紝榪欐鎴戜滑灝辨潵瀹屾垚榪欎釜浠誨姟錛屾湡寰匴idget媧昏搗鏉ョ殑閭f縺鍔ㄤ漢蹇冪殑涓鍒匯傚拰浠ュ線娣誨姞鎵╁睍鏀寔涓鏍鳳紝涓烘墿灞曠紪鍐欎竴涓娊璞″熀綾伙紝鍦╓idget鐨勫叧鑱斿璞$鐞嗕腑娣誨姞榪欎釜鎵╁睍鐨勫叧鑱斿鐞嗭紝鐒跺悗鍦╓idget鐨凷endMessage澶勭悊閫昏緫閲屽鍔犲娑堟伅澶勭悊鎵╁睍鐨勬敮鎸併傞偅涔堟垜浠殑SendMessage瀹炵幇灝卞彉鎴愪簡榪欐牱錛?/p> <p> </p><div id="hvzpftn" class="cnblogs_code"> <pre><div><span style="color: #0000ff;">int</span><span style="color: #000000;"> Widget::SendMessage(widget::Message message, </span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;"> param1</span><span style="color: #008000;">/*</span><span style="color: #008000;"> = 0</span><span style="color: #008000;">*/</span><span style="color: #000000;">, </span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;"> param2</span><span style="color: #008000;">/*</span><span style="color: #008000;"> = 0</span><span style="color: #008000;">*/</span><span style="color: #000000;">)<br>{<br> </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (</span><span style="color: #000000;">!</span><span style="color: #000000;">CheckState(widget::STATE_ENABLE))<br> {<br> </span><span style="color: #008000;">//</span><span style="color: #008000;"> 涓嶅搷搴旈紶鏍囬敭鐩樻秷鎭?/span><span style="color: #008000;"><br></span><span style="color: #000000;"> </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> ((widget::MSG_MOUSE_FIRST </span><span style="color: #000000;"><=</span><span style="color: #000000;"> message <br> </span><span style="color: #000000;">&&</span><span style="color: #000000;"> widget::MSG_MOUSE_LAST </span><span style="color: #000000;">>=</span><span style="color: #000000;"> message)<br> </span><span style="color: #000000;">||</span><span style="color: #000000;">(widget::MSG_KEY_FIRST </span><span style="color: #000000;"><=</span><span style="color: #000000;"> message <br> </span><span style="color: #000000;">&&</span><span style="color: #000000;"> widget::MSG_KEY_LAST </span><span style="color: #000000;">>=</span><span style="color: #000000;"> message))<br> {<br> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> widget::MSG_RESULT_NONE;<br> }<br> }<br> </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (CheckState(widget::STATE_TRANSPARENT))<br> {<br> </span><span style="color: #008000;">//</span><span style="color: #008000;"> 涓嶅搷搴旈紶鏍囬敭鐩樻秷鎭紝涓嶆樉紺簍ooltip</span><span style="color: #008000;"><br></span><span style="color: #000000;"> </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> ((widget::MSG_MOUSE_FIRST </span><span style="color: #000000;"><=</span><span style="color: #000000;"> message <br> </span><span style="color: #000000;">&&</span><span style="color: #000000;"> widget::MSG_MOUSE_LAST </span><span style="color: #000000;">>=</span><span style="color: #000000;"> message)<br> </span><span style="color: #000000;">||</span><span style="color: #000000;">(widget::MSG_KEY_FIRST </span><span style="color: #000000;"><=</span><span style="color: #000000;"> message <br> </span><span style="color: #000000;">&&</span><span style="color: #000000;"> widget::MSG_KEY_LAST </span><span style="color: #000000;">>=</span><span style="color: #000000;"> message))<br> {<br> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> widget::MSG_RESULT_NONE;<br> }<br> }<br><br> auto pRelatedObject </span><span style="color: #000000;">=</span><span style="color: #000000;"> GetRelatedObject();<br> </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (pRelatedObject)<br> {<br> auto pMessageHandle </span><span style="color: #000000;">=</span><span style="color: #000000;"> pRelatedObject</span><span style="color: #000000;">-></span><span style="color: #000000;">GetMessageHandle();<br> </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (pMessageHandle)<br> {<br> </span><span style="color: #0000ff;">bool</span><span style="color: #000000;"> handled </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br> </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> res </span><span style="color: #000000;">=</span><span style="color: #000000;"> pMessageHandle</span><span style="color: #000000;">-></span><span style="color: #000000;">OnMessage(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">, message, param1, param2, handled);<br> </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (handled)<br> {<br> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> res;<br> }<br> }<br> }<br><br> </span><span style="color: #0000ff;">switch</span><span style="color: #000000;"> (message)<br> {<br>#ifdef _DEBUG<br> </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> widget::MSG_DRAW:<br> {<br> HBRUSH hBrush </span><span style="color: #000000;">=</span><span style="color: #000000;"> ::CreateSolidBrush(pImpl_</span><span style="color: #000000;">-></span><span style="color: #000000;">testFrameColor_);<br> ::FrameRect((HDC)param1, </span><span style="color: #000000;">&</span><span style="color: #000000;">pImpl_</span><span style="color: #000000;">-></span><span style="color: #000000;">absoluteRect_, hBrush);<br> ::DeleteObject(hBrush);<br> }<br> </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">#endif</span><span style="color: #000000;"> </span><span style="color: #008000;">//</span><span style="color: #008000;"> _DEBUG</span><span style="color: #000000;"><br> </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> widget::MSG_HIT_TEST:<br> </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (::PtInRect(</span><span style="color: #000000;">&</span><span style="color: #000000;">pImpl_</span><span style="color: #000000;">-></span><span style="color: #000000;">absoluteRect_, </span><span style="color: #000000;">*</span><span style="color: #000000;">(</span><span style="color: #0000ff;">const</span><span style="color: #000000;"> POINT</span><span style="color: #000000;">*</span><span style="color: #000000;">)param1))<br> {<br> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #000000;">~</span><span style="color: #000000;">widget::MSG_RESULT_NONE;<br> }<br> </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br> }<br> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> widget::MSG_RESULT_NONE;<br>}</span></div></pre> </div> <p> </p> <p>鎴戝嬈℃彁鍒頒簡tooltip錛屼絾鏄垜浠繖嬈″茍娌℃湁涓篧idget澧炲姞鍏舵敮鎸侊紝瀹冨皢鍦ㄥ悗闈㈣鍔犲叆鍒癢idget涓潵銆傚彲浠ョ湅鍒拌繖閲屽鐞嗘湁瀵規秷鎭鐞嗘墿灞曠殑鏀寔錛岃繕鏈夌姸鎬佸浜庢秷鎭殑褰卞搷銆傝繖閲屽嚭鐜頒簡涓涓狹SG_HIT_TEST錛岃繖鏄竴涓柊澧炵殑娑堟伅銆傝繖嬈′負Widget娣誨姞浜嗗緢澶氱殑娑堟伅錛屽寘鎷簡榧犳爣銆侀敭鐩樼瓑錛岃灝嗛紶鏍囨秷鎭噯紜殑鍙戦佺粰姝g‘鐨勬帶浠訛紝閭d箞鐐瑰嚮嫻嬭瘯鏄繀涓嶅彲灝戠殑錛岃繖涓狹SG_HIT_TEST娑堟伅鍒欐槸鐢ㄤ簬鎺т歡澶勭悊鐐瑰嚮嫻嬭瘯鐨勩?/p> <p><strong>鐐瑰嚮嫻嬭瘯錛?/strong></p> <p>褰撳鍣ㄤ駭鐢熶簡榧犳爣浜嬩歡鐨勬椂鍊欙紝鎴戜滑鑳藉寰楀埌榧犳爣鐑偣鍦ㄥ鍣ㄤ腑鐨勫潗鏍囥傚墠闈㈡垜涔熷嬈℃彁鍒幫紝妯℃嫙鎺т歡鏄鍣ㄤ腑鐨勬煇涓尯鍩燂紝閭d箞褰撻紶鏍囩儹鐐逛綅浜庢煇涓帶浠舵墍澶勭殑鍖哄煙鐨勬椂鍊欙紝閭d箞榪欎釜榧犳爣浜嬩歡鎴戜滑灝卞簲褰撲氦鐢辮繖涓帶浠惰繘琛屽鐞嗭紙榪欐槸閫氬父鎯呭喌錛屼篃鏈夊彲鑳芥煇涓帶浠朵綔涓洪忔槑鎺т歡錛屼笉鎺ュ彈浠諱綍鐐瑰嚮嫻嬭瘯錛夈備簬鏄垜浠究閫氳繃鐐瑰嚮嫻嬭瘯錛圚itTest錛夎繖涓闂帴鍙f潵鎵懼埌搴旇澶勭悊榧犳爣浜嬩歡鐨勬帶浠躲傚湪鎵懼埌鎺т歡涔嬪悗錛屾垜浠繕灝嗗潗鏍囨槧灝勫埌浜嗘帶浠剁殑鐩稿鍧愭爣緋伙紝榪欐牱鎺т歡灝卞彲浠ヤ互鑷韓鐨勭浉瀵逛綅緗潵澶勭悊榧犳爣浜嬩歡浜嗐?/p> <p>褰撶劧錛岃繖嬈$殑鍐呭闈炲父澶氾紝鍖呮嫭鍧愭爣鏄犲皠銆佸尯鍩熸槧灝勶紝鎹曡幏榧犳爣鐨勬帶浠躲佹椿鍔ㄦ帶浠躲佺劍鐐規帶浠剁瓑姒傚康閮芥湭鎻愬埌錛屼絾鍦ㄤ唬鐮佷腑榪樻槸鑳藉鐪嬪埌榪欎簺姒傚康鐨勩傚鏋滀竴涓浠嬬粛錛岄偅鏂囩珷灝變細闈炲父鍐楅暱錛屼篃浼氫嬌Widget瀹炵幇榪涘睍緙撴參錛屽洜姝ゆ垜閫氬父閮戒細鐪佺暐涓浜涘唴瀹癸紝榪欎簺鍐呭涔熷氨鍙兘閫氳繃浠g爜闃呰鏉ュ緱鍒頒簡銆?/p> <p><strong>鎸夐挳錛?/strong></p> <p>涓轟簡嫻嬭瘯鎴戜滑榪欐瀹炵幇鐨勫唴瀹癸紝鎴戜滑緙栧啓浜嗕竴涓寜閽殑娑堟伅澶勭悊鎵╁睍銆傜畝鍗曡搗瑙侊紝鎴戜滑浣垮叾涓嶄駭鐢熷懡浠ゃ佷笉緇樺埗鏂囨湰錛屼粎浠呭彧鏄睍紺哄榧犳爣娑堟伅鐨勫鐞嗗拰鐘舵佺殑鍙樺寲鑰屽凡銆?/p> <p>锘匡豢锘?img src="http://pic002.cnblogs.com/images/2011/95718/2011042410321772.png"></p> <p>鎴戜滑灝嗗師鍏堟祴璇曚唬鐮佷腑鐨勪腑闂撮偅涓帶浠跺叧鑱斾簡鎸夐挳鐨勬秷鎭鐞嗭紝閭d箞瀹冨氨縐頒負浜嗕竴涓寜閽帶浠朵簡銆傛垜浠彲浠ュ皢榧犳爣縐誨埌瀹冧笂闈㈢偣鍑葷湅鐪嬩細鍙戠敓浠涔堛?/p> <p><span style="font-size: 18pt;"><strong><a >涓嬭澆嫻嬭瘯宸ョ▼浠g爜</a> </strong></span>鍥犱負鎴戜竴鐩撮兘鍦ㄤ嬌鐢╒C10鏉ョ紪鍐橶idget錛屼篃鐢ㄥ埌浜嗕竴浜涙柊鐨勭壒鎬э紝鎵浠ュ瓙鍟婅繖嬈$殑嫻嬭瘯宸ョ▼鎴戠敓鎴愪簡涓浠絩elease涓嬬殑紼嬪簭錛屾病鏈塚C10鐨勪漢鑷沖皯鑳藉鐪嬪埌鍏惰繍琛屾晥鏋溿?/p><img src="http://www.cnblogs.com/EvilGhost/aggbug/2026106.html?type=0" width="1" height="1" alt=""><p>浣滆? <a target="_blank">Evil.Ghost</a> 鍙戣〃浜?2011-04-24 10:48 <a target="_blank">鍘熸枃閾炬帴</a></p><p>璇勮: 0銆<a target="_blank">鏌ョ湅璇勮</a>銆<a target="_blank">鍙戣〃璇勮</a></p><hr><p>鏈鏂版柊闂伙細<br>· <a target="_blank">浜轟漢璧寸編涓婂競錛氭棤濂堝ぇ鏉傜儵 鎸熻祫鏈闃礔acebook</a><span style="color:gray">(2011-04-24 11:07)</span><br>· <a target="_blank">浣嶇疆闅愮浜嬩歡榪涘睍錛欸oogle 鍥炲簲錛屽崕灝旇鏃ユ姤璐ㄧ枒</a><span style="color:gray">(2011-04-24 10:19)</span><br>· <a target="_blank">娑堟伅縐拌嫻鏋滄嫻嬭瘯T-Mobile鐗坕Phone</a><span style="color:gray">(2011-04-24 10:04)</span><br>· <a target="_blank">鎶ュ憡縐?020騫村叏鐞冧簯璁$畻瑙勬ā杈?410浜跨編鍏?/a><span style="color:gray">(2011-04-24 10:03)</span><br>· <a target="_blank">娌冨皵鐜涘湪緹庡浗鍔犲窞嫻嬭瘯鍦ㄧ嚎鍟嗗搧閰嶉佹湇鍔?/a><span style="color:gray">(2011-04-24 09:40)</span><br></p><p>緙栬緫鎺ㄨ崘錛?a target="_blank">鍗楁柟閮藉競鎶ワ細緗戠粶姝e湪鏀瑰啓鎴戜滑鐨勬濈淮錛?/a><br></p><p>緗戠珯瀵艱埅錛?a target="_blank">鍗氬鍥欏?/a>  <a target="_blank">鎴戠殑鍥瓙</a>  <a target="_blank">鏂伴椈</a>  <a target="_blank">闂瓨</a>  <a target="_blank">灝忕粍</a>  <a target="_blank">鍗氶棶</a>  <a target="_blank">鐭ヨ瘑搴?/a></p><img src ="http://m.shnenglu.com/vivence/aggbug/144894.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/vivence/" target="_blank">EvilGhost</a> 2011-04-24 10:48 <a href="http://m.shnenglu.com/vivence/archive/2011/04/24/Abstract_Widget_9.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>涓姝ヤ竴姝ュ疄鐜拌嚜宸辯殑妯℃嫙鎺т歡錛?錛夆斺旈噸鏋?/title><link>http://m.shnenglu.com/vivence/archive/2011/04/19/Abstract_Widget_8.html</link><dc:creator>EvilGhost</dc:creator><author>EvilGhost</author><pubDate>Tue, 19 Apr 2011 12:06:00 GMT</pubDate><guid>http://m.shnenglu.com/vivence/archive/2011/04/19/Abstract_Widget_8.html</guid><wfw:comment>http://m.shnenglu.com/vivence/comments/144690.html</wfw:comment><comments>http://m.shnenglu.com/vivence/archive/2011/04/19/Abstract_Widget_8.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/vivence/comments/commentRss/144690.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/vivence/services/trackbacks/144690.html</trackback:ping><description><![CDATA[ <p> </p><p>妯℃嫙鎺т歡宸茬粡鍑轟簡闆忓艦錛屾槸搴旇閲嶆瀯涓涓嬩簡銆?/p> <p><strong>鏂版蹇碉細</strong></p> <p>鍏跺疄璇存槸鏂版蹇典篃涓嶅敖鐒訛紝鍙槸鍦ㄨ繖鍑犳鐨勫疄鐜頒腑鍙互鍙戠幇錛岃繖涓ā鎷熸帶浠舵鏋朵腑鏈変袱涓ぇ鐨勬蹇碉細瀹瑰櫒鍜屾帶浠躲傛垜浠竴鐩翠竴鏉ラ兘璇寸殑鏄鍣ㄧ獥鍙o紝浣嗘槸鍏跺疄榪欐槸涓彲浠ヤ笂鍗囩殑姒傚康銆傚鍣ㄥ綰充竴涓帶浠朵綋緋伙紝涔熷氨鏄叧鑱斾竴涓牴鎺т歡錛岄偅涔堝畠灝辨湁鐐圭被浼間簬鎴戜滑鐨勬牴鎺т歡浜嗐備絾鏄鍣ㄧ敱蹇呴』瀹炵幇鍜屽叿浣撶獥鍙e拰鎺т歡鐨勪氦浜掞紝鎵浠ユ垜浠笉鑳界畝鍗曠殑灝嗘牴鎺т歡浣滀負瀹瑰櫒銆傚茍涓斿浜庢煇浜涚壒孌婄殑瀹炵幇錛屾垜浠繕鍙兘闇瑕佸瀹瑰櫒鐨勬煇浜涘姛鑳藉姞浠ユ墿灞曪紝鎵浠ユ垜浠繖嬈¢噸鏋勪負瀹瑰櫒鎶借薄浜嗕竴涓熀綾伙紝騫跺疄鐜頒簡涓涓獥鍙e鍣ㄣ?/p> <p> </p><div id="hvzpftn" class="cnblogs_code"> <pre><div><span style="color: #0000ff;">class</span><span style="color: #000000;"> Container : </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Monopolistic{<br> </span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Monopolistic::pWidget_;<br> </span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Monopolistic::GetWidget;<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br> Container();<br> </span><span style="color: #0000ff;">virtual</span><span style="color: #000000;"> </span><span style="color: #000000;">~</span><span style="color: #000000;">Container();<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br> Widget</span><span style="color: #000000;">*</span><span style="color: #000000;"> GetRootWidget() </span><span style="color: #0000ff;">const</span><span style="color: #000000;">{</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> GetWidget();}<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br> </span><span style="color: #0000ff;">virtual</span><span style="color: #000000;"> </span><span style="color: #0000ff;">bool</span><span style="color: #000000;"> IsValid() </span><span style="color: #0000ff;">const</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">;<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br> </span><span style="color: #0000ff;">virtual</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> Invalidate(</span><span style="color: #0000ff;">const</span><span style="color: #000000;"> RECT</span><span style="color: #000000;">&</span><span style="color: #000000;"> rect){} </span><span style="color: #008000;">//</span><span style="color: #008000;"> 鏃犳晥鍖栧鍣ㄧ煩褰㈠尯鍩?/span><span style="color: #008000;"><br></span><span style="color: #000000;"> </span><span style="color: #0000ff;">virtual</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> Invalidate(HRGN hRgn){} </span><span style="color: #008000;">//</span><span style="color: #008000;"> 鏃犳晥鍖栧鍣ㄤ笉瑙勫垯鍖哄煙</span><span style="color: #008000;"><br></span><span style="color: #000000;"> </span><span style="color: #0000ff;">virtual</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> Invalidate(){} </span><span style="color: #008000;">//</span><span style="color: #008000;"> 鏃犳晥鍖栨暣涓鍣ㄥ尯鍩?/span><span style="color: #008000;"><br></span><span style="color: #000000;">};</span></div></pre> </div> <p> </p> <p><strong>瑙h︼細</strong></p> <p>鍒扮洰鍓嶄負姝紝鎴戜滑鐨勫鍣ㄩ┍鍔ㄥ拰鎺т歡涔嬮棿鍏鋒湁鍗佸垎绱у瘑鐨勮﹀悎鍏崇郴錛堢敓鍛藉懆鏈熻﹀悎錛夛紝榪欐閲嶆瀯鎵撶畻灝嗘瑙h︼紝浣垮緱鎴戜滑鐨勫鍣ㄥ垱寤哄拰鎺т歡浣撶郴鍒涘緩浜掍笉鐩稿叧錛屼粎浠呴氳繃涓嬈℃搷浣滄潵浣垮緱浠栦滑鍏寵仈鎴栬呰В闄ゅ叧鑱斻?/p> <p> </p><div id="hvzpftn" class="cnblogs_code"> <pre><div><span style="color: #008000;">//</span><span style="color: #008000;"> 寤虹珛紿楀彛瀹瑰櫒</span><span style="color: #008000;"><br></span><span style="color: #000000;">ghost::widget::WindowContainer container;<br>container.AttachWindow(hWnd);<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;"> 寤虹珛鏍規帶浠?/span><span style="color: #008000;"><br></span><span style="color: #000000;">auto pRootWidget </span><span style="color: #000000;">=</span><span style="color: #000000;"> ghost::Widget::Create();<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;"> 鍏寵仈瀹瑰櫒</span><span style="color: #008000;"><br></span><span style="color: #000000;">pRootWidget</span><span style="color: #000000;">-></span><span style="color: #000000;">CreateRelationship(</span><span style="color: #000000;">&</span><span style="color: #000000;">container);</span></div></pre> </div> <p> </p> <p><strong>鍑忓皯綾伙細</strong></p> <p>榪欐榪樻湁涓涓ぇ鐨勫彉鍖栧氨鏄皢鍘熷厛鐨勪竴浜涙蹇佃瀺鍚堟垚浜嗘柊鐨勬蹇碉細椹卞姩銆佹秷鎭繃婊ゃ佹秷鎭槧灝勯兘铻嶅悎鍒頒簡瀹瑰櫒褰撲腑錛屽洜涓鴻繖涓変釜姒傚康鍜屽叿浣撳鍣ㄥ叧緋葷揣瀵嗭紝鎵浠ュ皢浠栦滑榪涜铻嶅悎浠ュ噺灝戞垜浠殑綾繪暟鐩?/p> <p><strong>鏀惰幏錛?/strong></p> <p>榪欐閲嶆瀯寤虹珛浜嗗鍣ㄨ繖涓蹇墊垜浠槸鏈変竴瀹氭敹鑾風殑錛氬師鍏堟垜浠棤娉曡闂帶浠舵墍鍏寵仈鐨勫鍣紝鐜板湪鍙互浜嗐傚師鍏堟帶浠剁殑瀹瑰櫒瀹炵幇涓嶆槗鎵╁睍錛岀幇鍦ㄥ彲浠ラ氳繃緇ф壙鏉ユ墿灞曪紙渚嬪layered紿楀彛錛夛紝鐢氳嚦鍙互涓哄鍣ㄥ疄鐜扮壒鏈夌殑緇樺埗鏈哄埗錛堜緥濡備嬌鐢╫pengl錛屼互鍚庢垜浠娊璞′簡緇樺埗姒傚康渚垮彲浠ョ湅鍒幫紝鐩墠榪樺彧鑳戒嬌鐢℅DI錛夈?/p> <p>榪欐娌℃湁浠涔堟柊鐨勫唴瀹規坊鍔狅紝浣嗛噸鏋勮繕鏄湁蹇呰鐨勶紝鍛ㄦ湡鎬ч噸鏋勫埄浜庢垜浠鏁翠釜妗嗘灦鐨勭鐞嗭紝鍦ㄩ噸鏋勮繃紼嬩腑杈冨鏄撳彂鐜板拰淇敼BUG銆?/p> <p><span style="font-size: 18pt;"><strong><a >涓嬭澆嫻嬭瘯宸ョ▼婧愮爜</a></strong></span></p><img src="http://www.cnblogs.com/EvilGhost/aggbug/2021452.html?type=1" width="1" height="1" alt=""><p>浣滆? <a target="_blank">Evil.Ghost</a> 鍙戣〃浜?2011-04-19 20:06 <a target="_blank">鍘熸枃閾炬帴</a></p><p>璇勮: 0銆<a target="_blank">鏌ョ湅璇勮</a>銆<a target="_blank">鍙戣〃璇勮</a></p><hr><p>鏈鏂版柊闂伙細<br>· <a target="_blank">婊″駭緗戠偖杞板垎浼楀搫鎶箍鍛婁環錛氭睙鍗楁槬鎵胯灝嗚皟鏌?/a><span style="color:gray">(2011-04-20 18:08)</span><br>· <a target="_blank">鍛ㄩ縛紲庯細鎶鏈瑕?鍟嗕笟棰犺璁?60棰犺浜嗚涓?/a><span style="color:gray">(2011-04-20 18:03)</span><br>· <a target="_blank">XJP錛氱綉璐喎闈欐湡鎭愭垚涓綰哥┖鏂?/a><span style="color:gray">(2011-04-20 18:00)</span><br>· <a target="_blank">浠繪闈烇細涓娉?涓ゅ埗 涓夊鏁?/a><span style="color:gray">(2011-04-20 17:24)</span><br>· <a target="_blank">寰蔣錛欳hrome鍜孫pera瀛樺湪HTML5鎵ц婕忔礊</a><span style="color:gray">(2011-04-20 17:20)</span><br></p><p>緙栬緫鎺ㄨ崘錛?a target="_blank">鍐嶈皥“鎴戞槸鎬庝箞鎷涜仒紼嬪簭鍛樼殑”</a><br></p><p>緗戠珯瀵艱埅錛?a target="_blank">鍗氬鍥欏?/a>  <a target="_blank">鎴戠殑鍥瓙</a>  <a target="_blank">鏂伴椈</a>  <a target="_blank">闂瓨</a>  <a target="_blank">灝忕粍</a>  <a target="_blank">鍗氶棶</a>  <a target="_blank">鐭ヨ瘑搴?/a></p><img src ="http://m.shnenglu.com/vivence/aggbug/144690.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/vivence/" target="_blank">EvilGhost</a> 2011-04-19 20:06 <a href="http://m.shnenglu.com/vivence/archive/2011/04/19/Abstract_Widget_8.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>涓姝ヤ竴姝ュ疄鐜拌嚜宸辯殑妯℃嫙鎺т歡錛?錛夆斺斿彲鎵╁睍甯冨眬瀛愭帶浠?/title><link>http://m.shnenglu.com/vivence/archive/2011/04/12/Abstract_Widget_7.html</link><dc:creator>EvilGhost</dc:creator><author>EvilGhost</author><pubDate>Tue, 12 Apr 2011 13:17:00 GMT</pubDate><guid>http://m.shnenglu.com/vivence/archive/2011/04/12/Abstract_Widget_7.html</guid><wfw:comment>http://m.shnenglu.com/vivence/comments/144069.html</wfw:comment><comments>http://m.shnenglu.com/vivence/archive/2011/04/12/Abstract_Widget_7.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/vivence/comments/commentRss/144069.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/vivence/services/trackbacks/144069.html</trackback:ping><description><![CDATA[ <p> </p><p><strong>鍙墿灞曪細</strong></p> <p>瑕佷嬌寰楁垜浠殑鎺т歡鍏峰涓瀹氱殑鍙墿灞曟э紝閭d箞蹇呭畾浼氫駭鐢熸帶浠朵箣澶栫殑瀵硅薄浣滀負鎵╁睍錛屽茍涓旇繖涓璞″浜庢帶浠舵潵璇存槸鍙彃鍏ュ彲縐婚櫎鐨勩傜敤浜庢墿灞曠殑瀵硅薄鍜屾帶浠朵箣闂村簲璇ュ叿澶囦竴瀹氱殑鍏崇郴錛屼緥濡傦細1-1錛?-n錛宯-n絳夈傛垜浠皢榪欐牱鐨勫璞″叧緋繪娊璞′簡鍑烘潵錛岀О涔嬩負瀵硅薄鍏崇郴銆?/p> <p><strong>瀵硅薄鍏崇郴錛?/strong></p> <p>涓涓璞″彲鑳藉厑璁稿崟涓璞″鍏惰繘琛屽叧鑱旓紝涔熷彲鑳藉厑璁稿涓璞″鍏惰繘琛屽叧鑱旓紝鐢氳嚦鍙兘鍗沖厑璁稿涓璞¤繘琛屽叧鑱旓紝浣嗗嵈瀵規煇浜涚被鍨嬬殑瀵硅薄闄愬埗涓哄彧鑳藉崟涓殑瀵瑰叾榪涜鍏寵仈銆傛垜浠皢榪欎簺瀵硅薄鎶借薄涓猴細鍗曞璞″叧緋伙紝 澶氬璞″叧緋伙紝鐙崰寮忓璞″叧緋伙紙榪欐槸瀵瑰瀵硅薄鍏崇郴鐨勪竴縐嶆墿灞曪級銆?/p> <p><img src="http://pic002.cnblogs.com/images/2011/95718/2011041220560533.png"></p> <p> </p><div id="hvzpftn" class="cnblogs_code"> <pre><div><span style="color: #0000ff;">class</span><span style="color: #000000;"> ObjectRelationship{<br></span><span style="color: #0000ff;">protected</span><span style="color: #000000;">:<br> ObjectRelationship(){}<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br> </span><span style="color: #0000ff;">virtual</span><span style="color: #000000;"> </span><span style="color: #000000;">~</span><span style="color: #000000;">ObjectRelationship(){}<br><br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br> ObjectRelationship(</span><span style="color: #0000ff;">const</span><span style="color: #000000;"> ObjectRelationship</span><span style="color: #000000;">&</span><span style="color: #000000;">);<br> ObjectRelationship</span><span style="color: #000000;">&</span><span style="color: #000000;"> </span><span style="color: #0000ff;">operator</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;">(</span><span style="color: #0000ff;">const</span><span style="color: #000000;"> ObjectRelationship</span><span style="color: #000000;">&</span><span style="color: #000000;">);<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br> </span><span style="color: #0000ff;">bool</span><span style="color: #000000;"> CreateRelationship(ObjectRelationship</span><span style="color: #000000;">*</span><span style="color: #000000;"> pObject)<br> {<br> </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (</span><span style="color: #000000;">!</span><span style="color: #000000;">DoCreateRelationship_(pObject))<br> {<br> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br> }<br> RelationshipCreated_(pObject);<br> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br> }<br> </span><span style="color: #0000ff;">bool</span><span style="color: #000000;"> DestroyRelationship(ObjectRelationship</span><span style="color: #000000;">*</span><span style="color: #000000;"> pObject)<br> {<br> </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (</span><span style="color: #000000;">!</span><span style="color: #000000;">DoDestroyRelationship_(pObject))<br> {<br> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br> }<br> RelationshipDestroyed_(pObject);<br> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br> }<br><br></span><span style="color: #0000ff;">protected</span><span style="color: #000000;">:<br> </span><span style="color: #0000ff;">virtual</span><span style="color: #000000;"> </span><span style="color: #0000ff;">bool</span><span style="color: #000000;"> DoCreateRelationship_(ObjectRelationship</span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #008000;">/*</span><span style="color: #008000;">pObject</span><span style="color: #008000;">*/</span><span style="color: #000000;">) </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">;<br> </span><span style="color: #0000ff;">virtual</span><span style="color: #000000;"> </span><span style="color: #0000ff;">bool</span><span style="color: #000000;"> DoDestroyRelationship_(ObjectRelationship</span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #008000;">/*</span><span style="color: #008000;">pObject</span><span style="color: #008000;">*/</span><span style="color: #000000;">) </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">;<br><br></span><span style="color: #0000ff;">protected</span><span style="color: #000000;">:<br> </span><span style="color: #0000ff;">virtual</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> RelationshipCreated_(ObjectRelationship</span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #008000;">/*</span><span style="color: #008000;">pObject</span><span style="color: #008000;">*/</span><span style="color: #000000;">){}<br> </span><span style="color: #0000ff;">virtual</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> RelationshipDestroyed_(ObjectRelationship</span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #008000;">/*</span><span style="color: #008000;">pObject</span><span style="color: #008000;">*/</span><span style="color: #000000;">){}<br>};</span></div></pre> </div> <p> </p> <p>榪欐槸瀵硅薄鍏崇郴鍩虹被錛屾帴鍙e彧鏈変袱涓細寤虹珛鍏崇郴錛岄攢姣佸叧緋匯?/p> <p>鍗曞璞″叧緋伙紝 澶氬璞″叧緋婚兘媧劇敓浜庤繖涓熀綾伙紝鑰岀嫭鍗犲紡瀵硅薄鍏崇郴鏄疄鐜扮殑涓や釜甯姪鍑芥暟鏉ヨ緟鍔╁瀵硅薄鍏崇郴銆傛垜浠殑Widget媧劇敓浜庡瀵硅薄鍏崇郴錛屽畠渚垮叿澶囦簡鍜屽涓璞″緩绔嬪叧緋葷殑鑳藉姏錛堟垜浠皢鏈変笉鍚岀殑鎵╁睍鍏寵仈鍒癢idget錛夈備負浜嗕究浜庣鐞嗗拰鎵╁睍錛屾垜浠皢鎵鏈夊拰Widget鍏寵仈鐨勬墿灞曟斁鍒頒竴涓璞″綋涓繘琛岀鐞嗭紝Widget鍜屾墿灞曚箣闂寸殑鍏崇郴寤虹珛鍜岄攢姣侀兘濮旀墭榪欎釜瀵硅薄鏉ヨ繘琛屻?/p> <p> </p><div id="hvzpftn" class="cnblogs_code"> <pre><div><span style="color: #0000ff;">class</span><span style="color: #000000;"> LayoutChildren;<br><br>typedef std::</span><span style="color: #0000ff;">set</span><span style="color: #000000;"><</span><span style="color: #000000;">LayoutChildren</span><span style="color: #000000;">*></span><span style="color: #000000;"> LayoutChildrenSet;<br><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;"> RelatedObject{<br> Widget</span><span style="color: #000000;">*</span><span style="color: #000000;"> pWidget_; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 鎺т歡<br><br> </span><span style="color: #008000;">//</span><span style="color: #008000;"> 鎺т歡鎵鍏寵仈鐨勫璞?/span><span style="color: #008000;"><br></span><span style="color: #000000;"> LayoutChildrenSet layoutChildrens_; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 鍙互鏈夊涓竷灞綆$悊綆$悊涓嶅悓鐨勫瓙鎺т歡甯冨眬</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br> friend </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Widget;<br> </span><span style="color: #0000ff;">explicit</span><span style="color: #000000;"> RelatedObject(Widget</span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #0000ff;">const</span><span style="color: #000000;"> pWidget);<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">: </span><span style="color: #008000;">//</span><span style="color: #008000;"> 鑾峰彇鍏寵仈瀵硅薄鐨勬帴鍙?/span><span style="color: #008000;"><br></span><span style="color: #000000;"> </span><span style="color: #0000ff;">const</span><span style="color: #000000;"> LayoutChildrenSet</span><span style="color: #000000;">&</span><span style="color: #000000;"> GetLayoutChildrens() </span><span style="color: #0000ff;">const</span><span style="color: #000000;">{</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> layoutChildrens_;}<br><br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> RelationshipCreated_(ObjectRelationship</span><span style="color: #000000;">*</span><span style="color: #000000;"> pObject);<br> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> RelationshipDestroyed_(ObjectRelationship</span><span style="color: #000000;">*</span><span style="color: #000000;"> pObject);<br>};</span></div></pre> </div> <p> </p> <p> </p><div id="hvzpftn" class="cnblogs_code"> <pre><div><span style="color: #0000ff;">void</span><span style="color: #000000;"> Widget::RelationshipCreated_(ObjectRelationship</span><span style="color: #000000;">*</span><span style="color: #000000;"> pObject)<br>{<br> GetRelatedObject()</span><span style="color: #000000;">-></span><span style="color: #000000;">RelationshipCreated_(pObject);<br>}<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;"> Widget::RelationshipDestroyed_(ObjectRelationship</span><span style="color: #000000;">*</span><span style="color: #000000;"> pObject)<br>{<br> GetRelatedObject()</span><span style="color: #000000;">-></span><span style="color: #000000;">RelationshipDestroyed_(pObject);<br>}</span></div></pre> </div> <p> </p> <p><strong>甯冨眬瀛愭帶浠訛細</strong></p> <p>鎴戜滑涓篧idgt娣誨姞浜嗕竴涓竷灞瀛愭帶浠剁殑鎺ュ彛錛屽綋鎺т歡鑷韓鍖哄煙鍙樺寲鐨勬椂鍊欎細鑷姩鐨勮皟鐢ㄨ繖涓帴鍙o紝褰撶劧鐢ㄦ埛涔熷彲浠ラ殢鏃惰皟鐢ㄦ鎺ュ彛瀵瑰瓙鎺т歡榪涜甯冨眬銆傛鎺ュ彛璐熻矗灝嗘搷浣滀紶閫掔粰鎵╁睍錛屾垜浠冭檻鍒板瓙鎺т歡鐨勫竷灞絳栫暐鍙兘浼氬悇鏈変笉鍚岋紝鍥犳鎴戜滑鑳藉鍏寵仈澶氫釜甯冨眬瀛愭帶浠舵墿灞曞埌Widget錛岃繖浣垮緱鎴戜滑鑳藉浠ヤ笉鍚岀殑甯冨眬絳栫暐鏉ュ尯鍒寰呬笉鍚岀殑瀛愭帶浠躲?/p> <p> </p><div id="hvzpftn" class="cnblogs_code"> <pre><div><span style="color: #0000ff;">void</span><span style="color: #000000;"> Widget::LayoutChildren()<br>{<br> auto pRelatedObject </span><span style="color: #000000;">=</span><span style="color: #000000;"> GetRelatedObject();<br> </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (pRelatedObject)<br> {<br> </span><span style="color: #0000ff;">const</span><span style="color: #000000;"> widget::LayoutChildrenSet</span><span style="color: #000000;">&</span><span style="color: #000000;"> layoutChildrens </span><span style="color: #000000;">=</span><span style="color: #000000;"> pRelatedObject</span><span style="color: #000000;">-></span><span style="color: #000000;">GetLayoutChildrens();<br> std::for_each(<br> layoutChildrens.begin(), layoutChildrens.end(), <br> std::bind(std::mem_fn(</span><span style="color: #000000;">&</span><span style="color: #000000;">widget::LayoutChildren::Layout), std::placeholders::_1, </span><span style="color: #0000ff;">this</span><span style="color: #000000;">));<br> }<br>}</span></div></pre> </div> <p> </p> <p>鎴戜滑鍒涘緩浜嗕竴涓竟緙樺紡甯冨眬鑷帶浠舵墿灞曡繘琛屾祴璇曪紝嫻嬭瘯鏁堟灉鍦ㄦ祴璇曞伐紼嬩腑鑳藉鐪嬪埌銆?/p> <p><strong><span style="font-size: 18pt;"><a >涓嬭澆嫻嬭瘯宸ョ▼婧愮爜</a></span></strong></p><img src="http://www.cnblogs.com/EvilGhost/aggbug/2014101.html?type=1" width="1" height="1" alt=""><p>浣滆? <a target="_blank">Evil.Ghost</a> 鍙戣〃浜?2011-04-12 21:17 <a target="_blank">鍘熸枃閾炬帴</a></p><p>璇勮: 0銆<a target="_blank">鏌ョ湅璇勮</a>銆<a target="_blank">鍙戣〃璇勮</a></p><hr><p>鏈鏂版柊闂伙細<br>· <a target="_blank">娑堟伅縐癷Pad 3浠嶄笉閲囩敤Retina灞忓箷</a><span style="color:gray">(2011-04-12 20:29)</span><br>· <a target="_blank">nginx 1.0.0鍙戝竷</a><span style="color:gray">(2011-04-12 20:27)</span><br>· <a target="_blank">2011Mozilla寮鍙戣呭ぇ浼氫寒鐐規姠鍏堢湅</a><span style="color:gray">(2011-04-12 20:24)</span><br>· <a target="_blank">浜氶┈閫婃垚璋鋒瓕絎竴澶у箍鍛婁富 姣忓勾2浜跨編鍏冿紙鍥撅級</a><span style="color:gray">(2011-04-12 20:16)</span><br>· <a target="_blank">涔濆煄OpenFeint涓浗棣栫錛氫笌鑱旈氭帹鎵嬫父</a><span style="color:gray">(2011-04-12 20:13)</span><br></p><p>緙栬緫鎺ㄨ崘錛?a target="_blank">浣撻獙Managed Extensibility Framework綺懼鐨勮璁?/a><br></p><p>緗戠珯瀵艱埅錛?a target="_blank">鍗氬鍥欏?/a>  <a target="_blank">鎴戠殑鍥瓙</a>  <a target="_blank">鏂伴椈</a>  <a target="_blank">闂瓨</a>  <a target="_blank">灝忕粍</a>  <a target="_blank">鍗氶棶</a>  <a target="_blank">鐭ヨ瘑搴?/a></p><img src ="http://m.shnenglu.com/vivence/aggbug/144069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/vivence/" target="_blank">EvilGhost</a> 2011-04-12 21:17 <a href="http://m.shnenglu.com/vivence/archive/2011/04/12/Abstract_Widget_7.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>涓姝ヤ竴姝ュ疄鐜拌嚜宸辯殑妯℃嫙鎺т歡錛?錛夆斺旀帶浠舵爲鍙婃帶浠跺尯鍩?/title><link>http://m.shnenglu.com/vivence/archive/2011/04/09/Abstract_Widget_6.html</link><dc:creator>EvilGhost</dc:creator><author>EvilGhost</author><pubDate>Sat, 09 Apr 2011 11:05:00 GMT</pubDate><guid>http://m.shnenglu.com/vivence/archive/2011/04/09/Abstract_Widget_6.html</guid><wfw:comment>http://m.shnenglu.com/vivence/comments/143840.html</wfw:comment><comments>http://m.shnenglu.com/vivence/archive/2011/04/09/Abstract_Widget_6.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/vivence/comments/commentRss/143840.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/vivence/services/trackbacks/143840.html</trackback:ping><description><![CDATA[ <p> </p><p><strong>鎺т歡鏍?/strong></p> <p><a target="_parent" >涓姝ヤ竴姝ュ疄鐜拌嚜宸辯殑妯℃嫙鎺т歡錛?錛?/a>涓殑鍥句笂鎴戜滑鍙互鐪嬪埌錛屾垜浠殑鎺т歡浣撶郴鍏跺疄灝辨槸涓涓帶浠舵爲銆傛瘡涓涓獥鍙e叧鑱斾竴涓牴鎺т歡錛屾墍鏈夋帶浠墮兘鍦ㄨ繖涓牴鎺т歡涔嬩笅錛岀埗鎺т歡鍖呭騫剁鐞嗗瓙鎺т歡錛岄偅涔堟垜浠殑Widget灝卞簲璇ユ槸涓涓爲緇撶偣銆備竴涓爲緇撶偣鑷沖皯鏈夊Parent鍜孋hilren鐨勮緗拰璁塊棶鎺ュ彛錛?/p> <p> </p><div id="hvzpftn" class="cnblogs_code"> <pre><div><span style="color: #0000ff;">void</span><span style="color: #000000;"> SetParent(Widget</span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #0000ff;">const</span><span style="color: #000000;"> pNewParent);<br>Widget</span><span style="color: #000000;">*</span><span style="color: #000000;"> GetParent() </span><span style="color: #0000ff;">const</span><span style="color: #000000;">;<br><br></span><span style="color: #0000ff;">bool</span><span style="color: #000000;"> InsertChild(Widget</span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #0000ff;">const</span><span style="color: #000000;"> pChild);<br></span><span style="color: #0000ff;">bool</span><span style="color: #000000;"> RemoveChild(Widget</span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #0000ff;">const</span><span style="color: #000000;"> pChild);</span></div></pre> </div> <p> </p> <p>鍦ㄧ埗鎺т歡閿姣佺殑鏃跺欏畠瑕佽礋璐i攢姣佸叾涓嬫墍鏈夌殑瀛愭帶浠訛紙綾諱技紿楀彛閿姣佷篃浼氶攢姣佸叾瀛愮獥鍙o級錛?/p> <p> </p><div id="hvzpftn" class="cnblogs_code"> <pre><div><span style="color: #000000;">Widget::</span><span style="color: #000000;">~</span><span style="color: #000000;">Widget()<br>{<br> </span><span style="color: #008000;">//</span><span style="color: #008000;"> 閿姣佹墍鏈夊瓙鎺т歡</span><span style="color: #008000;"><br></span><span style="color: #000000;"> WidgetSet temp(std::move(pImpl_</span><span style="color: #000000;">-></span><span style="color: #000000;">children_));<br> std::for_each(temp.begin(), temp.end(), std::mem_fn(</span><span style="color: #000000;">&</span><span style="color: #000000;">Widget::Destroy));<br><br> </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (IsRoot()) <br> {<br> </span><span style="color: #008000;">//</span><span style="color: #008000;"> 浣滀負鏍規帶浠訛紝鍚屾椂閿姣侀┍鍔?/span><span style="color: #008000;"><br></span><span style="color: #000000;"> delete pImpl_</span><span style="color: #000000;">-></span><span style="color: #000000;">pDriver_;<br> }<br> </span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br> {<br> </span><span style="color: #008000;">//</span><span style="color: #008000;"> 涓嶆槸鏍規帶浠訛紝鍒欒劚紱葷埗鎺т歡</span><span style="color: #008000;"><br></span><span style="color: #000000;"> SetParent(</span><span style="color: #800080;">0</span><span style="color: #000000;">);<br> }<br><br> delete pImpl_;<br>}</span></div></pre> </div> <p> </p> <p>瀹炵幇涓垜浠嬌鐢╯td::set鏉ヤ繚瀛樺瓙鎺т歡錛岃繖鏍蜂究浜庨槻姝㈠瓙鎺т歡閲嶅璁劇疆錛屼篃渚夸簬縐婚櫎瀛愭帶浠訛紝緙虹偣灝辨槸涓嶈兘瀵瑰瓙鎺т歡榪涜鎺掑簭銆傚鏋滀互鍚庢垜浠彁渚涙帶浠剁殑z-order姒傚康錛岄偅涔堟垜浠氨浼氫嬌鐢ㄨ兘澶熻繘琛屾帓搴忕殑瀹瑰櫒鏉ュ綰沖瓙鎺т歡銆?/p> <p><strong>鎺т歡鍖哄煙錛?/strong></p> <p>windows涓嬶紝鎴戜滑浣跨敤RECT緇撴瀯鏉ヤ繚瀛樻帶浠惰嚜韜浉瀵逛簬紿楀彛瀹㈡埛鍖虹殑鍖哄煙錛岄偅涔堢獥鍙e鎴峰尯灝哄鏀瑰彉鏃朵篃灝辨槸鎴戜滑鎺т歡榪涜甯冨眬鐨勬椂鏈猴紝閭f垜浠氨瑕佸湪娑堟伅榪囨護涓鐞哤M_SIZE娑堟伅浜嗐?/p> <p> </p><div id="hvzpftn" class="cnblogs_code"> <pre><div><span style="color: #0000ff;">case</span><span style="color: #000000;"> WM_SIZE: </span><span style="color: #008000;">//</span><span style="color: #008000;"> 璁╂牴鎺т歡閫傚簲鐪熶釜瀹㈡埛鍖?/span><span style="color: #008000;"><br></span><span style="color: #000000;"> {<br> RECT clientRect;<br> ::GetClientRect(param.hWnd, </span><span style="color: #000000;">&</span><span style="color: #000000;">clientRect);<br> pRootWidget</span><span style="color: #000000;">-></span><span style="color: #000000;">SetAbsoluteRect(clientRect, </span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br> }<br> </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;</span></div></pre> </div> <p> </p> <p>鎴戜滑灝嗘帶浠剁殑甯冨眬浜ょ敱鐖舵帶浠剁鐞嗭紝涔熷氨鏄鎴戜滑鍙渶瑕佹洿鏂版牴鎺т歡鍖哄煙渚垮彲銆傛牴鎺т歡璐熻矗瀵瑰叾瀛愭帶浠惰繘琛屽竷灞錛屽姝ら掑綊銆?/p> <p><strong>鎺т歡鏇存柊錛?/strong></p> <p>褰撴帶浠跺尯鍩熸敼鍙樹簡錛岄偅涔堢浉搴旂殑鍏舵樉紺轟篃搴旂浉搴旂殑榪涜鏇存柊錛屾墍浠ユ垜浠殑SetAbsoluteRect鎺ュ彛鏈変竴涓猽pdate鍙傛暟鐢ㄤ簬鎺у埗鏄惁璁╃獥鍙d駭鐢熸棤鏁堝尯鍩熸縺媧葷粯鍒躲?/p> <p> </p><div id="hvzpftn" class="cnblogs_code"> <pre><div><span style="color: #008000;">//</span><span style="color: #008000;"> 姝ゅ鐨剈pdate浣滅敤鏄帶鍒舵槸鍚︾珛鍗蟲洿鏂版樉紺恒?br></span><span style="color: #008000;">//</span><span style="color: #008000;"> 鍥犱負妯℃嫙鎺т歡鍙槸紿楀彛瀹㈡埛鍖虹殑涓涓尯鍩燂紝褰撳尯鍩熸敼鍙樻椂搴旇浜х敓鍘熷尯鍩熷拰鏂板尯鍩無r榪愮畻鍚庡尯鍩熺殑鑴忕煩褰?br></span><span style="color: #008000;">//</span><span style="color: #008000;"> 浠ヤ嬌寰楃獥鍙e幓閲嶇粯榪欓儴鍒嗗尯鍩熴?br></span><span style="color: #008000;">//</span><span style="color: #008000;"> 鍙兘鏈変簺鎵歸噺鎬ц川鐨勬搷浣滀細鍦ㄦ搷浣滃涓帶浠跺悗榪涜鏁翠綋鏇存柊錛屾墍浠ュ湪瀵瑰崟涓帶浠惰緗柊鍖哄煙鐨勬椂鍊欏彲鑳戒笉浼氭兂瑕佹洿鏂般?br></span><span style="color: #008000;">//</span><span style="color: #008000;"> 鎵浠ユ墠鍔犱笂榪欎釜鏄惁绔嬪嵆鏇存柊鐨勫紑鍏熾?/span><span style="color: #008000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;"> SetAbsoluteRect(</span><span style="color: #0000ff;">const</span><span style="color: #000000;"> RECT</span><span style="color: #000000;">&</span><span style="color: #000000;"> rect, </span><span style="color: #0000ff;">bool</span><span style="color: #000000;"> update </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">true</span><span style="color: #000000;">);</span></div></pre> </div> <p> </p> <p>鏃㈢劧鎻愬埌浜嗙粯鍒訛紝閭d箞鎴戜滑涔熷簲璇ヨ鎴戜滑鐨勬帶浠跺睍紺哄湪紿楀彛涓婁簡銆?/p> <p><strong>鎺т歡緇樺埗錛?/strong></p> <p>閫氬父鎴戜滑鐨勭獥鍙g▼搴忛兘鏄湪WM_PAINT娑堟伅涓繘琛岀粯鍒訛紝鎴戜滑鐨勬帶浠剁郴緇熷綋鐒朵篃闇瑕佸鐞嗘娑堟伅銆?/p> <p> </p><div id="hvzpftn" class="cnblogs_code"> <pre><div><span style="color: #0000ff;">case</span><span style="color: #000000;"> WM_PAINT:<br> {<br> </span><span style="color: #008000;">//</span><span style="color: #008000;"> 浣跨敤鍐呭瓨DC鏉ョ紦鍐茬粯鍒?br> </span><span style="color: #008000;">//</span><span style="color: #008000;"> 鐩墠娌℃湁璁$畻鑴忕煩褰㈠尯鍩?/span><span style="color: #008000;"><br></span><span style="color: #000000;"> wnd_msg_assistant::OnPaint opAssistant(param.hWnd);<br> pRootWidget</span><span style="color: #000000;">-></span><span style="color: #000000;">Draw(opAssistant.GetMemDC());<br> }<br> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> S_OK;</span></div></pre> </div> <p> </p> <p>榪欓噷寮曞叆浜嗕竴涓緟鍔╁璞″府鍔╂垜浠駭鐢熷唴瀛楧C錛屼紭鍖栨垜浠殑緇樺埗鏁堢巼銆傛垜浠洿鎺eturn浜嗚繖涓秷鎭紝涔熷氨鏄鎴戜滑灝嗚繖涓秷鎭繃婊ゆ帀浜嗐傚墠闈M_SIZE鍜學M_DESTROY鎴戜滑閮芥病鏈夎繃婊わ紝鍙槸鍦ㄨ繖涓椂鏈哄鎺т歡榪涜浜嗛氱煡鎴栬呮搷浣溿備箣鎵浠ヨ榪囨護WM_PAINT娑堟伅鏄洜涓哄閮ㄧ殑緇樺埗鍜屾帶浠剁殑緇樺埗闅句互鍗忚皟錛岄偅涔堟垜浠共鑴嗗氨鎺ョ浜嗙獥鍙e鎴峰尯鐨勭粯鍒朵簡銆?/p> <p>褰撶劧錛屾帶浠朵篃闇瑕佽礋璐g粯鍒跺叾瀛愭帶浠訛紝閭d箞Draw鎺ュ彛涓究浼氳皟鐢ㄥ瓙鎺т歡鐨凞raw錛屽姝ら掑綊浣垮緱姣忎釜鎺т歡閮借兘澶熷緱浠ョ粯鍒躲?/p> <p><strong>棣栨鐩磋鐨勭湅鍒版垜浠殑鎺т歡錛?/strong></p> <p>鎴戜滑鍦ㄨ皟璇曠増鏈腑錛屼負姣忎釜鎺т歡鐢熸垚浜嗕竴涓殢鏈虹殑棰滆壊錛屾牴鎹帶浠剁殑鍖哄煙緇樺埗浜嗗叾杈規錛岃繖鏍鋒垜浠氨絎竴嬈$洿瑙傜殑鍦ㄧ獥鍙d腑鐪嬪埌浜嗘垜浠殑鎺т歡銆?/p> <p>锘?img src="http://pic002.cnblogs.com/images/2011/95718/2011040918550120.png"></p> <p>榪笉鍙婂緟錛屽叿鏈変簡鍖哄煙鐨勬帶浠訛紝鎴戜滑宸茬粡鎬ュ垏鐨勬兂瑕佸鍏跺竷灞榪涜鎺у埗錛岀粯鍒惰繘琛屽畾鍒朵簡銆傚竷灞鎺у埗鍜岀粯鍒跺畾鍒跺綋鐒跺睘浜庢墿灞曢儴鍒嗭紝閭d箞涓嬮潰灝卞皢瑕佸紩鍏ユ垜浠殑鎵╁睍浣撶郴浜嗭紝灝借鏈熷緟銆?/p> <p><span style="font-size: 18pt;"><strong><a >涓嬭澆嫻嬭瘯宸ョ▼婧愮爜</a></strong></span></p><img src="http://www.cnblogs.com/EvilGhost/aggbug/2010698.html?type=1" width="1" height="1" alt=""><p>浣滆? <a target="_blank">Evil.Ghost</a> 鍙戣〃浜?2011-04-09 19:05 <a target="_blank">鍘熸枃閾炬帴</a></p><p>璇勮: 0銆<a target="_blank">鏌ョ湅璇勮</a>銆<a target="_blank">鍙戣〃璇勮</a></p><hr><p>鏈鏂版柊闂伙細<br>· <a target="_blank">鑻規灉iPad 2閫氳繃3C璁よ瘉 鏈鏅?鏈堝浗鍐呬笂甯?/a><span style="color:gray">(2011-04-10 09:18)</span><br>· <a target="_blank">鐩茬洰渚濊禆iPhone絳夊伐鍏峰鑸?鑻卞浗椹村弸榪瘋礬澶?/a><span style="color:gray">(2011-04-10 09:14)</span><br>· <a target="_blank">瓚h皥錛氭兂鎷呬換CEO鐨勮瘽錛屾渶濂芥槸鍘昏嫻鏋滃伐浣滐紝鍏舵鏄井杞紝鍐嶆墠鏄疓oogle</a><span style="color:gray">(2011-04-10 08:26)</span><br>· <a target="_blank">鑵捐灝嗗緩绔嬫柊鏁版嵁涓績錛岃妯′負鑻規灉鐨勪袱鍊?/a><span style="color:gray">(2011-04-10 08:25)</span><br>· <a target="_blank">杞婚噺鍖栫殑寰瀷鍗氬Tumblr</a><span style="color:gray">(2011-04-10 08:03)</span><br></p><p>緙栬緫鎺ㄨ崘錛?a target="_blank">闈炴垬涔嬬姜錛屼粠姘鎬腑Office璋堣搗</a><br></p><p>緗戠珯瀵艱埅錛?a target="_blank">鍗氬鍥欏?/a>  <a target="_blank">鎴戠殑鍥瓙</a>  <a target="_blank">鏂伴椈</a>  <a target="_blank">闂瓨</a>  <a target="_blank">灝忕粍</a>  <a target="_blank">鍗氶棶</a>  <a target="_blank">鐭ヨ瘑搴?/a></p><img src ="http://m.shnenglu.com/vivence/aggbug/143840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/vivence/" target="_blank">EvilGhost</a> 2011-04-09 19:05 <a href="http://m.shnenglu.com/vivence/archive/2011/04/09/Abstract_Widget_6.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>涓姝ヤ竴姝ュ疄鐜拌嚜宸辯殑妯℃嫙鎺т歡錛?錛夆斺旈殣钘忕被http://m.shnenglu.com/vivence/archive/2011/04/07/Abstract_Widget_5.htmlEvilGhostEvilGhostThu, 07 Apr 2011 12:55:00 GMThttp://m.shnenglu.com/vivence/archive/2011/04/07/Abstract_Widget_5.htmlhttp://m.shnenglu.com/vivence/comments/143841.htmlhttp://m.shnenglu.com/vivence/archive/2011/04/07/Abstract_Widget_5.html#Feedback0http://m.shnenglu.com/vivence/comments/commentRss/143841.htmlhttp://m.shnenglu.com/vivence/services/trackbacks/143841.html 

闅愯棌椹卞姩綾伙細

涓轟簡璁╃敤鎴鋒湁鏇寸畝鍗曠殑浣跨敤鎺ュ彛錛屾垜浠渶瑕佹妸涓嶅繀瑕佺殑涓滆タ榪涜涓瀹氱殑闅愯棌銆傚墠闈㈡垜灝辨彁鍒癢idgetDriver瀵逛簬鐢ㄦ埛鏉ヨ鏄笉鍏沖績鐨勪笢瑗匡紝閭d箞鎴戜滑灝卞皢鍏惰繘琛岄殣钘忋?/p>

銆銆鏂規1錛?/strong>

銆銆灝哤idgetDriver鏀懼埌Widget.cpp涓紝榪欐牱鐨勯殣钘忔柟寮忔槸鏈涓ュ瘑鐨勶紝瀵逛簬鐢ㄦ埛鏉ヨ瀹屽叏鐪嬩笉鍒癢idgetDriver銆備絾鏄殢鐫鎴戜滑鐨勫疄鐜拌啫鑳錛岃繖浼氳鎴戜滑鐨刉idget.cpp鍙樺緱闈炲父鑷冭偪銆?/p>

銆銆鏂規2錛?/strong>

銆銆涓嶆敼鍙樻枃浠剁粨鏋勶紝灝哤idgetDriver縐佹湁鍖栵紝閫氳繃鍙嬪厓澹版槑浣垮緱鍙湁Widget綾誨璞¤兘澶熻闂甒idgetDriver銆傝繖鏍風敤鎴瘋櫧鐒惰兘澶熺湅鍒癢idgetDriver榪欎釜綾誨畾涔夛紝浣嗘槸鍗存棤娉曚嬌鐢紝榪欐牱瀵逛簬浠g爜鐨勭粨鏋勭粍緇囦篃鏇存湁鍒┿?/p>

鎴戦噰鐢ㄤ簡鏂規2

class Driver_{
friend
class Widget;

DriverImpl_
* pImpl_;

private:
explicit Driver_(HWND hWnd);
~Driver_();
Driver_(
const Driver_&);
Driver_
& operator =(const Driver_&);

private:
void SetRootWidget(Widget* pRootWidget);
HWND GetContainerWindow()
const;
Widget
* GetRootWidget() const;
};

 

鍥犱負鎴戜滑闅愯棌浜哤idgetDriver錛岄偅涔堝畠鐨勮亴鑳藉氨鑳藉榪涜綆鍖栥傚墠闈㈡彁鍒扮殑鏍規帶浠跺拰WidgetDriver涔嬮棿鐨勫叧緋繪垜浠氨鑳藉鏀逛負褰撴柟闈㈡帶鍒朵簡銆備簬鏄垜灝哤idgetDriver鏀懼埌浜嗘牴鎺т歡涓繘琛岀鐞嗭紝鎴戜滑鍙渶瑕佹搷浣滄牴鎺т歡渚垮彲銆?/p>

Widget::Widget(HWND hWnd)
: pImpl_(
new WidgetImpl)
{
pImpl_
->pDriver = new widget::Driver_(hWnd);
pImpl_
->pDriver->SetRootWidget(this);
}

Widget::
~Widget()
{
if (IsRoot())
{
delete pImpl_
->pDriver;
}
delete pImpl_;
}

 

鍓嶉潰鎴戜滑閮芥病鏈夋彁鍒板簲璇ヤ綍鏃剁粨鏉熸垜浠殑緋葷粺錛屼絾鏄垜浠殑緋葷粺鐢熷懡鍛ㄦ湡鍜岀獥鍙f槸鎭伅鐩稿叧鐨勶紝鍦ㄧ獥鍙i攢姣佺殑鏃跺欓偅涔堝拰榪欎釜紿楀彛鐩稿叧鑱旂殑鎺т歡浣撶郴灝卞簲璇ラ攢姣併備簬鏄垜浠娑堟伅榪囨護鍣ㄥ仛浜嗕竴鐐圭偣鏀瑰姩錛?/p>

LRESULT MessageFilter::Filter(const Param& param, Widget* pRootWidget)
{
assert(param.originalProc);
assert(pRootWidget);
#ifdef _DEBUG
std::stringstream ss;
ss
<<"紿楀彛娑堟伅: "<<std::showbase<<std::hex<<param.message<<" 榪涘叆Widget娑堟伅榪囨護錛乗r\n";
::OutputDebugStringA(ss.str().c_str());
#endif // _DEBUG

LRESULT ret
= ::CallWindowProc(
param.originalProc,
param.hWnd,
param.message,
param.wParam,
param.lParam);

if (WM_DESTROY == param.message)
{
// 閿姣佹牴鎺т歡
pRootWidget->Destroy();
}

return ret;
}
鎴戜滑鍦ㄦ帴鏀跺埌WM_DESTROY紿楀彛娑堟伅鐨勬椂鍊欓攢姣佹牴鎺т歡錛屾牴鎺т歡鏋愭瀯鐨勬椂鍊欏張浼氶攢姣佹帶浠墮┍鍔紝鎺т歡椹卞姩鏋愭瀯鐨勬椂鍊欎細瑙i櫎鍜岀獥鍙g殑鍏寵仈銆?p> 

涓嬩竴姝ユ垜浠究瑕佸紑濮嬪鎴戜滑鐨勬帶浠惰繘琛岃璁′簡錛屾垜浠嚜濮嬭嚦緇堥兘灝嗘帶浠舵娊璞′負紿楀彛瀹㈡埛鍖虹殑涓涓尯鍩燂紝鎵浠ヨ鎴戜滑騫朵笉鎵撶畻浣跨敤緇ф壙鏉ユ墿灞曟帶浠躲傚悗闈細鐪嬪埌鎴戜滑浣跨敤鎻掑叆寮忕殑鎵╁睍錛岃繖鏍風殑鏂瑰紡鍏峰鍔ㄦ佹浛鎹㈢殑鑳藉姏鐢氳嚦榪樿兘灝嗕竴涓墿灞曞叡浜粰澶氫釜鎺т歡浣跨敤銆?/p>

涓嬭澆嫻嬭瘯宸ョ▼婧愮爜

浣滆? Evil.Ghost 鍙戣〃浜?2011-04-07 20:55 鍘熸枃閾炬帴

璇勮: 0銆鏌ョ湅璇勮鍙戣〃璇勮


鏈鏂版柊闂伙細
· 鑻規灉iPad 2閫氳繃3C璁よ瘉 鏈鏅?鏈堝浗鍐呬笂甯?/a>(2011-04-10 09:18)
·
鐩茬洰渚濊禆iPhone絳夊伐鍏峰鑸?鑻卞浗椹村弸榪瘋礬澶?/a>(2011-04-10 09:14)
·
瓚h皥錛氭兂鎷呬換CEO鐨勮瘽錛屾渶濂芥槸鍘昏嫻鏋滃伐浣滐紝鍏舵鏄井杞紝鍐嶆墠鏄疓oogle(2011-04-10 08:26)
· 鑵捐灝嗗緩绔嬫柊鏁版嵁涓績錛岃妯′負鑻規灉鐨勪袱鍊?/a>(2011-04-10 08:25)
·
杞婚噺鍖栫殑寰瀷鍗氬Tumblr(2011-04-10 08:03)

緙栬緫鎺ㄨ崘錛?a target="_blank">闈炴垬涔嬬姜錛屼粠姘鎬腑Office璋堣搗

緗戠珯瀵艱埅錛?a target="_blank">鍗氬鍥欏?/a>  鎴戠殑鍥瓙  鏂伴椈  闂瓨  灝忕粍  鍗氶棶  鐭ヨ瘑搴?/a>



EvilGhost 2011-04-07 20:55 鍙戣〃璇勮
]]>
涓姝ヤ竴姝ュ疄鐜拌嚜宸辯殑妯℃嫙鎺т歡錛?錛夆斺旀牴鎺т歡http://m.shnenglu.com/vivence/archive/2011/04/06/Abstract_Widget_4.htmlEvilGhostEvilGhostWed, 06 Apr 2011 13:21:00 GMThttp://m.shnenglu.com/vivence/archive/2011/04/06/Abstract_Widget_4.htmlhttp://m.shnenglu.com/vivence/comments/143842.htmlhttp://m.shnenglu.com/vivence/archive/2011/04/06/Abstract_Widget_4.html#Feedback0http://m.shnenglu.com/vivence/comments/commentRss/143842.htmlhttp://m.shnenglu.com/vivence/services/trackbacks/143842.html 

紿楀彛銆佹帶浠墮┍鍔ㄣ佹牴鎺т歡涔嬮棿鐨勫叧緋?/strong>

鍓嶉潰鎴戜滑宸茬粡璇翠簡錛屼竴涓獥鍙e彧鑳藉叧鑱斾竴涓帶浠墮┍鍔紝涓涓帶浠墮┍鍔ㄤ篃鍚屾牱瀵瑰簲涓涓牴鎺т歡銆備負浠涔堝憿錛熷洜涓烘垜浠殑椹卞姩闇瑕佷綔鐢ㄤ簬涓涓帶浠朵綋緋伙紝涓涓帶浠朵綋緋誨叿鏈変竴涓牴鎺т歡錛岃繖涓牴鎺т歡綆$悊浜嗘暣涓獥鍙g殑瀹㈡埛鍖恒傝繖鏍鋒垜浠墠鑳藉湪榪欎釜鏍規帶浠朵笅鍒涘緩浠繪剰鐨勬帶浠訛紝騫舵椿鍔ㄥ湪紿楀彛瀹㈡埛鍖恒?/p>

鐢熷懡鍛ㄦ湡鎺у埗

鍩轟簬涓婇潰鐨勫叧緋伙紝鎺т歡椹卞姩鍜屾牴鎺т歡鐨勭敓鍛芥伅鎭浉鍏籌紝閭d箞鎴戜滑璁╁叾鐩鎬簰鍒剁害銆傛棦鐒舵槸浠栦滑鑷韓鐩鎬簰鍒剁害錛岄偅涔堢敤鎴峰氨涓嶅簲璇ョ鐞嗗叾鐢熷懡鍛ㄦ湡錛屾垜浠壒鎰忓紩鍏ヤ竴涓畝鍗曠殑瀵硅薄姹犳潵綆$悊錛屽茍鐢ㄨ闂帶鍒舵潵閬垮厤澶栭儴鐩存帴鏋勯犮?/p>

private:
explicit Widget(widget::Driver* pDriver);
~Widget();
Widget(
const Widget&);
Widget
& operator =(const Widget&);

// 璁╁璞℃睜鑳藉鍒涘緩Widget瀵硅薄
friend class ObjectPool<Widget>;
#pragma warning(push)
#pragma warning(disable:4396)
friend
void std::_Destroy(Widget _FARQ *);
#pragma warning(pop)

public:
static Widget* Create(HWND hWnd); // 鍒涘緩鏍規帶浠?/span>
void Destroy();

 

鎴戜滑鎻愪緵浜嗕竴涓潤鎬佹帴鍙reate鐢ㄤ簬鍒涘緩鏍規帶浠訛紝鍙互娉ㄦ剰鍒扮殑涓鐐規槸鍙傛暟鏄獥鍙e彞鏌勩傚叾瀹炵敤鎴峰浜庝粈涔堥┍鍔ㄣ佷粈涔堣繃婊ょ殑閮戒笉鍏沖績錛岀敤鎴峰彧鍏沖績鎺т歡浣撶郴錛屾墍浠ヨ鎴戜滑鍙互閫氳繃榪欎釜鎺ュ彛閫忔槑鐨勫垱寤烘牴緇勪歡錛屽疄鐜頒腑浼氳嚜鍔ㄧ殑鍘婚┍鍔ㄦ紿楀彛銆?/p>

Widget* Widget::Create(HWND hWnd)
{
return GetWidgetPool_().Construct(widget::Driver::Create(hWnd));
}

 

椹卞姩鏋勯犳椂浼氬垱寤烘牴鎺т歡錛屾瀽鏋勬椂閿姣佹牴鎺т歡

Driver::Driver(HWND hWnd)
: pImpl_(
new DriverImpl(hWnd))
{
// 鍒涘緩鏍規帶浠?/span>
pImpl_->SetRootWidget(Widget::Create_(this));
}
~DriverImpl()
{
// 閿姣佹牴鎺т歡
Widget* pOldRootWidget = GetRootWidget();
pRootWidget_
= 0;
if (pOldRootWidget)
{
pOldRootWidget
->Destroy();
}
}

 

鍚屾牱錛屾牴鎺т歡鏋愭瀯鏃朵篃閿姣佹帶浠墮┍鍔?/p>

Widget::~Widget()
{
if (IsRoot())
{
pImpl_
->GetDriver()->Destroy();
}
delete pImpl_;
}

 

榪欐牱錛岀敤鎴峰叾瀹炴湁涓や釜鍏ュ彛鍙互榪涘叆鍒版垜浠殑鎺т歡緋葷粺錛屼竴涓槸閫氳繃鎺т歡椹卞姩錛屼竴涓槸閫氳繃鎺т歡鏈韓銆傛垜浠彁鍊$敤鎴蜂笉鍘誨叧蹇冩帶浠墮┍鍔ㄣ傞偅涔堢敋鑷蟲垜浠彲浠ラ殣钘廌river榪欎釜綾伙紝鐩墠鎴戞病鏈夎繖鏍峰仛銆?/p>

涓嬭澆嫻嬭瘯宸ョ▼婧愮爜

浣滆? Evil.Ghost 鍙戣〃浜?2011-04-06 21:21 鍘熸枃閾炬帴

璇勮: 0銆鏌ョ湅璇勮鍙戣〃璇勮


鏈鏂版柊闂伙細
· 鑻規灉iPad 2閫氳繃3C璁よ瘉 鏈鏅?鏈堝浗鍐呬笂甯?/a>(2011-04-10 09:18)
·
鐩茬洰渚濊禆iPhone絳夊伐鍏峰鑸?鑻卞浗椹村弸榪瘋礬澶?/a>(2011-04-10 09:14)
·
瓚h皥錛氭兂鎷呬換CEO鐨勮瘽錛屾渶濂芥槸鍘昏嫻鏋滃伐浣滐紝鍏舵鏄井杞紝鍐嶆墠鏄疓oogle(2011-04-10 08:26)
· 鑵捐灝嗗緩绔嬫柊鏁版嵁涓績錛岃妯′負鑻規灉鐨勪袱鍊?/a>(2011-04-10 08:25)
·
杞婚噺鍖栫殑寰瀷鍗氬Tumblr(2011-04-10 08:03)

緙栬緫鎺ㄨ崘錛?a target="_blank">闈炴垬涔嬬姜錛屼粠姘鎬腑Office璋堣搗

緗戠珯瀵艱埅錛?a target="_blank">鍗氬鍥欏?/a>  鎴戠殑鍥瓙  鏂伴椈  闂瓨  灝忕粍  鍗氶棶  鐭ヨ瘑搴?/a>



EvilGhost 2011-04-06 21:21 鍙戣〃璇勮
]]>
涓姝ヤ竴姝ュ疄鐜拌嚜宸辯殑妯℃嫙鎺т歡錛?錛夆斺擶idget椹卞姩http://m.shnenglu.com/vivence/archive/2011/04/03/Abstract_Widget_3.htmlEvilGhostEvilGhostSun, 03 Apr 2011 05:56:00 GMThttp://m.shnenglu.com/vivence/archive/2011/04/03/Abstract_Widget_3.htmlhttp://m.shnenglu.com/vivence/comments/143843.htmlhttp://m.shnenglu.com/vivence/archive/2011/04/03/Abstract_Widget_3.html#Feedback0http://m.shnenglu.com/vivence/comments/commentRss/143843.htmlhttp://m.shnenglu.com/vivence/services/trackbacks/143843.html 

鍓嶉潰鎴戜滑鍒╃敤鐜版湁鐨勫井杞疉TL瀹炵幇鐨則hunk宸茬粡涓烘垜浠埅鑾風獥鍙f秷鎭仛濂戒簡鍑嗗錛屾鍒繪垜浠簲璇ョ紪鍐欐垜浠殑Widget椹卞姩鐨勫垵姝ュ疄鐜頒簡銆?/p>

鍒╃敤thunk瀵圭獥鍙f秷鎭繃紼嬭繘琛屽瓙綾誨寲錛岄偅涔堢獥鍙f秷鎭氨浼氬厛嫻佸叆鍒版垜浠殑Widget椹卞姩瀵硅薄錛學idget椹卞姩瀵硅薄璐熻矗灝嗘秷鎭紶閫掔粰娑堟伅榪囨護鍣ㄣ傜幇鍦ㄦ垜浠殑娑堟伅榪囨護鍣ㄨ繕鏈疄鐜幫紝浜庢槸鎴戜滑鎵撳嵃浜嗚繘鍏ユ秷鎭繃婊ゅ櫒鐨勬秷鎭疘D鍊間互瑙傚療娑堟伅鐨勬祦鍔ㄦ儏鍐點?/p>

浠ヤ笅鏄垜浠殑Widget椹卞姩綾伙紝鎴戜滑灝嗗叾鏀懼叆浜嗕竴涓悕涓簑idget鐨勫悕瀛楃┖闂翠腑錛屼互鍚庢垜浠瑆idget鐩稿叧鐨勫悕瀛楅兘浼氭斁鍏ュ埌榪欎釜鍚嶅瓧絀洪棿涓?/p>

class DriverImpl;

class Driver{
DriverImpl
* pImpl_;

public:
explicit Driver(HWND hWnd);
~Driver();

private:
Driver(
const Driver&);
Driver
& operator =(const Driver&);

public:
inline HWND GetContainerWindow()
const;
};

鍥犱負Driver鐨勫疄鐜版垜浠茍涓嶅叧蹇冿紝鎵浠ユ垜浠皢鍏跺疄鐜拌繘琛屼簡涓涓殣钘忥紝榪欐牱涔熶究浜庢垜浠慨鏀瑰叾瀹炵幇鏂瑰紡銆侱river綾誨璞¤姹傜敤浜庢瀯閫犲畠鐨勭獥鍙e彞鏌勫繀欏諱負鏈夋晥鐨勭獥鍙e彞鏌勶紝騫朵笖姣忎釜紿楀彛鍙ユ焺鍙兘琚┍鍔ㄤ竴嬈★紝鎵浠ユ垜浠湪璋冭瘯鐗堟湰涓仛浜嗘柇璦鏉ョ害鏉熸垜浠殑緙栫爜錛屽湪鍙戝竷鐗堟湰涓笉浼氬仛浠諱綍鍒ゆ柇銆?/p>

#ifdef _DEBUG
assert(::IsWindow(hContainerWnd_));
// 涓嶈兘澶氭椹卞姩鍚屼竴紿楀彛
assert(GetContainerWindows_().insert(hContainerWnd_).second);
#endif // _DEBUG
姝ゅ鏈変竴涓?span style="color: #ff0000;">GetContainerWindows_()鏄竴涓彧鍦ㄨ皟璇曠増鏈腑鎵嶆湁鐨勫疄鐜幫紝鍏惰繑鍥炰竴涓猻td::set<HWND>&闈欐佸璞″紩鐢紝鐢ㄤ簬淇濆瓨宸茬粡琚┍鍔ㄧ殑紿楀彛鍙ユ焺錛屾垜浠柇璦紿楀彛鍙ユ焺鏈浘淇濆瓨鍒拌繖涓猻et涔嬩腑銆?/span>

鐜板湪鎴戜滑瀹炵幇鐨凞river鎺ュ彛闈炲父綆鍗曪紝鍙湁涓涓瀯閫犳帴鍙e拰鏌ヨ鍏墮┍鍔ㄧ殑紿楀彛鍙ユ焺鐨勬帴鍙o紝鏄劇劧娌℃湁浠諱綍鍙互鎺у埗椹卞姩鎴栬呰В闄ら┍鍔ㄧ殑鏈轟細錛屾澶勬垜浠厛鏀句竴鏀撅紝鍥犱負榪欏湪浠ュ悗浼氭秹鍙婂埌榪欎釜椹卞姩鎵鍏寵仈鐨刉idget浣撶郴鐨勪竴浜涢棶棰樸?/p>

閫氳繃thunk鎴幏鐨勭獥鍙f秷鎭皢浼氳繘鍏ュ埌Driver瀹炵幇涓紝Driver鐨勫姛鑳戒粎浠呮槸浣滀負Widget鐨勯┍鍔紙涔熷氨鏄秷鎭┍鍔級錛屽畠涓嶈礋璐d換浣曟秷鎭殑澶勭悊錛屾墍浠ヨ繖涓獥鍙h繃紼嬪湪鎴幏鍒扮獥鍙f秷鎭悗绔嬪嵆浜ょ敱娑堟伅榪囨護澶勭悊銆?/p>

LRESULT WndProc_(UINT message, WPARAM wParam, LPARAM lParam)
{
// 榪涜娑堟伅榪囨護
MessageFilter::Param param;
param.hWnd
= hContainerWnd_;
param.originalProc
= originalProc_;
param.message
= message;
param.wParam
= wParam;
param.lParam
= lParam;
return MessageFilter::Filter(param);
}

榪欓噷娑堟伅榪囨護鍣ㄧ殑瀹炵幇涓嶅湪榪欎竴孌佃璁轟箣涓紝鎵浠ユ垜浠畝鍗曠殑浠ヤ竴涓被闈欐佹帴鍙f潵浣滀負榪囨護鍏ュ彛銆?/p>

濂戒簡錛屾垜浠埌榪欓噷宸茬粡寮鍚簡Widget鍐呮牳鐨勮繍浣滅郴緇熺殑瀹炵幇錛屼粠嫻嬭瘯宸ョ▼涓劅鍙楀緱鍒頒竴瀹氱殑浣撻獙浜嗐?/p>

涓嬭澆嫻嬭瘯宸ョ▼婧愮爜

浣滆? Evil.Ghost 鍙戣〃浜?2011-04-03 13:56 鍘熸枃閾炬帴

璇勮: 0銆鏌ョ湅璇勮鍙戣〃璇勮


鏈鏂版柊闂伙細
· 鑻規灉iPad 2閫氳繃3C璁よ瘉 鏈鏅?鏈堝浗鍐呬笂甯?/a>(2011-04-10 09:18)
·
鐩茬洰渚濊禆iPhone絳夊伐鍏峰鑸?鑻卞浗椹村弸榪瘋礬澶?/a>(2011-04-10 09:14)
·
瓚h皥錛氭兂鎷呬換CEO鐨勮瘽錛屾渶濂芥槸鍘昏嫻鏋滃伐浣滐紝鍏舵鏄井杞紝鍐嶆墠鏄疓oogle(2011-04-10 08:26)
· 鑵捐灝嗗緩绔嬫柊鏁版嵁涓績錛岃妯′負鑻規灉鐨勪袱鍊?/a>(2011-04-10 08:25)
·
杞婚噺鍖栫殑寰瀷鍗氬Tumblr(2011-04-10 08:03)

緙栬緫鎺ㄨ崘錛?a target="_blank">闈炴垬涔嬬姜錛屼粠姘鎬腑Office璋堣搗

緗戠珯瀵艱埅錛?a target="_blank">鍗氬鍥欏?/a>  鎴戠殑鍥瓙  鏂伴椈  闂瓨  灝忕粍  鍗氶棶  鐭ヨ瘑搴?/a>



EvilGhost 2011-04-03 13:56 鍙戣〃璇勮
]]>
涓姝ヤ竴姝ュ疄鐜拌嚜宸辯殑妯℃嫙鎺т歡錛?錛夆斺旂獥鍙h繃紼媡hunkhttp://m.shnenglu.com/vivence/archive/2011/04/03/Abstract_Widget_2.htmlEvilGhostEvilGhostSun, 03 Apr 2011 05:55:00 GMThttp://m.shnenglu.com/vivence/archive/2011/04/03/Abstract_Widget_2.htmlhttp://m.shnenglu.com/vivence/comments/143844.htmlhttp://m.shnenglu.com/vivence/archive/2011/04/03/Abstract_Widget_2.html#Feedback0http://m.shnenglu.com/vivence/comments/commentRss/143844.htmlhttp://m.shnenglu.com/vivence/services/trackbacks/143844.html 

瀹炵幇Window Proc Thunk錛?/strong>

灝卞ソ鍍忔按娉典竴鏍鳳紝鎴戜滑鐨勭郴緇熶篃闇瑕佷竴涓車鈥斺旀秷鎭車錛屼篃灝辨槸鍓嶉潰鍥句笂鐨凪essage Driver銆傝繖涓狣river鐨勫彲浠ヤ緷闈犱竴涓猈indow Proc Thunk鏉ユ埅鑾風獥鍙f秷鎭紝閭d箞鎴戜滑寰楀厛瀹炵幇涓涓猈indow Proc Thunk銆?/p>

榪欓噷鎴戦夋嫨鐨勬柟娉曟槸鎷跨幇鎴愮殑浠g爜鏉ョ敤錛屽井杞疉TL妗嗘灦涓彁渚涙湁thunk鐨勫疄鐜幫紝鎴戝皢鍏舵彁鍙栧嚭鏉ョ◢鍔犱慨鏀瑰氨鑳戒負鎴戜滑鎵鐢ㄤ簡銆?/p>

浠ヤ笅鏄叾瀹炵幇鐨勪竴鐐逛唬鐮佺墖孌碉細

void* __stdcall AllocStdCallThunk(void);
void __stdcall FreeStdCallThunk(void*);

#pragma pack(push, 1)
class StdCallThunk_{
DWORD mov_;
// mov dword ptr [esp+0x4], this_ (esp+0x4灝辨槸絎竴涓弬鏁?
DWORD this_; //
BYTE jmp_; // jmp proc
DWORD relproc_; // relative jmp

public:
bool Init(DWORD_PTR proc, void* pThis)
{
mov_
= 0x042444C7; //C7 44 24 0C
this_ = PtrToUlong(pThis);
jmp_
= 0xe9;
relproc_
= DWORD((INT_PTR)proc - ((INT_PTR)this+sizeof(StdCallThunk_)));
// 鐢ㄨ嚜韜洿鏂版寚浠ょ紦瀛?/span>
return ::FlushInstructionCache(::GetCurrentProcess(), this, sizeof(StdCallThunk_)) ? true : false;
}
// 鏌愪簺thunk灝嗗姩鎬佺殑涓轟唬鐮佸垎閰嶅唴瀛?/span>
void* GetCodeAddress()
{
return this;
}
void* operator new(size_t)
{
return AllocStdCallThunk();
}
void operator delete(void* pThunk)
{
FreeStdCallThunk(pThunk);
}
};
#pragma pack(pop)

涓嬭澆嫻嬭瘯宸ョ▼婧愮爜

浣滆? Evil.Ghost 鍙戣〃浜?2011-04-03 13:55 鍘熸枃閾炬帴

璇勮: 0銆鏌ョ湅璇勮鍙戣〃璇勮


鏈鏂版柊闂伙細
· 鑻規灉iPad 2閫氳繃3C璁よ瘉 鏈鏅?鏈堝浗鍐呬笂甯?/a>(2011-04-10 09:18)
·
鐩茬洰渚濊禆iPhone絳夊伐鍏峰鑸?鑻卞浗椹村弸榪瘋礬澶?/a>(2011-04-10 09:14)
·
瓚h皥錛氭兂鎷呬換CEO鐨勮瘽錛屾渶濂芥槸鍘昏嫻鏋滃伐浣滐紝鍏舵鏄井杞紝鍐嶆墠鏄疓oogle(2011-04-10 08:26)
· 鑵捐灝嗗緩绔嬫柊鏁版嵁涓績錛岃妯′負鑻規灉鐨勪袱鍊?/a>(2011-04-10 08:25)
·
杞婚噺鍖栫殑寰瀷鍗氬Tumblr(2011-04-10 08:03)

緙栬緫鎺ㄨ崘錛?a target="_blank">闈炴垬涔嬬姜錛屼粠姘鎬腑Office璋堣搗

緗戠珯瀵艱埅錛?a target="_blank">鍗氬鍥欏?/a>  鎴戠殑鍥瓙  鏂伴椈  闂瓨  灝忕粍  鍗氶棶  鐭ヨ瘑搴?/a>



EvilGhost 2011-04-03 13:55 鍙戣〃璇勮
]]>
涓姝ヤ竴姝ュ疄鐜拌嚜宸辯殑妯℃嫙鎺т歡錛?錛夆斺旀秷鎭┍鍔ㄨ璁?/title><link>http://m.shnenglu.com/vivence/archive/2011/04/03/Abstract_Widget_1.html</link><dc:creator>EvilGhost</dc:creator><author>EvilGhost</author><pubDate>Sun, 03 Apr 2011 05:53:00 GMT</pubDate><guid>http://m.shnenglu.com/vivence/archive/2011/04/03/Abstract_Widget_1.html</guid><wfw:comment>http://m.shnenglu.com/vivence/comments/143845.html</wfw:comment><comments>http://m.shnenglu.com/vivence/archive/2011/04/03/Abstract_Widget_1.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/vivence/comments/commentRss/143845.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/vivence/services/trackbacks/143845.html</trackback:ping><description><![CDATA[ <p> </p><p><strong>鐩爣錛?/strong></p> <p>瀹炵幇涓濂梬indows涓嬬畝鍗曚笖鍙墿灞曠殑鎶借薄妯℃嫙鎺т歡鍐呮牳銆?/p> <p><strong>鎶借薄妯℃嫙鎺т歡錛?/strong></p> <p>鎴戜滑灝唚indows緋葷粺鐨勭獥鍙e鎴峰尯浣滀負妯℃嫙鎺т歡鐨勫鍣紝姣忎釜妯℃嫙鎺т歡灝辨槸鍏朵腑鐨勪竴涓娊璞$煩褰㈠尯鍩燂紝騫朵笖鑳藉妯℃嫙鎺т歡榪涜閫掑綊宓屽銆傛帶浠舵敮鎸佸熀鏈殑榧犳爣鍜岄敭鐩樻秷鎭紝鑳藉鍦ㄧ獥鍙eぇ灝忔敼鍙樻椂榪涜甯冨眬銆?/p> <p><strong>鍒嗘瀽錛?/strong></p> <p>鍥犱負鎴戜滑瑕佸疄鐜扮殑鏄娊璞$殑妯℃嫙鎺т歡錛屼笉鏄湡姝g殑紿楀彛鎺т歡錛岄偅涔堝氨闇瑕佸皢紿楀彛娑堟伅閫傛椂媧懼彂鍒扮浉搴旀帶浠躲備笅闈互涓涓浘鏉ヨ鍒掔獥鍙f秷鎭殑嫻佸悜銆?/p> <p><a ><img height="471" width="660" src="http://images.cnblogs.com/cnblogs_com/EvilGhost/201103/201103302107388838.png" alt="Abstract Widget" border="0" title="Abstract Widget" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;"></a></p> <p>鍦ㄨ繖涓浘涓婃垜浠彲浠ョ湅鍒伴櫎浜嗘垜浠殑鎺т歡浣撶郴浠ュ榪橀渶瑕佸疄鐜板嚑涓牳蹇冩ā鍧楁潵椹卞姩鎺т歡銆備粬浠垎鍒槸錛氭秷鎭┍鍔ㄣ佹秷鎭繃婊ゃ佹秷鎭漿鎹€傛秷鎭┍鍔ㄩ氳繃鏌愮鏂規硶鎴幏紿楀彛娑堟伅錛堝浘涓婁嬌鐢╰hunk錛夛紝鐒跺悗灝嗙獥鍙f秷鎭氦緇欒繃婊ゅ櫒榪涜榪囨護錛堝洜涓烘ā鎷熸帶浠朵笉鏄墍鏈夌獥鍙f秷鎭兘鎰熷叴瓚o級錛屾秷鎭繃婊ゅ嚭鎺т歡鎰熷叴瓚g殑娑堟伅浜ょ粰娑堟伅杞崲鍣紝鍏朵粬娑堟伅浜よ繕緇欑獥鍙g殑鍘熸湁紿楀彛榪囩▼榪涜澶勭悊錛?strong>姝ゅ瑕佹敞鎰忕殑鏄秷鎭繃婊ゅ悗鎺т歡鎰熷叴瓚g殑娑堟伅涓嶄細鍐嶅洖鍒板師紿楀彛榪囩▼</strong>錛夈傛秷鎭漿鎹㈠櫒灝嗙獥鍙f秷鎭漿鎹負鎺т歡娑堟伅錛屼箣鎵浠ヨ榪涜杞崲鏄洜涓烘帶浠朵綋緋誨彲鑳芥敮鎸佺殑娑堟伅緋葷粺浼氭湁鍒簬紿楀彛娑堟伅錛屼篃鍙兘闇瑕佽繘琛屽潗鏍囨槧灝勭瓑銆?/p> <p>鍥句笂榪樿兘鐪嬪埌錛屾垜浠殑鎺т歡鏄兘澶熼掑綊宓屽鐨勩傛瘡涓獥鍙e搴斾竴涓牴鎺т歡錛屾墍鏈夌殑鎺т歡閮芥槸鍦ㄨ繖涓牴緇勪歡涔嬩腑鐨勩備負浜嗚鑳藉浣跨敤紿楀彛鐨勬暣涓鎴峰尯錛岄偅涔堟牴緇勪歡鎵澶勫尯鍩熷氨鏄獥鍙g殑鏁翠釜瀹㈡埛鍖恒?/p> <p>鐜板湪鎴戜滑瑕佸紑濮嬭繘琛岃璁′簡錛岃璁¤繃紼嬩腑灝嗗紩鍏ヤ唬鐮侊紝浠g爜灝嗛殢鐫璁捐鐨勬紨鍖栬繘琛屾紨鍖栵紝鏈緇堝艦鎴愭垜浠繖涓畝鍗曚笖鍙墿灞曠殑鎶借薄妯℃嫙鎺т歡鏍稿績銆?/p><img src="http://www.cnblogs.com/EvilGhost/aggbug/2000310.html?type=1" width="1" height="1" alt=""><p>浣滆? <a target="_blank">Evil.Ghost</a> 鍙戣〃浜?2011-04-03 13:53 <a target="_blank">鍘熸枃閾炬帴</a></p><p>璇勮: 0銆<a target="_blank">鏌ョ湅璇勮</a>銆<a target="_blank">鍙戣〃璇勮</a></p><hr><p>鏈鏂版柊闂伙細<br>· <a target="_blank">鑻規灉iPad 2閫氳繃3C璁よ瘉 鏈鏅?鏈堝浗鍐呬笂甯?/a><span style="color:gray">(2011-04-10 09:18)</span><br>· <a target="_blank">鐩茬洰渚濊禆iPhone絳夊伐鍏峰鑸?鑻卞浗椹村弸榪瘋礬澶?/a><span style="color:gray">(2011-04-10 09:14)</span><br>· <a target="_blank">瓚h皥錛氭兂鎷呬換CEO鐨勮瘽錛屾渶濂芥槸鍘昏嫻鏋滃伐浣滐紝鍏舵鏄井杞紝鍐嶆墠鏄疓oogle</a><span style="color:gray">(2011-04-10 08:26)</span><br>· <a target="_blank">鑵捐灝嗗緩绔嬫柊鏁版嵁涓績錛岃妯′負鑻規灉鐨勪袱鍊?/a><span style="color:gray">(2011-04-10 08:25)</span><br>· <a target="_blank">杞婚噺鍖栫殑寰瀷鍗氬Tumblr</a><span style="color:gray">(2011-04-10 08:03)</span><br></p><p>緙栬緫鎺ㄨ崘錛?a target="_blank">闈炴垬涔嬬姜錛屼粠姘鎬腑Office璋堣搗</a><br></p><p>緗戠珯瀵艱埅錛?a target="_blank">鍗氬鍥欏?/a>  <a target="_blank">鎴戠殑鍥瓙</a>  <a target="_blank">鏂伴椈</a>  <a target="_blank">闂瓨</a>  <a target="_blank">灝忕粍</a>  <a target="_blank">鍗氶棶</a>  <a target="_blank">鐭ヨ瘑搴?/a></p><img src ="http://m.shnenglu.com/vivence/aggbug/143845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/vivence/" target="_blank">EvilGhost</a> 2011-04-03 13:53 <a href="http://m.shnenglu.com/vivence/archive/2011/04/03/Abstract_Widget_1.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item></channel></rss> <a href="http://m.shnenglu.com/">青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品</a> <div style="position:fixed;left:-9000px;top:-9000px;"><font id="pjuwb"></font><button id="pjuwb"><pre id="pjuwb"></pre></button><sub id="pjuwb"></sub><tbody id="pjuwb"><var id="pjuwb"><address id="pjuwb"></address></var></tbody><listing id="pjuwb"><label id="pjuwb"><strong id="pjuwb"></strong></label></listing><wbr id="pjuwb"><small id="pjuwb"><tbody id="pjuwb"></tbody></small></wbr><ins id="pjuwb"><xmp id="pjuwb"></xmp></ins><style id="pjuwb"></style><label id="pjuwb"><em id="pjuwb"><li id="pjuwb"></li></em></label><samp id="pjuwb"></samp><menu id="pjuwb"><input id="pjuwb"></input></menu><pre id="pjuwb"><tbody id="pjuwb"><tfoot id="pjuwb"><button id="pjuwb"></button></tfoot></tbody></pre><form id="pjuwb"></form><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"><sup id="pjuwb"></sup></label></style></i><li id="pjuwb"><table id="pjuwb"><abbr id="pjuwb"></abbr></table></li><video id="pjuwb"></video><dfn id="pjuwb"></dfn><progress id="pjuwb"></progress><strong id="pjuwb"></strong><mark id="pjuwb"></mark><em id="pjuwb"></em><tbody id="pjuwb"><p id="pjuwb"><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike></p></tbody><option id="pjuwb"></option><strike id="pjuwb"></strike><u id="pjuwb"></u><td id="pjuwb"><center id="pjuwb"><tr id="pjuwb"></tr></center></td><em id="pjuwb"><mark id="pjuwb"><em id="pjuwb"><tt id="pjuwb"></tt></em></mark></em><strong id="pjuwb"></strong><wbr id="pjuwb"></wbr><s id="pjuwb"></s><strong id="pjuwb"></strong><legend id="pjuwb"></legend><nav id="pjuwb"></nav><dl id="pjuwb"><th id="pjuwb"><dl id="pjuwb"></dl></th></dl><noframes id="pjuwb"><ins id="pjuwb"></ins></noframes><font id="pjuwb"></font><strike id="pjuwb"><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"></label></style></i></strike><output id="pjuwb"></output><thead id="pjuwb"><pre id="pjuwb"></pre></thead><source id="pjuwb"></source><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem><pre id="pjuwb"><span id="pjuwb"><pre id="pjuwb"><big id="pjuwb"></big></pre></span></pre><cite id="pjuwb"><fieldset id="pjuwb"><s id="pjuwb"><rt id="pjuwb"></rt></s></fieldset></cite><big id="pjuwb"><progress id="pjuwb"><big id="pjuwb"></big></progress></big><samp id="pjuwb"><delect id="pjuwb"></delect></samp><dl id="pjuwb"></dl><strike id="pjuwb"><nav id="pjuwb"><dl id="pjuwb"><strong id="pjuwb"></strong></dl></nav></strike><tbody id="pjuwb"><b id="pjuwb"><optgroup id="pjuwb"><rp id="pjuwb"></rp></optgroup></b></tbody><em id="pjuwb"></em><xmp id="pjuwb"><blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote></xmp> <i id="pjuwb"><abbr id="pjuwb"><i id="pjuwb"><abbr id="pjuwb"></abbr></i></abbr></i><center id="pjuwb"><acronym id="pjuwb"><center id="pjuwb"></center></acronym></center><pre id="pjuwb"></pre><ul id="pjuwb"><thead id="pjuwb"></thead></ul><blockquote id="pjuwb"><pre id="pjuwb"><sup id="pjuwb"></sup></pre></blockquote><acronym id="pjuwb"></acronym><big id="pjuwb"><s id="pjuwb"></s></big><th id="pjuwb"></th><th id="pjuwb"></th><tbody id="pjuwb"></tbody><thead id="pjuwb"><strike id="pjuwb"></strike></thead><th id="pjuwb"><dl id="pjuwb"><wbr id="pjuwb"></wbr></dl></th><dl id="pjuwb"><strong id="pjuwb"></strong></dl><abbr id="pjuwb"><noframes id="pjuwb"><noscript id="pjuwb"></noscript></noframes></abbr><td id="pjuwb"><ol id="pjuwb"></ol></td><li id="pjuwb"><noscript id="pjuwb"><abbr id="pjuwb"></abbr></noscript></li><small id="pjuwb"><bdo id="pjuwb"><nav id="pjuwb"></nav></bdo></small><style id="pjuwb"></style><optgroup id="pjuwb"><table id="pjuwb"></table></optgroup><center id="pjuwb"><tr id="pjuwb"><dfn id="pjuwb"></dfn></tr></center><th id="pjuwb"></th><u id="pjuwb"></u><tfoot id="pjuwb"><legend id="pjuwb"><i id="pjuwb"></i></legend></tfoot><mark id="pjuwb"></mark><meter id="pjuwb"></meter><nav id="pjuwb"></nav><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><nobr id="pjuwb"></nobr><sub id="pjuwb"><th id="pjuwb"><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem></th></sub><thead id="pjuwb"><sub id="pjuwb"></sub></thead><ul id="pjuwb"><address id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></address></ul><dfn id="pjuwb"></dfn><pre id="pjuwb"></pre><input id="pjuwb"><cite id="pjuwb"><fieldset id="pjuwb"></fieldset></cite></input><u id="pjuwb"><form id="pjuwb"><u id="pjuwb"></u></form></u><kbd id="pjuwb"><em id="pjuwb"><mark id="pjuwb"></mark></em></kbd><tr id="pjuwb"></tr><del id="pjuwb"><form id="pjuwb"><address id="pjuwb"></address></form></del><tfoot id="pjuwb"><legend id="pjuwb"><ol id="pjuwb"><dl id="pjuwb"></dl></ol></legend></tfoot><menu id="pjuwb"><nobr id="pjuwb"><th id="pjuwb"><nobr id="pjuwb"></nobr></th></nobr></menu><fieldset id="pjuwb"></fieldset><pre id="pjuwb"><blockquote id="pjuwb"><samp id="pjuwb"></samp></blockquote></pre><xmp id="pjuwb"><sup id="pjuwb"><pre id="pjuwb"></pre></sup></xmp><span id="pjuwb"><progress id="pjuwb"></progress></span><font id="pjuwb"></font><var id="pjuwb"><abbr id="pjuwb"></abbr></var><strong id="pjuwb"><label id="pjuwb"><i id="pjuwb"><legend id="pjuwb"></legend></i></label></strong><tr id="pjuwb"><em id="pjuwb"><em id="pjuwb"><output id="pjuwb"></output></em></em></tr><thead id="pjuwb"><strike id="pjuwb"></strike></thead> <acronym id="pjuwb"></acronym><i id="pjuwb"></i><tt id="pjuwb"></tt><rt id="pjuwb"><source id="pjuwb"><rt id="pjuwb"></rt></source></rt><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike><del id="pjuwb"></del><font id="pjuwb"><output id="pjuwb"><ins id="pjuwb"><output id="pjuwb"></output></ins></output></font><kbd id="pjuwb"><tr id="pjuwb"><kbd id="pjuwb"></kbd></tr></kbd><pre id="pjuwb"><sup id="pjuwb"><delect id="pjuwb"><samp id="pjuwb"></samp></delect></sup></pre><samp id="pjuwb"></samp><track id="pjuwb"></track><tr id="pjuwb"></tr><center id="pjuwb"></center><fieldset id="pjuwb"></fieldset><i id="pjuwb"></i><td id="pjuwb"></td><rt id="pjuwb"></rt><object id="pjuwb"></object><pre id="pjuwb"><progress id="pjuwb"><sub id="pjuwb"><thead id="pjuwb"></thead></sub></progress></pre><kbd id="pjuwb"><tr id="pjuwb"><option id="pjuwb"></option></tr></kbd><output id="pjuwb"><ins id="pjuwb"></ins></output><ol id="pjuwb"></ol><source id="pjuwb"></source><strong id="pjuwb"></strong><ruby id="pjuwb"></ruby><sub id="pjuwb"><meter id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></meter></sub><pre id="pjuwb"></pre><center id="pjuwb"></center><tr id="pjuwb"><tbody id="pjuwb"><xmp id="pjuwb"><dd id="pjuwb"></dd></xmp></tbody></tr><video id="pjuwb"></video><pre id="pjuwb"></pre><form id="pjuwb"><optgroup id="pjuwb"></optgroup></form><samp id="pjuwb"></samp><kbd id="pjuwb"></kbd><strong id="pjuwb"><option id="pjuwb"></option></strong><object id="pjuwb"></object><abbr id="pjuwb"><noframes id="pjuwb"><abbr id="pjuwb"></abbr></noframes></abbr><ul id="pjuwb"><del id="pjuwb"><button id="pjuwb"><pre id="pjuwb"></pre></button></del></ul><abbr id="pjuwb"></abbr><strong id="pjuwb"><code id="pjuwb"><strong id="pjuwb"></strong></code></strong><option id="pjuwb"></option><optgroup id="pjuwb"><bdo id="pjuwb"><code id="pjuwb"></code></bdo></optgroup><mark id="pjuwb"><em id="pjuwb"><font id="pjuwb"></font></em></mark><acronym id="pjuwb"><code id="pjuwb"></code></acronym><dl id="pjuwb"></dl><em id="pjuwb"></em><object id="pjuwb"><input id="pjuwb"><object id="pjuwb"></object></input></object><output id="pjuwb"><dd id="pjuwb"></dd></output><option id="pjuwb"><button id="pjuwb"><option id="pjuwb"></option></button></option><small id="pjuwb"></small></div> <a href="http://nxhjzddata.com" target="_blank">欧美精品日韩三级</a>| <a href="http://seo8138.com" target="_blank">亚洲美女精品久久</a>| <a href="http://bjayj.com" target="_blank">欧美国产日韩精品</a>| <a href="http://y65c.com" target="_blank">免播放器亚洲一区</a>| <a href="http://www47067.com" target="_blank">久久综合狠狠综合久久综青草 </a>| <a href="http://987gqb.com" target="_blank">久久久久久穴</a>| <a href="http://236664.com" target="_blank">麻豆久久婷婷</a>| <a href="http://youjizzbox.com" target="_blank">亚洲高清视频一区</a>| <a href="http://qdzhudai.com" target="_blank">亚洲第一区在线观看</a>| <a href="http://133255.com" target="_blank">一本色道久久综合狠狠躁篇的优点 </a>| <a href="http://goldteddy.com" target="_blank">久久综合色婷婷</a>| <a href="http://jlkcjz.com" target="_blank">欧美人牲a欧美精品</a>| <a href="http://www18889.com" target="_blank">国产精品久久一区二区三区</a>| <a href="http://48655aa.com" target="_blank">国产一区久久</a>| <a href="http://sauske.com" target="_blank">亚洲精品在线一区二区</a>| <a href="http://9876666.com" target="_blank">亚洲欧美国产另类</a>| <a href="http://017455.com" target="_blank">免费久久99精品国产</a>| <a href="http://jyboke.com" target="_blank">日韩一级黄色片</a>| <a href="http://48655aa.com" target="_blank">久久精品2019中文字幕</a>| <a href="http://13751144594.com" target="_blank">欧美日韩国产免费</a>| <a href="http://96ykm.com" target="_blank">尤物99国产成人精品视频</a>| <a href="http://http456446.com" target="_blank">99re6这里只有精品</a>| <a href="http://cnxwlm.com" target="_blank">欧美一区二区三区四区在线</a>| <a href="http://zhongqingshiye.com" target="_blank">久久综合影视</a>| <a href="http://ww4477.com" target="_blank">亚洲一区二区三区乱码aⅴ</a>| <a href="http://8880850.com" target="_blank">久久婷婷国产麻豆91天堂</a>| <a href="http://wwwsenvpu.com" target="_blank">欧美日韩一区二区三区免费</a>| <a href="http://rezel-zj.com" target="_blank">狠狠爱综合网</a>| <a href="http://luqintang.com" target="_blank">亚洲综合电影</a>| <a href="http://5588207.com" target="_blank">亚洲国产天堂久久国产91</a>| <a href="http://21bridal.com" target="_blank">亚洲综合视频在线</a>| <a href="http://www8888803.com" target="_blank">欧美精品二区</a>| <a href="http://www227ee.com" target="_blank">亚洲国产成人一区</a>| <a href="http://bcjianyan.com" target="_blank">久久久久久久高潮</a>| <a href="http://977mo.com" target="_blank">在线亚洲电影</a>| <a href="http://402626com.com" target="_blank">欧美激情日韩</a>| <a href="http://www930666.com" target="_blank">亚洲高清三级视频</a>| <a href="http://shanghaijiagu.com" target="_blank">久久av在线看</a>| <a href="http://1194123.com" target="_blank">亚洲一区二区免费视频</a>| <a href="http://booyitech.com" target="_blank">欧美精品一区二区久久婷婷</a>| <a href="http://www789yys.com" target="_blank">国内偷自视频区视频综合</a>| <a href="http://521531.com" target="_blank">亚洲综合大片69999</a>| <a href="http://xmzszx.com" target="_blank">亚洲欧洲免费视频</a>| <a href="http://xp1025.com" target="_blank">美女啪啪无遮挡免费久久网站</a>| <a href="http://xissy.com" target="_blank">国产欧美精品久久</a>| <a href="http://vpay1314.com" target="_blank">亚洲伊人久久综合</a>| <a href="http://wwwavtb1122.com" target="_blank">亚洲精品欧美</a>| <a href="http://by5130.com" target="_blank">欧美精品在线视频</a>| <a href="http://118017.com" target="_blank">亚洲精品国久久99热</a>| <a href="http://7sscc.com" target="_blank">女人天堂亚洲aⅴ在线观看</a>| <a href="http://850cn.com" target="_blank">欧美一区二区视频在线观看</a>| <a href="http://ndr666.com" target="_blank">欧美三级欧美一级</a>| <a href="http://8xn66w.com" target="_blank">久久精品理论片</a>| <a href="http://mmmm43.com" target="_blank">欧美日韩一区二区欧美激情</a>| <a href="http://kk8586.com" target="_blank">亚洲精品看片</a>| <a href="http://4008166177.com" target="_blank">欧美激情一区二区久久久</a>| <a href="http://www033459.com" target="_blank">欧美一区亚洲一区</a>| <a href="http://qkspvip.com" target="_blank">国产手机视频一区二区</a>| <a href="http://saobi6.com" target="_blank">亚洲欧美中文日韩v在线观看</a>| <a href="http://cp88966.com" target="_blank">亚洲欧洲日本专区</a>| <a href="http://959425.com" target="_blank">欧美日韩成人在线</a>| <a href="http://o6186.com" target="_blank">亚洲一区二区三区免费观看</a>| <a href="http://bjmrkj.com" target="_blank">夜色激情一区二区</a>| <a href="http://shenduzhongcao.com" target="_blank">国产精品盗摄一区二区三区</a>| <a href="http://sxhrsmjj.com" target="_blank">亚洲自拍偷拍麻豆</a>| <a href="http://5110010.com" target="_blank">亚洲欧美激情一区二区</a>| <a href="http://7776701.com" target="_blank">国产亚洲精品高潮</a>| <a href="http://chaoporn97.com" target="_blank">美日韩精品视频</a>| <a href="http://wwwavtb1122.com" target="_blank">久久综合五月</a>| <a href="http://www-kj8777.com" target="_blank">99精品视频免费全部在线</a>| <a href="http://lgcpvip888.com" target="_blank">日韩视频在线观看一区二区</a>| <a href="http://6661639.com" target="_blank">国产精品v日韩精品v欧美精品网站</a>| <a href="http://7485888.com" target="_blank">亚洲午夜一区二区</a>| <a href="http://456dv.com" target="_blank">先锋影音网一区二区</a>| <a href="http://highfivewe.com" target="_blank">国内外成人在线</a>| <a href="http://y8e8.com" target="_blank">免费成人高清视频</a>| <a href="http://0370city.com" target="_blank">欧美精品成人在线</a>| <a href="http://7555hh.com" target="_blank">午夜在线a亚洲v天堂网2018</a>| <a href="http://211186.com" target="_blank">午夜视频在线观看一区二区三区</a>| <a href="http://dy25777.com" target="_blank">狠狠色丁香久久婷婷综合丁香</a>| <a href="http://3333347.com" target="_blank">两个人的视频www国产精品</a>| <a href="http://340332.com" target="_blank">巨乳诱惑日韩免费av</a>| <a href="http://hengbang50.com" target="_blank">一本久道久久综合婷婷鲸鱼</a>| <a href="http://bocfdj.com" target="_blank">亚洲视频网站在线观看</a>| <a href="http://www1126v.com" target="_blank">国产揄拍国内精品对白</a>| <a href="http://dracotek.com" target="_blank">亚洲电影第1页</a>| <a href="http://1369080.com" target="_blank">国产精品福利影院</a>| <a href="http://66636by.com" target="_blank">久久欧美中文字幕</a>| <a href="http://www633998.com" target="_blank">欧美国产精品人人做人人爱</a>| <a href="http://305838.com" target="_blank">午夜在线电影亚洲一区</a>| <a href="http://55555549.com" target="_blank">久久一区二区三区四区</a>| <a href="http://www559955.com" target="_blank">亚洲小少妇裸体bbw</a>| <a href="http://guanghezixun.com" target="_blank">欧美在线免费观看视频</a>| <a href="http://pgpg520.com" target="_blank">99国产精品久久久</a>| <a href="http://topjavhd.com" target="_blank">久久爱另类一区二区小说</a>| <a href="http://660507jj.com" target="_blank">a4yy欧美一区二区三区</a>| <a href="http://av0333.com" target="_blank">久久黄色影院</a>| <a href="http://www52y.com" target="_blank">中日韩高清电影网</a>| <a href="http://yye321.com" target="_blank">久久久蜜桃一区二区人</a>| <a href="http://www-787333.com" target="_blank">亚洲午夜高清视频</a>| <a href="http://xingcheny.com" target="_blank">另类图片国产</a>| <a href="http://llyx888.com" target="_blank">久久精品一区蜜桃臀影院 </a>| <a href="http://520637.com" target="_blank">欧美在线首页</a>| <a href="http://www-00468.com" target="_blank">欧美高清在线</a>| <a href="http://com42923.com" target="_blank">看片网站欧美日韩</a>| <a href="http://012928.com" target="_blank">国产精品日韩欧美综合</a>| <a href="http://19zet.com" target="_blank">亚洲片区在线</a>| <a href="http://gdvapar.com" target="_blank">亚洲第一中文字幕在线观看</a>| <a href="http://jiyixitong.com" target="_blank">亚洲综合精品自拍</a>| <a href="http://saobitv.com" target="_blank">亚洲视频在线播放</a>| <a href="http://lctongda.com" target="_blank">欧美大色视频</a>| <a href="http://ttdy20.com" target="_blank">欧美国产视频一区二区</a>| <a href="http://660507jj.com" target="_blank">99精品热视频只有精品10</a>| <a href="http://2938476.com" target="_blank">在线视频你懂得一区二区三区</a>| <a href="http://hakuihoso.com" target="_blank">国产日韩一区二区三区在线播放 </a>| <a href="http://428820.com" target="_blank">亚洲午夜免费视频</a>| <a href="http://2387463.com" target="_blank">最新成人在线</a>| <a href="http://66jj99.com" target="_blank">久久精品国产精品亚洲</a>| <a href="http://y77778.com" target="_blank">欧美一区二区免费视频</a>| <a href="http://bocai4488.com" target="_blank">欧美视频精品在线</a>| <a href="http://www-kkjj88.com" target="_blank">亚洲精品久久</a>| <a href="http://ganmabook.com" target="_blank">亚洲精品日韩精品</a>| <a href="http://www25sds.com" target="_blank">免费在线成人av</a>| <a href="http://jzsp101.com" target="_blank">女同性一区二区三区人了人一</a>| <a href="http://leohacks.com" target="_blank">国产欧美日韩在线播放</a>| <a href="http://6399128.com" target="_blank">亚洲一区二区三区精品动漫</a>| <a href="http://77smsm.com" target="_blank">亚洲午夜视频在线观看</a>| <a href="http://zb557.com" target="_blank">欧美日韩一区二区在线</a>| <a href="http://889644.com" target="_blank">亚洲美女精品久久</a>| <a href="http://fobdoer.com" target="_blank">99精品国产在热久久</a>| <a href="http://www-452.com" target="_blank">男男成人高潮片免费网站</a>| <a href="http://798814.com" target="_blank">免费欧美日韩国产三级电影</a>| <a href="http://0934photo.com" target="_blank">国产综合久久久久久鬼色</a>| <a href="http://96ykm.com" target="_blank">欧美一区二区三区日韩视频</a>| <a href="http://vpay1314.com" target="_blank">欧美在线视频播放</a>| <a href="http://bjmrkj.com" target="_blank">国产精品资源在线观看</a>| <a href="http://569688.com" target="_blank">午夜欧美视频</a>| <a href="http://daqinhkvip.com" target="_blank">久久婷婷久久一区二区三区</a>| <a href="http://www92444.com" target="_blank">好吊一区二区三区</a>| <a href="http://anal-movie-teen.com" target="_blank">久久久久久久综合</a>| <a href="http://kk8586.com" target="_blank">欧美激情网友自拍</a>| <a href="http://4tobi.com" target="_blank">日韩视频亚洲视频</a>| <a href="http://fdgkinetic.com" target="_blank">欧美日韩你懂的</a>| <a href="http://wwwxigua66.com" target="_blank">亚洲一区精彩视频</a>| <a href="http://www-188444.com" target="_blank">久久精品91</a>| <a href="http://hlyjh.com" target="_blank">影音先锋国产精品</a>| <a href="http://244223.com" target="_blank">欧美不卡一区</a>| <a href="http://szzzzzzz.com" target="_blank">99香蕉国产精品偷在线观看</a>| <a href="http://gaobb52.com" target="_blank">亚洲尤物精选</a>| <a href="http://bgflee.com" target="_blank">国产一在线精品一区在线观看</a>| <a href="http://by4433.com" target="_blank">欧美在线综合</a>| <a href="http://wwwavzz.com" target="_blank">欧美激情第六页</a>| <a href="http://138268.com" target="_blank">这里只有精品视频在线</a>| <a href="http://www-440450.com" target="_blank">国产精品亚洲成人</a>| <a href="http://jivbus.com" target="_blank">久久久久久久久久久成人</a>| <a href="http://yw3329.com" target="_blank">你懂的国产精品</a>| <a href="http://www433ad.com" target="_blank">99亚洲一区二区</a>| <a href="http://977dy.com" target="_blank">国产欧美日韩91</a>| <a href="http://621765.com" target="_blank">久久久久久亚洲精品中文字幕</a>| <a href="http://www-77537.com" target="_blank">欧美第一黄色网</a>| <a href="http://8004006.com" target="_blank">亚洲一区欧美</a>| <a href="http://wallypanel.com" target="_blank">今天的高清视频免费播放成人</a>| <a href="http://thisisfil.com" target="_blank">欧美不卡视频一区</a>| <a href="http://5s5s5s.com" target="_blank">亚洲综合精品四区</a>| <a href="http://qdzhudai.com" target="_blank">欧美韩国日本一区</a>| <a href="http://343119.com" target="_blank">亚洲欧美国产制服动漫</a>| <a href="http://anal-movie-teen.com" target="_blank">国产综合色产在线精品</a>| <a href="http://hnjlhgw.com" target="_blank">欧美高清免费</a>| <a href="http://66jj99.com" target="_blank">欧美在线观看一区二区</a>| <a href="http://dddd30.com" target="_blank">亚洲精选国产</a>| <a href="http://cp3824.com" target="_blank">美国成人毛片</a>| <a href="http://1194123.com" target="_blank">性欧美大战久久久久久久免费观看 </a>| <a href="http://syntheticnets.com" target="_blank">亚洲风情亚aⅴ在线发布</a>| <a href="http://www5909.com" target="_blank">亚洲图片欧洲图片日韩av</a>| <a href="http://zhhtianyi.com" target="_blank">国产一区999</a>| <a href="http://xprinter3d.com" target="_blank">欧美日韩午夜剧场</a>| <a href="http://7redy.com" target="_blank">久久久久99</a>| <a href="http://saohu79.com" target="_blank">午夜亚洲激情</a>| <a href="http://mmpzyw.com" target="_blank">欧美午夜久久久</a>| <a href="http://henhenai1.com" target="_blank">欧美在线视频在线播放完整版免费观看</a>| <a href="http://k91cm.com" target="_blank">久热精品视频在线免费观看</a>| <a href="http://ythbhg.com" target="_blank">99国产精品久久久久久久成人热</a>| <a href="http://74w4.com" target="_blank">国产视频精品xxxx</a>| <a href="http://caofujia.com" target="_blank">欧美视频在线观看免费网址</a>| <a href="http://428368.com" target="_blank">久久夜色精品国产亚洲aⅴ</a>| <a href="http://251aaa.com" target="_blank">亚洲伊人观看</a>| <a href="http://92y5.com" target="_blank">在线一区免费观看</a>| <a href="http://05511253.com" target="_blank">亚洲国产成人在线播放</a>| <a href="http://278263.com" target="_blank">欧美在线一二三四区</a>| <a href="http://www-72794.com" target="_blank">亚洲视频综合</a>| <a href="http://chunhuigk.com" target="_blank">亚洲国产日韩欧美在线动漫</a>| <a href="http://mm-777.com" target="_blank">国产精品一二三四区</a>| <a href="http://yx3369.com" target="_blank">欧美日韩亚洲三区</a>| <a href="http://53xxxx.com" target="_blank">欧美成人高清</a>| <a href="http://710195.com" target="_blank">久久婷婷国产麻豆91天堂</a>| <a href="http://by3787.com" target="_blank">欧美一区=区</a>| <a href="http://shiyoudiban.com" target="_blank">亚洲欧美99</a>| <a href="http://114mz.com" target="_blank">亚洲在线网站</a>| <a href="http://sz-jyqj.com" target="_blank">亚洲一区中文</a>| <a href="http://aa224.com" target="_blank">亚洲欧美日韩一区</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>