Harbin Institute of Technology at Weihai
数据结构课程
报告
设计题目: 程序和文件快速打开工具
院 系: 计算机科学与技术学院
班 级: 0804102
学 号:080410227 080410228 080410206 080410226
设 计 者: 康龙彪 朱虹宇
连思思 刘宗仁
哈尔滨工业大学(威海)
前 言
数据结构是计算机专业的必修和主干课程之一,它旨在使学生学会分析研究数据对象的特性,学会数据的组织
,以便选择合适的数据逻辑结构和存储结构,以及相应的运算(操作),把现实世界中的问题转化为计算机内部的表示和处理,这是一个良好的程序设计技能训练的过程。在整个教学或学习过程中,解决实际问题的能力和技巧的训练是一个重要的环节。
本课题设计要求学生分组进行(每组2-4人),自行选题,选题的思想是根据实际需要进行调研,以组为单位提交课程设计任务
,给出所选项目的背景和意义,由导师确定选题的级别,主要是以实用性为主,开发一个具有实际价值的项目,经过2周的课程设计后接受课程设计组老师的结题验收。
教师评语:
成 绩:
哈尔滨工业大学(威海)数据结构课程设计任务书
院(系): 计算机科学与技术学院 专 业:计算机科学技术
姓 名: 康龙彪 朱虹宇 刘宗仁 连思思
学 号:080410227 080410228 080410226 080410206
课程设计题目:程序和文件快速打开工具
问题阐述与分析:
设计题目背景:
随着电脑在日常生活、工作中用到的越来越广泛,作用越来越大,各种应用软件的数量增越来越快。如今我们为了不同的需要常常在电脑上装了很多软件,为了使用方便,经常可见桌面上堆满了快捷方式,但是这却使我们经常为找到要用的软件而苦心寻找图标或程序菜单。相似的情况也发生在文件的使用和管理中,我们经常会为不能快速自己想听的一首歌或是文档而烦恼。该课程设计所要开发的小工具就是帮助我们解决这些问题。
设计实现意义:
该软件能够让你快速查找定位并打开想使用的应用程序和系统功能,并且可以指定存放文档的目录和文档类型,实现文档的快速查找和打开,以实现轻量级桌面搜素的功能。使用该工具可以使你在电脑上的学习、工作更加有效率,有更好的使用体验。
解决的主要问题:
1、 在安装应用程序较多的情况下,通过输入关键字实现特定程序的查找定位和快速启动;
2、 在实现启动程序的同时,实现对windows控制面板中系统功能的快速调用;
3、 指定存放常用文档的目录和常用文档类型,在文档较多的情况下,通过输入关键字查找定位文档并快速打开;
4、 在此基础上,考虑拓展功能如下:
1) 通过预先输入常用网站列表或者扫描网页收藏夹,在输入网站关键字时快速打开网页;
2) 实现界面的换肤功能,具有更好的用户体验;
3)将文件搜索功能实现的更完整,将桌面搜索功能融入进去。
工作量:
该程序功能大致可划分为以下几个部分:
1、 程序、系统功能、文件和网页信息索引列表的建立,以及对于以上四种类型实现不同的调用启动方式。
2、 当输入关键字时,字符的精确匹配的实现,考虑使用正则表达式。
3、 多个皮肤动态更换的实现。
4、 考虑将基本框架和功能实现相分离,将第一项四种类别的启动用插件的方式实现,使该工具功能具有更好的可扩展性。
该工具实现后,运行时以简洁美观的对话框呈现,当输入关键字时,程序自动将匹配最好的结果以列表的方式呈现,用户可选择正确的项目快速打开。
工作
安排:
第16周:前半周小组成员将开发环境配置好,该软件使用VS2008开发,为了实现版本控制,使小组成员更好的协作开发,在google code 上申请项目托管,使用SVN服务进行版本控制;后半周查找资料,并作出软件各个功能模块的详细设计和详细分工,并在周末正式开始代码编写。
第17周:并行开发基本框架各个模块,在该周最后几天基本完成基本框架和各个模块的编写,开始整合调试程序。
第18周:前半周做界面的优化和程序的调试及完善;后半周整理程序文档,准备课程设计的验收。
同组设计者及分工:
康龙彪:1、程序整体框架的设计和实现,如插件和皮肤的接口实现;
2、基本功能类的设计和实现,如索引建立和程序、文件打开;
3、组织小组开发和组员的详细分工,协调小组成员的开发工作;
朱虹宇:1、具体插件的实现,即程序、系统功能、文件和网页打开功能的插件开发;
2、负责模块的调试工作;
连思思:1、程序界面的设计和美化,皮肤的设计和实现;
2、与康龙彪共同负责软件整体的调试;
3、程序开发文档的管理;
刘宗仁:1、IE和火狐浏览器网页收藏夹搜索插件的实现;
2、插件的调试工作。
1. 项目研究背景与意义
设计题目背景:
随着电脑在日常生活、工作中用到的越来越广泛,作用越来越大,各种应用软件的数量增越来越快。如今我们为了不同的需要常常在电脑上装了很多软件,为了使用方便,经常可见桌面上堆满了快捷方式,但是这却使我们经常为找到要用的软件而苦心寻找图标或程序菜单。相似的情况也发生在文件的使用和管理中,我们经常会为不能快速自己想听的一首歌或是文档而烦恼。该课程设计所要开发的小工具就是帮助我们解决这些问题。
设计实现意义:
该软件能够让你快速查找定位并打开想使用的应用程序和系统功能,并且可以指定存放文档的目录和文档类型,实现文档的快速查找和打开,以实现轻量级桌面搜素的功能。使用该工具可以使你在电脑上的学习、工作更加有效率,有更好的使用体验。
2. 需求分析
本程序功能可分成7个部分:主程序,5个插件和一套皮肤系统。下面根据用户的实际需求,分别对每个部分的所要所要实现的功能的具体要求:
1、程序主体部分
本程序的主要功能是实现程序和文件的快速打开,对于主体部分,具体要实现以下功能;
当用户打开了一个窗口工作时,需要打开另一个程序协助工作,而安装的软件较多,此时,主程序可以在用户快速按下快捷键后显示,然后用户输入程序的几个关键字后按回车后程序帮助用户搜索到该程序并自动打开。
用户将一些常用的文件放在固定的文件夹内,如音乐文件夹,在用户预先在程序中添加音乐文件夹和音乐文件类型后,当用户在打开窗口工作时想听首歌放松一下时,可以按照上面的方法,只需简单输入歌曲名关键字就可以快速打开,操作更加快捷迅速,为用户节省了时间。以上方法同样适用于快速打开指定文件夹内的常用文件。
用户可以根据自己的使用习惯设置程序的显示方式,可以是始终显示或者始终显示在其他窗口的最顶端,也可以当打开自己要找的程序或文件后自动隐藏,下次要使用时按快捷键显示。
用户可以设置开机自动启动,省去查找该软件的时间。
用户可以对返回的搜素结果的数量进行设置,此外由于程序是基于索引查找,当用户有新程序添加时需要刷新索引,程序需要实现每隔固定时间自动刷新索引,在规定默认时间的同时用户可以对该时间进行设置。
2、插件1——Controly功能是用户可以输入关键字打开控制面板中的应用程序。
3、插件2——weby实现用户可在程序的输入框中输入网址直接打开网页,也可用于快捷的调用网页搜索功能,实现网页搜索。
4、插件3——explory功能是输入路径打开特定的文件夹或者是快捷方式。
5、插件4——foxy用户可以打开火狐书签中所收藏的网页。
6、插件5——ie用输入网页收藏时的标题,可以打开ie收藏夹的网页
7、皮肤系统:皮肤系统主要由主界面显示功能和换肤体验功能两部分构成。
(1)主界面显示功能:
搜索时,当用户选定其中任意一个条目时,程序会在中间区域显示该项条目所对应的特定程序或文件的图标,同时,在右侧区域显示特定程序或文件的名称结果。两种显示结果增强了界面的友好性,使用户及时定位自己想要的搜索结果。
(2)换肤体验功能:
用户在输入框以外的界面的任何部位单击右键后,可在弹出对话框中进行换肤功能的选择。
本程序从广大用户的年龄、职业、兴趣爱好出发,开发并提供了若干项不同风格的皮肤系列,在色彩、字体、显示效果上进行了精心的设计,用户可以根据自己的喜好从选项列表中点击选择具有不同特色的皮肤,单击确定按钮后程序自动换肤,一个新的界面立即呈现在用户眼前。换肤功能为用户提供了一个轻松、舒适的使用环境,绚丽的皮肤界面使用户有一个愉悦的心情,用户可以更加个性化、高效地使用本程序。
3. 概要设计
CLaunchyDlg 类:主程序对话框的显示和处理右键菜单、热键、关闭等消息的响应;
Option 类:负责读取程序配置文件信息,保存程序的各种配置信息变量
……等等
有重要的变量或文件可以单独介绍
皮肤:
Skin 类:获取特定的ini皮肤文件,并从文件中读取各项参数信息,将其存储到皮肤类的变量当中,其中包括对于颜色信息以及矩形信息的格式转化;
AlphaBorder 类:实现对于窗口边框图像透明度属性的设置,消息响应的设置;
CMyStatic 类:实现对于搜索结果图标预览背景透明度等属性的设置,图像的绘制显示的功能;
ReadOnlyEdit 类: 实现对于搜索结果名称预览文本属性、文本背景属性的设置,只读文本的显示功能,以及消息的响应;
SkinChooser 类:从Option 类中获取皮肤文件数目,添加并显示所有皮肤文件名称,根据消息响应结果返回皮肤列表索引,从而得到相应索引对应的皮肤文件名称。
整个程序的流程图如下:
4. 运行结果与分析
运行结果与分析将在视频中展示
5. 问题及难点
在实现软件的过程中,主要难点就是如何快速精确的从数据库中匹配用户所输入的字符串和记录功能,比如记录用户刚打开的程序。在第二次输入搜索时会显示在第一项。在解决匹配问题的时候我们用到了boost库, Boost C++ 库(Libraries) 是一组扩充C++功能性的经过同行评审(Peer-reviewed)且开放源代码程序库。大多数的#
数#为了能够以开放源代码、封闭项目的方式运作。其中包含了对正则表达式处理的regex正则表达式库,加快匹配的速度。其次,用到了smart_ptr智能指针库,当使用完后指针会自动销毁,不必担心内存泄漏的问题。
6. 总结(收获与体会)
在本次课设中,我们是从实际生活中的需求出发去设计程序,是我们在设计实现软件的过程中有很大的兴趣,能够坚持完成。还有就是团队合作很重要,团队分工明确,这对代码质量也有很严格的要求,代码的模块化使得每个人可以同时开发自己的功能。我们使用谷歌的项目托管服务,并使用SVN版本控制系统,提高整体的开发效率。在本次课设中体会到了团队合作的重要性。
10. 主要代码
主对话框的功能代码:
void ModifyReg_run(bool m_bAutoRun)
{
HKEY hKey;
CString temp1(_T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"));
//找到系统的启动项
LPCTSTR lpRun = (LPCTSTR)(temp1.AllocSysString());
//打开启动项Key
long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE | KEY_READ, &hKey);
if(lRet == ERROR_SUCCESS)
{
if(m_bAutoRun)
{
CString pFileName;
//得到程序自身的全路径
DWORD dwRet = GetModuleFileName(NULL, (WCHAR*)pFileName.GetBufferSetLength(MAX_PATH+1), MAX_PATH);
//添加一个子Key,并设置值
lRet = RegSetValueEx(hKey, (LPCWSTR)_T("Opener"), 0, REG_SZ, (BYTE *)pFileName.GetBuffer(), dwRet);
}
else
{
RegDeleteValue(hKey,(LPCWSTR)_T("Opener"));
}
//关闭注册表
RegCloseKey(hKey);
if(lRet != ERROR_SUCCESS)
{
AfxMessageBox(_T("系统参数错误,不能随系统启动"));
}
}
}
// CLaunchyDlg 对话框
bool IsXp;
#define DELAY_TIMER 100
#define UPDATE_TIMER 101
CLaunchyDlg::CLaunchyDlg(CWnd* pParent /*=NULL*/)
: CDialogSK(CLaunchyDlg::IDD, pParent)
, initialized(0)
//还未完成初始化
{
m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
//加载程序图标
atLaunch = true;
//程序实例正在运行
m_FontInput = NULL;
m_FontResult = NULL;
ShowLaunchyAtStart = true;
//默认运行显示主界面
ShowingDialog = false;
//没有正在显示选项对话框
}
//实现对话框中的控件与相应类相关联,以实现数据交互
void CLaunchyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogSK::DoDataExchange(pDX);
DDX_Control(pDX, IDC_Input, InputBox);
//关联输入框
DDX_Control(pDX, IDC_PREVIEW, Preview);
//结果预览框
DDX_Control(pDX, IDC_PIC, IconPreview);
//图标预览区
}
//消息与响应函数映射
BEGIN_MESSAGE_MAP(CLaunchyDlg, CDialogSK)
ON_MESSAGE(WM_HOTKEY,OnHotKey)
//映射热键消息响应函数
ON_WM_PAINT()
//窗口重绘消息
ON_WM_QUERYDRAGICON()
//响应拖动最小化的窗口
ON_WM_WINDOWPOSCHANGING()
//相应窗口改变
ON_WM_CLOSE()
ON_WM_DESTROY()
ON_WM_TIMER()
//计时器响应
ON_WM_CONTEXTMENU()
//响应右键菜单
ON_MESSAGE(LAUNCHY_DB_DONE, OnDBDone)
END_MESSAGE_MAP()
//初始化对话框
BOOL CLaunchyDlg::OnInitDialog()
{
AfxInitRichEdit();
//初始化输入框
ShowWindows(false);
CDialogSK::OnInitDialog();
//调用基类的初始化函数
/*CoInitializeEx是Windows提供的API函数,为当前线程初始化COM库并设置并发模式。
应用程序调用com库中的函数(除CoGetMalloc和内存分配函数)之前必须初始化com库。*/
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE);
// 设置大图标
SetIcon(m_hIcon, FALSE);
// 设置小图标
//获取原来的窗口属性,并添加新的属性WS_EX_TOOLWINDOW(没有最小化,alt+tab不显示)
SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE) | WS_EX_TOOLWINDOW);
// 开始界面功能
EnableEasyMove(); // 当点击界面的任何地方时都能拖动窗口
CXWinVersion test;
IsXp=test.IsXP();
//判断是否是xp操作系统
options.reset(new Options());
//重新加载选项
plugins.reset(new Plugin());
//重新加载插件
smarts.reset(new LaunchySmarts());
//重新加载智能启动模块
applySkin();
//应用皮肤
if (options->stickyWindow || ShowLaunchyAtStart) {
ShowLaunchy();
}
else {
HideLaunchy();
}
if (options->sal)
{
if (!options->sal_isset)
{
ModifyReg_run(true);
options->sal_isset = true;
}
}
else
{
ModifyReg_run(false);
options->sal_isset = false;
}
//注册热键
BOOL m_isKeyRegistered = RegisterHotKey(GetSafeHwnd(), 100,
options->mod_key, options->vkey);
ASSERT(m_isKeyRegistered != FALSE);
//设置重建索引计时,单位为分钟
if (options->indexTime != 0)
SetTimer(UPDATE_TIMER, 60000*options->indexTime, NULL);
initialized = true;
//已经完成初始化
return TRUE; // 除非将焦点设置到控件,否则返回TRUE
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的MFC 应用程序,
// 这将由框架自动完成。
void CLaunchyDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast
(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogSK::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CLaunchyDlg::OnQueryDragIcon()
{
return static_cast(m_hIcon);
}
//热键响应函数
LRESULT CLaunchyDlg::OnHotKey(WPARAM wParam, LPARAM lParam) {
if (wParam == 100) {
if (atLaunch)
{
this->Visible = false;
atLaunch = false;
}
if (ShowingDialog) return 1;
if (options->stickyWindow) {
this->ShowLaunchy();
}
else {
this->Visible = !this->Visible;
if (Visible)
{
this->ShowLaunchy();
}
else {
HideLaunchy();
}
}
}
return 1;
}
//窗口改变或者窗口移动消息响应函数
void CLaunchyDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos)
{
if(this->atLaunch) {
if (!this->initialized) {//如果程序未完成初始化
lpwndpos->flags &= ~SWP_SHOWWINDOW;//隐藏窗口
}
else {//如果没有选择固定窗口和运行时显示窗口,则隐藏窗口
if (options != NULL && !options->stickyWindow && !ShowLaunchyAtStart) {
lpwndpos->flags &= ~SWP_SHOWWINDOW;
}
}
}
CDialogSK::OnWindowPosChanging(lpwndpos);
}
//关闭消息响应函数
void CLaunchyDlg::OnClose()
{
// 保存设置
options->Store();
// 重置智能指针
smarts.reset();
plugins.reset();
options.reset();
CoUninitialize();
//卸载所有该线程加载的dll,释放任何资源,强制断开dll连接
CDialogSK::OnClose();
}
//销毁消息响应函数
void CLaunchyDlg::OnDestroy()
{
OnClose();
CDialogSK::OnDestroy();
}
//在消息被送给TranslateMessage函数之前处理消息
BOOL CLaunchyDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_SYSKEYDOWN) {
//系统按键按下消息
if (pMsg->wParam==VK_BACK) {
//BACKSPACE key
InputBox.DeleteWord();
return true;
}
}
if(pMsg->message==WM_KEYDOWN)
//非系统按键按下消息
{
if (GetKeyState(VK_CONTROL) < 0) {
// Control+BACKSPACE
if (pMsg->wParam==VK_BACK) {
InputBox.DeleteLine();
return true;
}else if (pMsg->wParam==VK_RETURN)//Control+Enter 直接搜索
{
CString SearchWord,SearchUrl;
SearchUrl="http://www.google.com/search?hl=zh-CN&safe=strict&q=";
InputBox.GetWindowText(SearchWord);
SearchWord.Replace(' ','+');
SearchWord=SearchUrl+SearchWord;
ExeLauncher search;
search.Run(SearchWord);
}
}
else if (pMsg->wParam==VK_DOWN) {
//DOWN
//如果下拉列表没有显示且输入内容不为空则显示下拉列表
if (!InputBox.GetDroppedState() && InputBox.typed != _T("")) {
InputBox.ShowDropDown(true);
}
}
else if (pMsg->wParam==VK_UP) {
//UP
//如果下拉列表没有显示且输入内容不为空则显示下拉列表
if (!InputBox.GetDroppedState() && InputBox.typed != _T("")) {
InputBox.ShowDropDown(true);
}
}
else if (pMsg->wParam==VK_TAB) {
//TAB
if ( searchTxt != L"")
InputBox.TabSearchTxt();
//应用tab定义的功能
return true;
}
else {
if (InputBox.GetDroppedState()) {
InputBox.ShowDropDown(false);
InputBox.SetEditSel(InputBox.GetWindowTextLengthW(), InputBox.GetWindowTextLengthW());
}
}
SetTimer(DELAY_TIMER, 1000, NULL);
if(pMsg->wParam==VK_RETURN) {
//按下回车键
HideLaunchy();
CString MatchPath = smarts->GetMatchPath(0);//获取第一个匹配项的完全路径
//刚输入完第一个匹配的不是最后选择的,
if (MatchPath != InputBox.searchPath && SearchStrings.GetCount() == 0) {
options->Associate(InputBox.typed, MatchPath);
options->Store();
}
KillTimer(DELAY_TIMER);
//结束下拉列表显示延迟计时
smarts->Launch();
//运行匹配项
pMsg->wParam = NULL;
//消息置空
}
if (pMsg->wParam==VK_ESCAPE) {//ESC键
HideLaunchy();
//隐藏主界面
pMsg->wParam = NULL;
//消息置空
}
InputBox.CleanText();
}
if (pMsg->message == WM_CHAR) {
SetTimer(DELAY_TIMER, 1000, NULL);
InputBox.CleanText();
}
return CDialogSK::PreTranslateMessage(pMsg);
}
//计时器响应函数
void CLaunchyDlg::OnTimer(UINT_PTR nIDEvent)
{
if (nIDEvent == DELAY_TIMER) {
if (Visible && !InputBox.GetDroppedState() && InputBox.GetWindowTextLengthW() > 0 &&
InputBox.GetCount() > 1) {
InputBox.SetCurSel(-1);
InputBox.ShowDropDown(true);
InputBox.ReformatDisplay();
InputBox.ParseSearchTxt();
InputBox.CleanText();
}
KillTimer(DELAY_TIMER);
CDialogSK::OnTimer(nIDEvent);
}
else if (nIDEvent == UPDATE_TIMER) {
smarts->LoadCatalog();
KillTimer(UPDATE_TIMER);
if (options->indexTime != 0)
SetTimer(UPDATE_TIMER, options->indexTime * 60000, NULL);
}
}
//右键菜单响应函数
void CLaunchyDlg::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
{
// 加载右键菜单
CMenu mnuPopupSubmit;
mnuPopupSubmit.LoadMenu(IDR_MENU1);
// 获得第一个菜单项的指针
CMenu *mnuPopupMenu = mnuPopupSubmit.GetSubMenu(0);
ASSERT(mnuPopupMenu);
//获取选择的菜单项
DWORD selection = mnuPopupMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON| TPM_NONOTIFY | TPM_RETURNCMD, point.x, point.y, this);
if (selection == ID_SETTINGS_SKINS) {//设置皮肤
SkinChooser dlg;
ShowingDialog = true;
dlg.DoModal();
ShowingDialog = false;
applySkin();
//应用皮肤
options->Store();
//存储设置信息
}
else if (selection == ID_SETTINGS_PLUGINS) {//设置插件
CPluginDialog dlg;
ShowingDialog = true;
dlg.DoModal();
ShowingDialog = false;
smarts->LoadCatalog();
//重新建立索引
}
else if (selection == ID_SETTINGS_HOTKEY) {//设置热键
CHotkeyDialog dlg;
ShowingDialog = true;
dlg.DoModal();
ShowingDialog = false;
options->Store();
//存储设置信息
}
else if (selection == ID_SETTINGS_DIRECTORIES) {//设置文件夹
ShowingDialog = true;
DirectoryChooser dlg;
dlg.DoModal();
ShowingDialog = false;
options->Store();
//存储设置信息
smarts->LoadCatalog();
}
else if (selection == ID_SETTINGS_ADVANCED) {//高级选项
AdvancedOptions dlg;
ShowingDialog = true;
dlg.DoModal();
ShowingDialog = false;
options->Store();
//存储设置信息
// 应用任何改变到窗口,如是否固定位置显示
this->applySkin();
}
else if (selection == ID_SETTINGS_REBUILD) {//重新建立索引
smarts->LoadCatalog();
}
else if (selection == ID_SETTINGS_ABOUT) {//关于对话框
AboutDialog dlg;
ShowingDialog = true;
dlg.DoModal();
ShowingDialog = false;
}
else if (selection == ID_EXIT) {//退出
this->EndDialog(1);
}
}
//应用皮肤
void CLaunchyDlg::applySkin()
{
RECT previousPos;
this->GetWindowRect(&previousPos);
//获得之前的显示区域
if (options->skin == NULL) {
//若没有选择皮肤
options->SetSkin(_T("Default"));
//设置为默认皮肤
if (options->skin == NULL) {
//设置失败,即没有默认皮肤
return;
//返回
}
}
if (border.inuse) {
border.inuse = false;
border.DestroyWindow();
}
if (options->skin->resultBorder) {
SetWindowLong(Preview.GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(Preview.GetSafeHwnd(), GWL_EXSTYLE) | WS_EX_CLIENTEDGE);
} else {
SetWindowLong(Preview.GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(Preview.GetSafeHwnd(), GWL_EXSTYLE) & ~WS_EX_CLIENTEDGE);
}
InputBox.m_RemoveFrame = !options->skin->inputBorder;
InputBox.m_Transparent = options->skin->inputTransparent;
// After changing the windowlong, the window needs to get moved to update it.. so send
// it to the top left corner for now and we'll move it back into position later.
RECT r;
r.top = 0;
r.left = 0;
Preview.MoveWindow(&r,1);
SetBitmap(options->skin->bgFile);
SetStyle (LO_STRETCH); // resize dialog to
if (options->skin->translucensy != -1) {
SetTransparent(options->skin->translucensy);
} else {
SetTransparentColor(options->skin->trans_rgb); // set red as
}
if (options->skin->alphaBorderFile == "") {
border.inuse = false;
} else {
if (!border.inuse) {
int ret = border.Create(IDD_ALPHA_BORDER, this);
}
border.ShowWindow(false);
border.SetImage(options->skin->alphaBorderFile);
border.inuse = true;
RECT r;
GetWindowRect(&r);
border.MoveWindow(r.left + options->skin->alphaRect.left, r.top + options->skin->alphaRect.top, r.right, r.bottom, 1);
ShowWindows(IsWindowVisible() != 0);
}
CFont* old1;
CFont* old2;
CFont* old3;
old1 = m_FontInput;
old2 = m_FontResult;
old3 = m_FontInputSmall;
m_FontInput = new CFont;
m_FontResult = new CFont;
m_FontInputSmall = new CFont;
m_FontInputSmall->CreateFontW(
options->skin->inputSmall_fontSize, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
options->skin->inputSmall_bold,
// nWeight
options->skin->inputSmall_italics, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
options->skin->inputSmall_fontName); // lpszFacename
m_FontInput->CreateFontW(
options->skin->input_fontSize, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
options->skin->input_bold,
// nWeight
options->skin->input_italics, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
options->skin->input_fontName); // lpszFacename
// Fonts
m_FontResult->CreateFontW(
options->skin->results_fontSize, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
options->skin->results_bold, // nWeight
options->skin->results_italics, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
options->skin->results_fontName); // lpszFacename
InputBox.SetSmallFont(m_FontInputSmall,options->skin->inputSmallFontRGB);
InputBox.SetFont(m_FontInput,1);
Preview.SetFont(m_FontResult,1);
// Free the old fonts!
if (old1 != NULL && old2 != NULL) {
old1->DeleteObject();
old2->DeleteObject();
old3->DeleteObject();
delete(old1);
delete(old2);
delete(old3);
}
InputBox.SetTextColor(options->skin->inputFontRGB);
Preview.SetTextColor(options->skin->resultFontRGB);
Preview.m_isBackTransparent = options->skin->resultTransparent;
InputBox.SetBackColor(options->skin->inputRGB);
Preview.SetBackColor(options->skin->resultRGB);
IconPreview.m_GrabBkgnd = true;
// Set always on top or not
this->SetWindowLayer(options->aot);
if (previousPos.top != 0 || previousPos.left != 0)
MoveWindow(previousPos.left, previousPos.top, options->skin->backRect.Width(), options->skin->backRect.Height(),1);
else
MoveWindow(options->posX, options->posY, options->skin->backRect.Width(), options->skin->backRect.Height(),1);
InputBox.MoveWindow(options->skin->inputRect,1);
Preview.MoveWindow(options->skin->resultRect,1);
IconPreview.MoveWindow(options->skin->iconRect,1);
RedrawWindow();
}
//当索引数据准备好时调用
LRESULT CLaunchyDlg::OnDBDone(UINT wParam, LONG lParam) {
options->set_Indexing(false);//索引建立完毕
smarts->Update(searchTxt, false);//更新搜索结果
return true;