基于MFC 做页面 (遍历文件名、STL(map、vector))

实现的功能页面如下图:

基于MFC 做页面 (遍历文件名、STL(map、vector))_第1张图片

实现的过程:

基于MFC完成页面的设置;首先在OnInitDialog()函数中完成对话框的初始化,初始化包括快捷方案组合窗口初始化(LoadAllSchemes( FileName))、列表控件初始化InitListCtrl()、插件组合窗口初始化LoadAllPlugin();其中快捷方案组合窗口中的信息是通过SsnGetPath获取相应地址信息,查询该地址下对应的文件节名就是相应的快捷方案;在查找快捷方案是,遍历相应文件夹中的文件信息,即得到列表空间中的“命令描述”和“快捷键信息”,查找到的相应快捷键信息通过vector存储到vSave中,用于查询时调用;同时通过map把相应的插件ID和插件名对应存储到mapPlugin,用于插件查询时使用;
快捷方案查找,首先获取组合框中的快捷方案名,快捷方案名既是相应的文件名,通过遍历文件名下的相应信息,完成查找功能;
插件查找,因为mapPlugin中存储了插件ID和插件名的对应信息,所以通过获得组合框中选中的插件名,则可以查找到对应的插件ID,通过插件ID,在列表框中填充相应的信息;
查询功能,获取列表框中每行每列的相应信息和Edit中的信息进行比较,如果相同,则标注该行;

实现代码:

HotkeyScheme.h

#pragma once
#include "SSNAPI.h"
#include "Resource.h"
#include <vector>
#include <map>


class CHotkeyScheme: public CDialogEx
{
 DECLARE_DYNAMIC(CHotkeyScheme)
public:
 CHotkeyScheme(CWnd* pParent = NULL);   // standard constructor
 virtual ~CHotkeyScheme();
 enum { IDD = IDD_HOTKEY_DIALOG };

protected:
 virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
 virtual BOOL OnInitDialog();
 DECLARE_MESSAGE_MAP()
public:
 void LoadAllSchemes(CString FileName);       //加载所有的快捷键方案
 void LoadAllPlugin();                      //加载所有的插件
 void InitListCtrl();                         //初始化快捷键列表属性 
 void FindFileName(const TCHAR* pat,CString FileName);
 void OnClose();
 afx_msg void OnBnClickedOk();
 afx_msg void OnBnClickedFind();              //查询                
 CComboBox m_Scheme;
 CListCtrl m_list;
 std::vector<PSSN_COMMAND> m_vSave;
 void CHotkeyScheme::OnBnClickedCancel();
 CComboBox m_Module;
 afx_msg void OnSelchangeScheme();
 afx_msg void OnCbnSelchangeModule();
 int m_Location;
    CString m_Text;
 std::map <INT, PSSN_PLUGIN_ENTRY> m_mapPlugin;
 afx_msg void OnChangeText();
};

 

HotkeyScheme.cpp

 

#include "StdAfx.h"
#include "HotkeyScheme.h"
#include "CoreUI.h"
#include "afxdialogex.h"
#include "Windowsx.h"

using namespace std;

CHotkeyScheme *g_pHotkeyScheme = NULL;

IMPLEMENT_DYNAMIC(CHotkeyScheme, CDialogEx)

 CHotkeyScheme::CHotkeyScheme(CWnd* pParent /*=NULL*/)
 : CDialogEx(CHotkeyScheme::IDD, pParent)
{
#ifndef _WIN32_WCE
 EnableActiveAccessibility();
#endif
 m_Location=0;
}

CHotkeyScheme::~CHotkeyScheme()
{
 for(int k=0;k<m_vSave.size();k++)
 { 
  delete m_vSave[k];
 }
 m_vSave.clear();
}

void CHotkeyScheme::DoDataExchange(CDataExchange* pDX)
{
 CDialogEx::DoDataExchange(pDX);
 DDX_Control(pDX, IDC_SCHEME, m_Scheme);
 DDX_Control(pDX, IDC_LIST1, m_list);
 DDX_Control(pDX, IDC_MODULE, m_Module);
 DDX_Text(pDX, IDC_TEXT, m_Text);
}

