How to use CVSListBox – AppWizard

今天的任務是要做出下面這個控制項(控件),問題是這個到底是甚麼呢??

2014-08-29-01

不論是用以圖找圖、Editable List Ctrl、

mfc dialog edit with delete and select button…等等

各種排列組合就是沒辦法找到這個控件

最後只好把他的按鈕意思當作 keyword 全部打上去請 Google 幫忙

( mfc list new delete move up and down )

最後終於讓我找到一篇[1] 有介紹他的用法,原來是叫做 CVSListBox !!!!! (感動)

 

但是在找 CVSListBox 怎麼用的時候發現資料也不太多

反而是很多篇在討論使用 CVSListBox 之後產生 memory leak 的問題

下面就貼我是怎麼實作成功的和一些相關的參考資料

因為先後嘗試了單純使用 Visual Studio AppWizard 和整合到我的 project 中

基本上用法大同小異,所以就著重在介紹怎麼使用 Visual Studio AppWizard 囉

 

[實作過程-前置作業]

1. 打開 Visual Studio 2012 → 檔案 → 新增 → 專案

2. 選擇 MFC 應用程式 → 新增名稱 → 確定

2014-08-29-02

 

3. 直接按下一步

2014-08-29-03

 

4. 選擇對話方塊式後按完成

2014-08-29-04

 

5. 就會看到 Visual Studio 已經幫你開好一個 Dialog 視窗,和建立好相關的 .cpp/.h 檔了

 

[實作過程-layout 與程式碼]

1. 在工具列視窗中找到 MFC VSListBox Control,然後拉到 Dialog 中

2014-08-29-05

2014-08-29-06

 

2. 在 .h 檔以及 .cpp 檔中加入以下程式碼

CVSListBoxTestDlg.h

public:
	CVSListBox * m_pctlList;
	CWnd * CCVSListBoxTestDlg::GetMfcControl(int nId);

 

CVSListBoxTestDlg.cpp

BOOL CCVSListBoxTestDlg::OnInitDialog()
{
	CDialog::OnInitDialog();	

	// 在 CCVSListBoxTestDlg::OnInitDialog() 函示中加入以下程式碼
	m_pctlList = (CVSListBox *)GetMfcControl(IDC_MFCVSLISTBOX1);
	m_pctlList->SetStandardButtons();
	m_pctlList->SetWindowText(_T("Post build command(s)"));

	return true;
}

// 另外新增這個函式
CWnd * CCVSListBoxTestDlg::GetMfcControl(int nId)
{
    CMFCControlContainer* pMFCCtrlContainer = GetMFCControlContainer();
    if (pMFCCtrlContainer)
    {
        HWND hWndCtrl;
        GetDlgItem(nId, &hWndCtrl);
        if (hWndCtrl)
        {
            for (int i = 0; i < pMFCCtrlContainer->m_arSubclassedCtrls.GetCount(); i++)
            {
                CWnd* pWnd = (CWnd*)pMFCCtrlContainer->m_arSubclassedCtrls[i];
                if (pWnd->GetSafeHwnd() == hWndCtrl)
                    return pWnd;
            }
        }
    }
    return NULL;
}

 

3. 之後按下  本機 Windows 偵錯工具 (F5),就可以看到成功使用 CVSListBox 的畫面囉

2014-08-29-07

 

[參考資料]

1. Font, Shell and Masked Edit Controls for MFC

2. Memory leaks using CVSListBox