最早時(shí)候就曾經(jīng)哪里看到過說所有控件都是窗口(window),更有甚者說都是對(duì)象,這個(gè)就不扯了。自己做好的控件是做成Lib還是Dll那是后話,MFC我是不熟悉了,Win32還是看了幾天的。大致把制作的整個(gè)流程簡(jiǎn)要的記錄一下。
自己做的控件最主要的功能就是接受你發(fā)給他的命令,也就是要給外部調(diào)用的接口。控件有自己的消息處理函數(shù)比如
LRESULT CALLBACK PETextViewWndProc(HWND hWnd,UINT Message,WPARAM wParam,LPARAM lParam)


{
PETextView *View = (PETextView*)GetWindowLong(hWnd,0);

switch(Message)

{
case WM_NCCREATE:
if((View = new PETextView(hWnd)) == 0)
return false;

SetWindowLong(hWnd,0,(LONG)View);
return true;

case WM_NCDESTROY:
if(View)delete View;
return 0;

case WM_PAINT:
return View->OnPaint();

case WM_SIZE:
return View->OnSize(wParam, LOWORD(lParam), HIWORD(lParam));

case PEM_OPENFILE:
return View->OpenFile((TCHAR*)lParam);

case PEM_CLEAR:
return View->ClearFile();
default:
break;
}

return DefWindowProc(hWnd,Message,wParam,lParam);
}

這里有兩類消息,一類是系統(tǒng)定義的以WM開頭,一類是自己定義的,當(dāng)然隨便你自己定義啦。對(duì)應(yīng)的消息看到是調(diào)用相應(yīng)的函數(shù)完成的,這也就是說控件的行為就可以另外編寫邏輯部分,然后提供接口給這里調(diào)用即可。
之所以說控件就是窗口是因?yàn)樗凶约旱拇翱陬悾约俺跏蓟瘮?shù),同時(shí)也有創(chuàng)建的函數(shù)。窗口類的定義和注冊(cè)也做成提供給外部的接口,在外部必要的時(shí)候調(diào)用。而控制控件是通過發(fā)送消息來實(shí)現(xiàn)的,為了更加好看,可以定義一個(gè)宏,比如
#define PE_OpenFile(hWnd, Path) SendMessage((hWnd), PEM_OPENFILE, 0, (LPARAM)(Path))
那么創(chuàng)建窗口和控件唯一不同的地方就是,內(nèi)部的創(chuàng)建和銷毀消息是WM_NCCREATE和WM_NCDESTROY,先不管這兩個(gè)消息。我們看到WM_NCCREATE之前有個(gè)GetWindowLong,其內(nèi)有個(gè)SetWindowLong。這兩個(gè)是關(guān)鍵的,這樣就設(shè)置了這個(gè)控件的屬性,使其關(guān)聯(lián)起來,第二個(gè)參數(shù)msdn上是沒有說明設(shè)置為0是什么意思的,其實(shí)這兩個(gè)函數(shù)的第二個(gè)參數(shù)設(shè)置0表示讀取的意思,第一個(gè)是讀取該控件的屬性,然后第二個(gè)函數(shù)在增加第三個(gè)參數(shù)的屬性的同時(shí)讀取賦予給這個(gè)控件。
一切都OK了!那么控件創(chuàng)建可在外部的WM_CREATE之時(shí)調(diào)用,當(dāng)然也可以在使用其功能前調(diào)用即可。
一切提供給外部的調(diào)用都Port在一個(gè)頭文件中,這樣使用的時(shí)候包含這個(gè)頭文件就好了。
接下來解釋那兩個(gè)消息,這兩個(gè)消息是因?yàn)槲覀儎?chuàng)建了子窗口,也就是我們自己的控件。
這兩個(gè)消息與WM_CREATE,WM_DESTROY之間的順序關(guān)系是這樣的,只看銷毀吧。
hwnd = parent, uMsg = WM_DESTROY
hwnd = child, uMsg = WM_DESTROY
hwnd = child, uMsg = WM_NCDESTROY
hwnd = parent, uMsg = WM_NCDESTROY
WM_DESTROY是通知子窗口銷毀,然后子窗口通過接受WM_NCDESTROY進(jìn)行銷毀,并發(fā)送給父窗口,進(jìn)行銷毀。
細(xì)節(jié)部分介紹的差不多,總體思路就是和創(chuàng)建窗口差不多,但是要搞個(gè)頭文件,把一些個(gè)常量和功能的函數(shù)另外一個(gè)窗口類的初始化和創(chuàng)建的接口搞進(jìn)去。