实现的功能页面如下图:
实现的过程:
基于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;
}