BEGIN_MESSAGE_MAP(CHotkeyScheme, CDialogEx)
 ON_BN_CLICKED(IDOK, &CHotkeyScheme::OnBnClickedOk)
 ON_BN_CLICKED(IDC_FIND, &CHotkeyScheme::OnBnClickedFind)
 ON_BN_CLICKED(IDCANCEL, &CHotkeyScheme::OnBnClickedCancel)
 ON_CBN_SELCHANGE(IDC_SCHEME, &CHotkeyScheme::OnSelchangeScheme)
 ON_CBN_SELCHANGE(IDC_MODULE, &CHotkeyScheme::OnCbnSelchangeModule)
 ON_EN_CHANGE(IDC_TEXT, &CHotkeyScheme::OnChangeText)
END_MESSAGE_MAP()

BOOL CHotkeyScheme::OnInitDialog()
{
 CDialog::OnInitDialog();
 //添加想要初始化的内容
 TCHAR  CDialogName[MAX_PATH]={0};
 CString Hdvalue=_T("Hotkeys");
 SsnGetLocaleString(SSN_PLUGIN_ID_ANY,Hdvalue, SSN_AUTO_SELECT_LOCALE,NULL,Hdvalue,CDialogName,MAX_PATH,Hdvalue);
 SetWindowText(CDialogName);

 TCHAR  HSName[MAX_PATH]={0};
 CString HSvalue=_T("Scheme(S)");
 CStatic* static1 = (CStatic*)GetDlgItem(IDC_STATIC1);
 SsnGetLocaleString(SSN_PLUGIN_ID_ANY,HSvalue, SSN_AUTO_SELECT_LOCALE,NULL,HSvalue,HSName,MAX_PATH,HSvalue);
 static1->SetWindowText(HSName);

 TCHAR  SMName[MAX_PATH]={0};
 CString SMvalue=_T("Module(M)");
 CStatic* static2 = (CStatic*)GetDlgItem(IDC_STATIC2);
 SsnGetLocaleString(SSN_PLUGIN_ID_ANY,SMvalue, SSN_AUTO_SELECT_LOCALE,NULL,SMvalue,SMName,MAX_PATH,SMvalue);
 static2->SetWindowText(SMName);

 TCHAR  HFName[MAX_PATH]={0};
 CString HFvalue=_T("Find(F)");
 CButton* button1 = (CButton*)GetDlgItem(IDC_FIND);
 SsnGetLocaleString(SSN_PLUGIN_ID_ANY,HFvalue, SSN_AUTO_SELECT_LOCALE,NULL,HFvalue,HFName,MAX_PATH,HFvalue);
 button1->SetWindowText(HFName);

 TCHAR  HOName[MAX_PATH]={0};
 CString HOvalue=_T("OK(O)");
 CButton* button2 = (CButton*)GetDlgItem(IDOK);
 SsnGetLocaleString(SSN_PLUGIN_ID_ANY,HOvalue, SSN_AUTO_SELECT_LOCALE,NULL,HOvalue,HOName,MAX_PATH,HOvalue);
 button2->SetWindowText(HOName);

 TCHAR  HCName[MAX_PATH]={0};
 CString HCvalue=_T("Cancel(C)");
 CButton* button3 = (CButton*)GetDlgItem(IDCANCEL);
 SsnGetLocaleString(SSN_PLUGIN_ID_ANY,HCvalue, SSN_AUTO_SELECT_LOCALE,NULL,HCvalue,HCName,MAX_PATH,HCvalue);
 button3->SetWindowText(HCName);

 CString FileName;
 LoadAllSchemes( FileName);
 InitListCtrl();
 LoadAllPlugin();
 return TRUE;  // 除非将焦点设置到控件,否则返回TRUE
}
//查询文件名
void CHotkeyScheme::FindFileName(const TCHAR* path,CString FileName)
{
 int i=0;
 CFileFind OneFile1;
 CString strWildcard(path);
 strWildcard += _T("\\*.*");
 BOOL BeWorking;
 BeWorking=OneFile1.FindFile(strWildcard);
 while(BeWorking)
 {
  BeWorking = OneFile1.FindNextFile();

   if (!OneFile1.IsDots()) 
    {
     FileName = OneFile1.GetFileName();
     TCHAR szLocaleString [MAX_PATH]={0};
     SsnGetLocaleString(SSN_PLUGIN_ID_ANY,FileName, SSN_AUTO_SELECT_LOCALE,SSN_STR_COMMAND,FileName,szLocaleString, MAX_PATH,FileName);
     m_Scheme.InsertString(-1,FileName);
     HANDLE BeginInfo =SsnBeginGetCommandInfo(FileName.GetBuffer());
     if(BeginInfo!=INVALID_HANDLE_VALUE)
     {
      PSSN_COMMAND pCommand= new SSN_COMMAND;
      PSSN_PLUGIN_ENTRY PlugInEntry = new SSN_PLUGIN_ENTRY;
      while(SSN_OK==SsnGetNextCommandInfo(BeginInfo,pCommand))
      {      
       if(!(pCommand->nConfig&SSN_CMD_CONFIG_HIDE))
       {
        SsnGetPlugInInfo(pCommand->CommandId.nCreaterPlugInId,PlugInEntry);
        m_mapPlugin.insert(pair<INT, PSSN_PLUGIN_ENTRY>(pCommand->CommandId.nCreaterPlugInId, PlugInEntry));
        PlugInEntry = new SSN_PLUGIN_ENTRY;

        m_vSave.push_back(pCommand);
        pCommand= new SSN_COMMAND;
        m_vSave.size();
       }
      }
      SsnEndGetCommandInfo(BeginInfo);      
     }
     FindFileName(strWildcard,FileName);
    }
 }
 OneFile1.Close();
}


