程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 用ATL開發復合控件

用ATL開發復合控件

編輯:關於VC++

本文講述了如何用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),並在實現中添加相關處理代碼。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved