锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
鎵浠ヨ閲嶈澆PreTranslateMessage,浠g爜濡備笅
BOOL CMyWnd::PreTranslateMessage(MSG* pMsg)
{
m_toolTip.RelayEvent(pMsg);
return CGameWnd::PreTranslateMessage(pMsg);
}
浣嗘槸鐢變簬CMyWnd鏄湪DLL涓紝鎵浠ラ噸杞絇reTranslateMessage鏃犳晥錛?br>鍏蜂綋鍘熷洜鎴戝繕璁頒簡錛屽弽姝g綉涓婇兘鍙互鎼滅儲鍒般備笉榪囪В鍐蟲柟妗堥兘緇欑殑
涓嶆槸寰堟槑紜紝鍦ㄨ繖閲屾垜鎶婃垜鐨勮В鍐蟲柟娉曡褰曚笅鏉ワ紝鐪佸緱浠ュ悗蹇樻帀浜嗐?br>涓昏鏄湪鍒涘緩CMyWnd瀹炰緥鐨勬椂鍊欐妸紿楀彛鎸囬拡瀛樹笅鏉ワ紝鐒跺悗浣跨敤鍏ㄥ眬
娑堟伅閽╁瓙鎵цCMyWnd::PreTranslateMessage錛屼唬鐮佸涓?/p>
1.瀹氫箟鍏ㄥ眬鍙橀噺
HHOOK g_hHook = 0;
CMyWnd* g_pMyWnd = NULL;
2.瀹夎鍏ㄥ眬閽╁瓙錛岃鍦―LL涓畨瑁?br> g_hHook = ::SetWindowsHookEx(WH_GETMESSAGE, HookProc, 0, ::GetCurrentThreadId());
3.鍒涘緩紿椾綋鐨勬椂鍊欎繚鐣欐寚閽?br> m_pMyWnd = new CMyWnd();
g_pMyWnd = m_pMyWnd;
4.閽╁瓙鍑芥暟
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
MSG* pMsg = (MSG*)lParam;
if(g_pMyWnd && (pMsg->hwnd == g_pMyWnd->m_hWnd))
{
g_pMyWnd->PreTranslateMessage(pMsg);
}
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
5.閫鍑虹殑鏃跺欏埆蹇樹簡鍗歌澆閽╁瓙
if(g_hHook)
UnhookWindowsHookEx(g_hHook);
紼嬪簭涓渶瑕佹敞鎰忕殑鍦版柟錛岄噴鏀炬爲緇撶偣鐨勬椂鍊欙紝瑕佷嬌鐢ㄥ悗緇亶鍘嗭紝鍏堥噴鏀懼瓙緇撶偣鍚庢墠閲婃斁鏍圭粨鐐廣?/p>

/**//* -------------------------------------------------------------------------
// 鏂囦歡鍚?nbsp; 錛?nbsp;binarytree.h
// 鍒涘緩鑰?nbsp; 錛?nbsp; dj
// 鍒涘緩鏃墮棿 錛?nbsp;2008-1-1
// 鍔熻兘鎻忚堪 錛?nbsp;浜屽弶鎺掑簭鏍?br>
// -----------------------------------------------------------------------*/
#ifndef __BINARYTREE_H__
#define __BINARYTREE_H__
#define SAFE_DELETE(p) {if(p) { delete [] (p); (p) = NULL;}}
struct TreeNode

{
TreeNode(const char* s):
counter(1), left(NULL), right(NULL)
{
name = new char[strlen(s)+1];
strcpy(name, s);
}
~TreeNode()
{
SAFE_DELETE(name);
}
char* name;
int counter;
TreeNode* left;
TreeNode* right;
};
class BinaryTree