//加载所有的快捷键方案
void  CHotkeyScheme::LoadAllSchemes(CString FileName)
{
 TCHAR  szPath[MAX_PATH]={0};
 INT GetPathLength=SsnGetPath( SSN_PATH_HOTKEY,szPath,MAX_PATH,0, NULL,NULL);
 CComboBox *pBox = (CComboBox *)GetDlgItem( IDC_SCHEME );
 if (GetPathLength!=0)
 {
   FindFileName(szPath,FileName);
 }
 ((CComboBox*)GetDlgItem(IDC_SCHEME))->SetCurSel(0);
}

//初始化快捷键列表属性
void CHotkeyScheme::InitListCtrl()
{
 DWORD dwStyle=GetWindowLong(m_list.m_hWnd,GWL_STYLE);
 SetWindowLong(m_list.m_hWnd,GWL_STYLE,dwStyle|LVS_REPORT);
 DWORD styles=m_list.GetExtendedStyle();
 m_list.SetExtendedStyle(styles|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
 //SetWindowText;
 TCHAR Description[MAX_PATH]={0};
 CString Ddvalue=_T("Command description");
 SsnGetLocaleString(SSN_PLUGIN_ID_ANY,Ddvalue, SSN_AUTO_SELECT_LOCALE,NULL,Ddvalue,Description,MAX_PATH,Ddvalue);
 TCHAR Hotkeys [MAX_PATH]={0};
 CString Hdvalue =_T("Hotkeys");
 SsnGetLocaleString(SSN_PLUGIN_ID_ANY,Hdvalue, SSN_AUTO_SELECT_LOCALE,NULL,Hdvalue,Hotkeys,MAX_PATH,Hdvalue);
 TCHAR *rgtsz[2]={Description,Hotkeys};
 LV_COLUMN lvcolumn;
 CRect m_rect;
 m_list.GetWindowRect(&m_rect);
 for (int i=0;i<2;i++)
 {
  lvcolumn.mask=LVCF_FMT|LVCF_SUBITEM|LVCF_TEXT|LVCF_WIDTH|LVCF_ORDER;
  lvcolumn.fmt=LVCFMT_LEFT;
  lvcolumn.pszText=rgtsz[i];
  lvcolumn.iSubItem=i;
  lvcolumn.iOrder=i;
  if (i==0)
  {
   for (int j=0;j<2;j++)
   {
    lvcolumn.cx=m_rect.Width()/2+21;
   } 
  }
  else
  {
   for (int j=0;j<2;j++)
   {
    lvcolumn.cx=360;
   }
  }
  m_list.InsertColumn(i,&lvcolumn);
 }
 for(int k=0;k<m_vSave.size();k++)
 { 
  TCHAR Caption [MAX_PATH]={0};
  SsnGetLocaleString(m_vSave[k]->CommandId.nCreaterPlugInId,NULL,SSN_AUTO_SELECT_LOCALE,SSN_STR_COMMAND,m_vSave[k]->szCaption,Caption,MAX_PATH,m_vSave[k]->szCaption);
  m_list.InsertItem(k,(LPCTSTR)Caption);
  m_list.SetItemText(k,1,(LPCTSTR)m_vSave[k]->szKeys);
 }
}


//加载插件
void CHotkeyScheme::LoadAllPlugin()
{
 CComboBox *pBox = (CComboBox *)GetDlgItem( IDC_MODULE );
 TCHAR  APName[MAX_PATH]={0};
 CString APvalue=_T("All plugin");
 SsnGetLocaleString(SSN_PLUGIN_ID_ANY,APvalue, SSN_AUTO_SELECT_LOCALE,NULL,APvalue,APName,MAX_PATH,APvalue);
 m_Module.AddString(APName);
 pBox->SetCurSel(0);

 map<INT, PSSN_PLUGIN_ENTRY>::iterator  iter;
 for(iter = m_mapPlugin.begin(); iter != m_mapPlugin.end(); iter++)
 {
  int i=0;
  iter->first;
  iter->second; 
  TCHAR Plug[MAX_PATH] = {0};
  SsnGetLocaleString(iter->first,NULL,SSN_AUTO_SELECT_LOCALE,SSN_STR_COMMAND,iter->second->szPlugEnName,Plug,MAX_PATH,iter->second->szPlugEnName);
  m_Module.InsertString( i, Plug);
  i++;
 }
}

 void CHotkeyScheme::OnBnClickedFind()
{
 int count=0;
 int flag=0;
 for (int FindCount=m_Location;FindCount<m_vSave.size();FindCount++)
  {
   for (int j=0;j<2;j++)
   {
    CString   strlist=m_list.GetItemText(FindCount,j);
    CString   str;
    GetDlgItem(IDC_TEXT)-> GetWindowText(str);
    strlist.MakeUpper();
    m_Text.MakeUpper();
    str.MakeUpper();
    if(strlist.Find(str)!=-1)
    {
     m_Location=FindCount+1;
     m_list.EnsureVisible(FindCount,FALSE);
     m_list.SetItemState(FindCount,LVIS_SELECTED,LVIS_SELECTED);
     m_list.SetFocus() ;
     flag=1;
     break;
    }    
   }
   count++;
   if (count>=m_vSave.size())
   {
    break;
   }
   if (m_Location>=m_vSave.size())
   {
    m_Location=0;
   }
   if (flag==1)
   {
   break;
   } 
  }
 }


void CHotkeyScheme::OnSelchangeScheme()
{
 OnCbnSelchangeModule();
}

void CHotkeyScheme::OnCbnSelchangeModule()
{
 m_list.DeleteAllItems();
 CString  strTemp;
 ((CComboBox*)GetDlgItem(IDC_MODULE))->GetWindowText(strTemp);
 TCHAR  APName[MAX_PATH]={0};
 CString APvalue=_T("All plugin");
 SsnGetLocaleString(SSN_PLUGIN_ID_ANY,APvalue, SSN_AUTO_SELECT_LOCALE,NULL,APvalue,APName,MAX_PATH,APvalue);
 if ( strTemp==APName)
 { 
  for(int k=0;k<m_vSave.size();k++)
  {
  TCHAR Caption [MAX_PATH]={0};
  SsnGetLocaleString(m_vSave[k]->CommandId.nCreaterPlugInId,NULL,SSN_AUTO_SELECT_LOCALE,SSN_STR_COMMAND,m_vSave[k]->szCaption,Caption,MAX_PATH,m_vSave[k]->szCaption);
  m_list.InsertItem(k,(LPCTSTR)Caption);
  m_list.SetItemText(k,1,(LPCTSTR)m_vSave[k]->szKeys);
  }
 }
 else
 {
  map<INT, PSSN_PLUGIN_ENTRY>::iterator  iter;
  for(iter = m_mapPlugin.begin(); iter != m_mapPlugin.end(); iter++)
  {
   if(strTemp==iter->second->szPlugEnName)
   {
    for (int i=0;i<m_vSave.size();i++)
    {
     if (iter->first==m_vSave[i]->CommandId.nCreaterPlugInId)
     {
      int k=0;      
      TCHAR Caption [MAX_PATH]={0};
      SsnGetLocaleString(iter->first,NULL,SSN_AUTO_SELECT_LOCALE,SSN_STR_COMMAND,m_vSave[i]->szCaption,Caption,MAX_PATH,m_vSave[i]->szCaption);
      m_list.InsertItem(k,(LPCTSTR)Caption);
      m_list.SetItemText(k,1,(LPCTSTR)m_vSave[i]->szKeys);
      ++k;
     }   
    } 
   }   
  }
 } 
}


void CHotkeyScheme::OnBnClickedOk()
{
 // TODO: Add your control notification handler code here
 CString  strTemp;
 ((CComboBox*)GetDlgItem(IDC_SCHEME))->GetWindowText(strTemp);
 COleVariant pvSetting=strTemp;
 SsnSetCoreSetting(SSN_CORE_SETTING_CMD_SCHEME,&pvSetting);
 CDialogEx::OnOK();
}

void CHotkeyScheme::OnBnClickedCancel()
{
 // TODO: Add your control notification handler code here
 CDialogEx::OnCancel();
}

void CHotkeyScheme:: OnClose()
{

}

void CHotkeyScheme::OnChangeText()

}

 

