本文講述了如何用ATL建立復合控件,以及如何響應連接點事件。考慮到代碼很簡單,程序中沒有加注釋,如有不清楚請參看MSDN,代碼倉促中完成,不免有疏漏,見諒。
聲明:本文僅適合初級中的初級讀者。
步驟一:建立ATL項目,取名為AtlSample
步驟二:選擇默認選項,點擊Finish
步驟三:插入復合控件,名稱為AtlComp,選擇支持錯誤信息,支持連接點。
步驟四:在對話框模板上添加列表控件和進度條控件。在AtlComp.h中添加頭文件#include <CommCtrl.h>
在類中添加私有成員變量:
private:
HIMAGELIST m_hImlIcons;
HWND m_hListCtrl;
步驟五:添加WM_INITDIALG消息響應事件,並在事件處理函數中添加如下代碼:
SendDlgItemMessage(IDC_PROGRESS1,PBM_SETBARCOLOR,0,(LPARAM)RGB(0,128,0));
SendDlgItemMessage(IDC_PROGRESS1,PBM_SETPOS,0,0);
m_hListCtrl = GetDlgItem(IDC_LIST1);
m_hImlIcons = ImageList_Create(16, 16, ILC_MASK | ILC_COLOR32, 2, 0);
HICON hicon; // handle to icon
hicon = LoadIcon(_Module.m_hInstResource,MAKEINTRESOURCE(IDI_ICON_LIST));
ImageList_AddIcon(m_hImlIcons,hicon);
ListView_SetImageList(m_hListCtrl,m_hImlIcons,LVSIL_SMALL);
ListView_SetExtendedListViewStyle(m_hListCtrl,LVS_EX_FULLROWSELECT);
//::GetWindowLong(m_hListCtrl,GWL_EXSTYLE | GWL_EXSTYLE) & LVS_EX_FULLROWSELECT);
LV_COLUMN lvCol;
lvCol.mask = LVCF_TEXT | LVCF_WIDTH;
lvCol.fmt = LVCFMT_LEFT;
lvCol.iSubItem = 0;
//添加表頭
lvCol.cx = 200;
lvCol.pszText = "文件名稱";
ListView_InsertColumn(m_hListCtrl,0,&lvCol);
lvCol.cx = 80;
lvCol.pszText = "文件大小";
ListView_InsertColumn(m_hListCtrl,1,&lvCol);
步驟六:添加WM_ DESTROY消息響應事件,並在事件處理函數中添加如下代碼:
ImageList_Destroy(m_hImlIcons);
步驟七:加入控件方法,名稱為Atl,參數為空,並在方法實現中添加如下代碼:ListView_DeleteAllItems(m_hListCtrl);
LVITEM lvItem;
lvItem.mask = LVIF_TEXT | LVIF_IMAGE;
lvItem.state = 0;
lvItem.iItem = 0;
lvItem.iSubItem = 0;
lvItem.pszText = "我愛VC.C++";
lvItem.iImage = 0;
ListView_InsertItem(m_hListCtrl, &lvItem);
ListView_SetItemText(m_hListCtrl,0,1,"1024");
SendDlgItemMessage(IDC_PROGRESS1,PBM_SETPOS,50,0);
步驟八:添加接口連接點AtlEven,參數為[in]long lState,[in]char * lpszInfo
步驟九:編譯AtlSample.idl文件
步驟十:實現連接點,並在Atl()方法開始處添加:Fire_AtlEven(0,"方法開始");
結尾處添加:
Fire_AtlEven(1,"方法結束");
步驟十一:建立測試程序TestAtlDlg。
在測試程序中接收連接點事件:
在頭文件中添加宏 DECLARE_EVENTSINK_MAP()
在實現文件中添加宏 BEGIN_EVENTSINK_MAP(CTestAtlDlg, CDialog)
ON_EVENT(CTestAtlDlg, IDC_ATLCOMP1, 1 /*
Atl */, OnAtlEvent, VTS_I4 VTS_BSTR) //step 2
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
建立事件函數OnAtlEvent(long state,char * buf),並在實現中添加相關處理代碼。
本文配套源碼