VC组合框的使用示例

示例实现的功能

  • 自动查找当前目录下的所有txt文件,并显示在组合框中;
  • 用户可以自己选择其他目录下的txt文件

效果

工具启动后的样子:

run1

组合框的下拉效果:

run2

点击按钮,自己选择任意位置的txt文件:

run3

选择的txt文件显示在第一个位置:

run4

代码

对话框设计

IDD_COMBOBOXTEST_DIALOG DIALOGEX 0, 0, 240, 65
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "ComboBoxTest"
FONT 8, "MS Sans Serif"
BEGIN
    COMBOBOX        IDC_COMBO_FILES,16,18,199,53,CBS_DROPDOWN | 
                    CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP
    PUSHBUTTON      "...",IDC_BUTTON_SELECT_FILE,219,17,14,13
    DEFPUSHBUTTON   "OK",IDOK,39,44,50,14
    PUSHBUTTON      "Cancel",IDCANCEL,109,44,50,14
END

UI:

dialog1

dialog2

注意要在组合框右边的下拉箭头的地方按住,然后会出现一个上下调整的箭头,往下拉即可。这个往下拉的空间,就是运行后显示的空间。否则,运行的时候,下拉后没有反应。

App

在app中,实现一个小函数,获取程序的当前目录:

.h文件:

public:
    CString GetCurDir() const;

private:
    void InitCurrentDirectory();

private:
    CString m_currentDirectory; // No back slash at the end.

实现文件:

void CComboBoxTestApp::InitCurrentDirectory()
{
    char currentDirectory[MAX_PATH] = {0};
    DWORD nBufferLength = MAX_PATH;

    GetCurrentDirectory (nBufferLength, currentDirectory);
    m_currentDirectory = CString(currentDirectory);
}

CString CComboBoxTestApp::GetCurDir() const
{
    return m_currentDirectory;
}

另外需要在构造函数中初始化成员变量,在InitInstance()中调用InitCurrentDirectory()初始化当前路径。

Dialog

全贴:

class CComboBoxTestDlg : public CDialog
{
// Construction
public:
    CComboBoxTestDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data
    //{{AFX_DATA(CComboBoxTestDlg)
    enum { IDD = IDD_COMBOBOXTEST_DIALOG };
    CComboBox   m_ctrlFiles;
    //}}AFX_DATA

    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CComboBoxTestDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL

// Implementation
protected:
    HICON m_hIcon;

    // Generated message map functions
    //{{AFX_MSG(CComboBoxTestDlg)
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    afx_msg void OnButtonSelectFile();
    virtual void OnOK();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()

protected:
    BOOL FindAllTxtFiles(CStringArray& txtFiles);
};

实现文件:

实现定义全局变量,因为要调用app中的方法:

extern CComboBoxTestApp theApp;

数据/消息映射:

void CComboBoxTestDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CComboBoxTestDlg)
    DDX_Control(pDX, IDC_COMBO_FILES, m_ctrlFiles);
    //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CComboBoxTestDlg, CDialog)
    //{{AFX_MSG_MAP(CComboBoxTestDlg)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BUTTON_SELECT_FILE, OnButtonSelectFile)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

对话框初始化:

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

    // ....

    // TODO: Add extra initialization here
    CStringArray txtFiles;
    if (FindAllTxtFiles(txtFiles)) {
        for (int i = 0; i < txtFiles.GetSize(); i++) {
            m_ctrlFiles.AddString((LPCTSTR)txtFiles[i]);
        }
    }

    return TRUE;  // return TRUE  unless you set the focus to a control
}

事件处理:

void CComboBoxTestDlg::OnButtonSelectFile() 
{
    char szFilter[] = "Text Files(*.txt)|*.txt||";

    CFileDialog dlg(TRUE, NULL, NULL, NULL, szFilter); 
    dlg.m_ofn.lpstrTitle = _T("Select Text File ...");
    if (dlg.DoModal() != IDOK) {
        return;
    }

    CString fileName = dlg.GetPathName();

    m_ctrlFiles.InsertString(0, (LPCTSTR)fileName);
    m_ctrlFiles.SetCurSel(0);
}

void CComboBoxTestDlg::OnOK() 
{
    // TODO: Add extra validation here

    CDialog::OnOK();
}


BOOL CComboBoxTestDlg::FindAllTxtFiles(CStringArray& txtFiles)
{
    WIN32_FIND_DATA wfd;
    CString curDir = theApp.GetCurDir() + "\\";
    CString configFileName = curDir + "*.txt";

    HANDLE hFind = FindFirstFile((LPCTSTR)configFileName, &wfd);
    if (INVALID_HANDLE_VALUE == hFind) return FALSE;

    for (;;) {
        if (wfd.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE) {
            txtFiles.Add(curDir + CString(wfd.cFileName));
        }

        if (!FindNextFile(hFind, &wfd)) break;
    }

    FindClose(hFind);
    return TRUE;
}

本文的的pdf版本

http://download.csdn.net/detail/u013344915/9371766

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值