CoreUI.cpp

/********************************************************************
 created: 2012/06/18
 author:  mazhen
 
 purpose: 实现 Core.dll 所需要的界面, 此工程需要MFC.
*********************************************************************/
#include "stdafx.h"
#include "CoreUI.h"
#include "PlugIn.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#endif

//
//TODO: If this DLL is dynamically linked against the MFC DLLs,
//  any functions exported from this DLL which call into
//  MFC must have the AFX_MANAGE_STATE macro added at the
//  very beginning of the function.
//
//  For example:
//
//  extern "C" BOOL PASCAL EXPORT ExportedFunction()
//  {
//   AFX_MANAGE_STATE(AfxGetStaticModuleState());
//   // normal function body here
//  }
//
//  It is very important that this macro appear in each
//  function, prior to any calls into MFC.  This means that
//  it must appear as the first statement within the
//  function, even before any object variable declarations
//  as their constructors may generate calls into the MFC
//  DLL.
//
//  Please see MFC Technical Notes 33 and 58 for additional
//  details.
//

// CCoreUIApp

BEGIN_MESSAGE_MAP(CCoreUIApp, CWinApp)
END_MESSAGE_MAP()


// CCoreUIApp construction

CCoreUIApp::CCoreUIApp()
{
 // TODO: add construction code here,
 // Place all significant initialization in InitInstance
}


