原创 MFC消息完成消息反射

BOOL CWnd::OnCommand(WPARAM wParam, LPARAM lParam) // return TRUE if command invocation was attempted { UINT nID = LO

原创 設置套接字爲非阻塞的方法

WSAAsyncSelect ioctlsocket WSAIoctl

原创 MFC窗口銷燬過程

假設自己通過new創建了一個窗口對象pWnd,然後pWnd->Create。則銷燬窗口的調用次序:   1. 手工調用pWnd->DestroyWindow();   2. DestroyWindow會發送WM_DESTROY;   3.

原创 WM_DRAWITEM消息處理流程

WM_DRAWITEM是一般的消息,如果一個按鈕設置了自繪,那麼他會給父窗口發送WM_DRAWITEM,父窗口找到消息處理函數 看源碼:   void CWnd::OnDrawItem(int /*nIDCtl*/, LPDRAWITEM

原创 typename和typedef關鍵字

typename指示一個類型名,而非定義一個類型,以下聲明瞭一個Seq::iterator類型的變量itr,其中Seq是一個模板實例化時才知道的類:    typename Seq::iterator itr;如果沒有typename指

原创 CRectTracker(橡皮筋)類的使用

CRectTracker(俗稱“橡皮筋”類)是一個非常有意思的類。你在Windows中,在桌面上用鼠標拖拽,便可以看到一個虛線的矩形框,它便是橡皮筋.它可以用做顯示邊界,你也可以扽它的八個角用來放大縮小,做框選使用。如何通過編程來實現這種

原创 對話框及其子控件的內部創建過程之詳細分析

創建非模態對話框時,首先程序最先開始調用CreateDialogIndirectParam函數來創建對話框  ,  在CreateDialogIndirectParam中調用CreateWindowEx函數創建對話框主框架, 這時 Cre

原创 Static控件的消息

如果Static控件設置了Notify消息的話,點擊Static控件或者在Static控件上移動的話,消息就是Static控件自己發送的,這時候也存在消息的反射。如果Static控件沒有設置了Notify消息的話,點擊Static控件或者

原创 Static成員變量的使用

#include <iostream> using namespace std; class enemytarget { public: enemytarget() { ++numtargets; } enemytar

原创 VS2008控制檯工程檢測內存泄露

#include <iostream> using namespace std; #ifdef _DEBUG #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LI

原创 recvfrom以及recv

recvfrom比recv多兩個參數的原因     recv是TCP的APIrecvfrom是UDP的API 多餘的兩個參數可以用來接收對端的地址信息,這個對於udp這種無連接的,可以很方便地進行回覆。而換過來如果你在udp當中也使用re

原创 控件子類化的兩種方式

1.  給控件關聯變量,修改類名 2.  定義一個成員變量,如CPassButton btn;       然後btn.SubclassDlgItem(IDC_BUTTON2, this);    IDC_BUTTON2是窗口的ID,第

原创 template的編譯和鏈接(源自深入淺出MFC)

  編譯器遇到一個template時,不能夠立即爲它產生機器代碼,它必須等待,直到template的完整定義將出現在template被使用的每一個角落。   Borland的Smart技術:   鏈接器會把贅餘的template代碼剔除

原创 MFC 程序逆向

上篇囉裏囉嗦地說了一大堆,其實所說的消息都是PostMessage方式的。MFC中還有另外一種很常見的消息發送方式,就是SendMessage函 數。這個消息起始路徑和上篇所講的完全不一樣。這種方式下,前面的7個站點均不執行,而是直接進入

原创 MFC多線程程序設計(源自深入淺出MFC)

一個進程的PDB通過一個"MODREF鏈表"連接到其所使用的所有模塊 一個線程的TDB裏面都放置了消息隊列只有UI線程的優先級會改變,Worker線程的優先級不會改變 線程上下文  當線程暫停的時候要求把CPU擁有權讓出來,以備將暫停之前