{
public:
BinaryTree():m_pRoot(NULL)
{}
~BinaryTree()
{
FreeTree(m_pRoot);
}
void Lookup(const char* sName)
{
TreeNode** p = &m_pRoot;
while(*p)
{
int cmp = strcmp(sName, (*p)->name);
if (cmp<0)
p = &((*p)->left);
else if (cmp>0)
p = &((*p)->right);
else //found the word
{
((*p)->counter)++; //increase the counter
return;
}
}
// not found, then add the word node.
TreeNode* pNode = new TreeNode(sName);
*p = pNode;
}
void Dump(const char* sFile)
{
ofstream f(sFile);
Travel(m_pRoot, f);
f.close();
}
private:
void Travel(TreeNode* pNode, ofstream& f)
{
if (!pNode)
return;
Travel(pNode->left, f);
f<<pNode->name<<" "<<pNode->counter<<endl;
Travel(pNode->right, f);
}
void FreeTree(TreeNode* pNode)
{
if(!pNode)
return;
FreeTree(pNode->left);
FreeTree(pNode->right);
delete pNode;
}
private:
TreeNode* m_pRoot;
};
#endif //__BINARYTREE_H__
int main(int argc, char* argv[])

{
BinaryTree tree;
ifstream f("c:\\ip.txt");
string s;
while(f>>s)
{
tree.Lookup(s.c_str());
}
tree.Dump("c:\\stat.txt");
return 0;
}
template<typename T>
int binarysearch(const T* tab, int ntab, const T& value)

{
int low = 0;
int high = ntab;
while(low <= high)
{
int mid = (low+high)/2;
if(value<tab[mid])
high = mid - 1;
else if (value>tab[mid])
low = mid + 1;
else
return mid;
}
return -1;
}
int main(int argc, char* argv[])

{
int a[] =
{2, 4, 6, 7, 8, 9, 13};
int aa = sizeof(a);
int n = binarysearch(a, sizeof(a)/sizeof(a[0]), 4);
cout<<n<<endl;
return 0;
}鍏朵腑瀵繪壘鏀偣鍏冪礌pivot鏈夊縐嶆柟娉曪紝涓嶅悓鐨勬柟娉曚細瀵艱嚧蹇熸帓搴忕殑涓嶅悓鎬ц兘銆傛牴鎹垎娌繪硶騫寵 瀛愰棶棰樼殑鎬濇兂錛屽笇鏈涙敮鐐瑰厓绱犲彲浠ヤ嬌p[m..n]灝介噺騫沖潎鍦板垎涓轟袱閮ㄥ垎錛屼絾瀹為檯涓婂緢闅懼仛鍒般備笅闈㈢粰鍑哄嚑縐嶅鎵緋ivot鐨勬柟娉曘?/p>
1.閫夋嫨p[m..n]鐨勭涓涓厓绱爌[m]鐨勫間綔涓簆ivot錛?
2.閫夋嫨p[m..n]鐨勬渶鍚庝竴涓厓绱爌[n]鐨勫間綔涓簆ivot錛?
3.閫夋嫨p[m..n]涓棿浣嶇疆鐨勫厓绱爌[k]鐨勫間綔涓簆ivot錛?
4.閫夋嫨p[m..n]鐨勬煇涓涓殢鏈轟綅緗笂鐨勫紁[random(n-m)+m]鐨勫間綔涓簆ivot錛?
銆銆鎸夌収絎?縐嶆柟娉曢殢鏈洪夋嫨pivot鐨勫揩閫熸帓搴忔硶鍙堢О闅忔満鍖栫増鏈殑蹇熸帓搴忔硶錛屽湪瀹為檯搴旂敤涓鏂規硶鐨勬ц兘涔熸槸鏈濂界殑銆傛湰紼嬪簭浣跨敤絎?縐嶆柟娉曘傝姹傝妭鐐圭被鍨嬫敮鎸佹瘮杈冭繍綆楃銆?/p>
template<typename T>
void quicksort(T* v, int n)

{
if (n<=1)
return;
int last = 0;
int pivot = rand()%n;
swap(v, 0, pivot);
for (int i = 1; i < n; i++)
{
if (v[i]<v[0])
swap(v, ++last, i);
}
swap(v, last, 0);
quicksort(v, last);
quicksort(v+last+1, n-last-1);
}
template<typename T>
void swap(T* v, int i, int j)

