How to use CVSListBox – Customize browse button

2014-10-01-07

上一篇 最後雖然成功的讓兩個 CVSListBox 都跑出了 OnBrowse() 的 … 按鈕

但事實上按下去是沒有反應的 =______=”

參考資料中的回應說

” The default implementation of the CVSListBox::OnBrowse method does nothing. ”

所以想要他有反應你得自己寫一個,(想來也是MFC怎麼會知道你到底要按鈕做什麼事咧)

以下是就上一篇的程式進行修改

 

[實作步驟]

1.  新增一個 CCustomEditListBox.h

2. 在 CCustomEditListBox.h 中加入以下程式碼:

在這個 OnBrowse() 函式中會打開開啟舊檔的 CFileDialog 並且把檔案路徑寫到 CVSListBox 的 item 中

#include "afxvslistbox.h"

class CCustomEditListBox :public CVSListBox
{
    virtual void OnBrowse()
    {
		int nSel = GetSelItem();
		CString szFilter = "All Files|*.*||";
		CFileDialog fd(TRUE,"","",OFN_HIDEREADONLY,szFilter,this);

		fd.m_ofn.Flags |= OFN_ENABLETEMPLATE;
		fd.m_ofn.hInstance = AfxGetInstanceHandle();
		fd.m_ofn.lpTemplateName = _T("DIALOG_PREVIEW");

		if(fd.DoModal() == IDOK)
		{
			CString path = fd.GetPathName();
			if (nSel == GetCount()) // New item
			{
				nSel = AddItem(path);
				SelectItem(nSel);
			}
			else
			{
				SetItemText(nSel, path);
			}
		}
	}
};

3. 加入宣告,並且將原先宣告好的變數改為 CCustomEditListBox 型態

#include "CCustomEditListBox.h"

class CFileCustomDlg : public CDialog
{
public:
	CCustomEditListBox m_pctlListInput;
	CCustomEditListBox m_pctlListOutput;
};

這樣在編譯執行後按下按鈕應該就會跳出開啟舊檔的對話框囉~!!

 

[參考資料]

1. MFC VSListBox browse buttons not working

2. CVSListBox类的扩展使用