// The one and only CCoreUIApp object

CCoreUIApp theApp;


// CCoreUIApp initialization

BOOL CCoreUIApp::InitInstance()
{
 CWinApp::InitInstance();

 return TRUE;
}

SSN_PLUGIN_ENTRY g_PlugInEntry;

SSN_PLUGIN SSN_RETURN PiPlugInEntry(__inout PSSN_PLUGIN_ENTRY pPlugInEntry)
{
 _tcscpy_s(pPlugInEntry->szPlugEnName, _countof(pPlugInEntry->szPlugEnName), _T("Core.UI"));
 pPlugInEntry->nPlugInId = SSN_PLUGIN_ID_UI_CORE;

 g_PlugInEntry.nPlugInId = pPlugInEntry->nPlugInId;
 _tcscpy_s(g_PlugInEntry.szPlugEnName, _countof(g_PlugInEntry.szPlugEnName), pPlugInEntry->szPlugEnName);

 return SSN_OK;
}

SSN_RETURN CoreUICallCmdAction(__in PSSN_CMD_CALL_DATA pCallData)
{
 return SSN_FALSE;
}

SSN_RETURN   ShowDialog(__in PSSN_CMD_CALL_DATA pCallData)
{
 AFX_MANAGE_STATE(AfxGetStaticModuleState());
 CHotkeyScheme Dlg; 
 Dlg.DoModal();
 return SSN_OK;
}

SSN_PLUGIN SSN_RETURN PiInit()
{
 static SSN_COMMAND cmd[] =
 {
  SSN_COMMAND(SSN_OBJECT_ID(SSN_PLUGIN_ID_UI_CORE, 1), 0, SSN_CMD_CONFIG_SHOW_ON_MENU, _T(""), _T("Hotkeys setting"), _T("Hotkeys setting"), (PVOID)ShowDialog, SSN_MENU_TOOLS),
  //SSN_COMMAND(SSN_OBJECT_ID(SSN_PLUGIN_ID_UI_CORE, 2), 0, SSN_CMD_CONFIG_SHOW_ON_MENU, _T(""), _T("test sub"), _T("test sub"),  (PVOID)CoreUICallCmdAction, SSN_OBJECT_ID(SSN_PLUGIN_ID_UI_CORE, 1)),
 };

 for (INT i=0; i<_countof(cmd); i++)
 {
  SsnRegisterCommandHandler(&cmd[i]);
 }
 return SSN_OK;
}

SSN_PLUGIN SSN_RETURN PiUnInit()
{
 return SSN_OK;
}

 


 
































































































































































你可能感兴趣的:(基于MFC 做页面 (遍历文件名、STL(map、vector)))