{
T tmp = v[i];
v[i] = v[j];
v[j] = tmp;
}

struct str

{
str(const char* a)
{
assert(a);
v = new char[strlen(a)+1];
strcpy(v, a);
}
str(const str& a)
{
assert(a.v);
v = new char[strlen(a.v)+1];
strcpy(v, a.v);
}
~str()
{
delete [] v;
}
void operator = (const str& a)
{
if (this == &a)
return;
assert(a.v);
delete [] v;
v = new char[strlen(a.v)+1];
strcpy(v, a.v);
}
bool operator == (const str& a) const
{
return (strcmp(v, a.v)==0);
}
bool operator > (const str& a) const 
{
return (strcmp(v, a.v)>0);
}
bool operator < (const str& a) const
{
return (strcmp(v, a.v)<0);
}
char* v;
};

int main(int argc, char* argv[])

{
int* array = new int [10];
for(int i = 0; i < 10; i++)
array[i] = rand();
quicksort(array, 10);
for(i = 0; i < 10; i++)
{
cout<<array[i]<<endl;
}

str s[] =
{"bd", "e", "ba", "a"};
quicksort(s, 4);
for(i = 0; i < 4; i++)
{
cout<<s[i].v<<endl;
}
return 0;
}2錛氫笉鏀瑰彉鎴愬憳鍙橀噺鍊肩殑鍑芥暟錛屼緥濡俥mpty()錛岃澹版槑涓篶onst,榪欑偣寰堥噸瑕侊紝涓嶇劧褰撲竴涓猚onst mystack&綾誨瀷鐨勫璞¤皟鐢╡mpty()鐨勬椂鍊欙紝浼氱紪涓嶈繃銆?/p>
3錛氭嫹璐濇瀯閫犲嚱鏁版渶濂借鍏堝垽鏂槸鍚︽槸鎷瘋礉鑷韓錛屼笉鐒舵湁鏃跺欏氨鍑洪敊銆?/p>
4錛氭嫹璐濇瀯閫犲嚱鏁頒篃鍒繕浜嗘垚鍛樺彉閲忓垵濮嬪寲鍒楄〃銆?nbsp;
template<typename T>
class mystack

{
public:
mystack();
mystack(const mystack& src);
~mystack();
bool push(const T& data);
T pop();
bool empty() const;
void clear();
mystack& operator = (const mystack& src);
private:
void copystack(mystack& dst, const mystack& src);
struct stacknode
{
T data;
stacknode* pnext;
};
stacknode* phead;
};
template<typename T>
mystack<T>::mystack():phead(NULL)

{}
template<typename T>
mystack<T>::mystack(const mystack<T>& src):
phead(NULL)

{
copystack(*this, src);
}
template<typename T>
mystack<T>::~mystack()

{
clear();
}
template<typename T>
void mystack<T>::clear()

{
while(!empty())
{
pop();
}
}
template<typename T>
void mystack<T>::copystack(mystack& dst, const mystack& src)

{
stacknode* p = src.phead;
mystack<T> tmp;
while(p)
{
tmp.push(p->data);
p = p->pnext;
}
while(!tmp.empty())
{
dst.push(tmp.pop());
}
}
template<typename T>
mystack<T>& mystack<T>::operator=(const mystack& src)

{
if (this == &src)
return *this;
clear();
copystack(*this, src);
return *this;
}
template<typename T>
bool mystack<T>::empty() const 

{
return(phead == NULL);
}
template<typename T>
bool mystack<T>::push(const T& data)

{
stacknode* p = new stacknode;
if (!p) return false;
p->data = data;
p->pnext = phead;
phead = p;
return true;
}
template<typename T>
T mystack<T>::pop()

{
assert(!empty());
T data;
data = phead->data;
stacknode* tmp = phead;
phead = phead->pnext;
delete tmp;
return data;
}
int main(int argc, char* argv[])

{
mystack<int> s;
for (int i = 0; i < 1000; i++)
s.push(rand());
mystack<int> s2(s);
while(!s2.empty())
{
cout<<s2.pop()<<endl;
}
return 0;
}