diff --git a/Lang/zh.h b/Lang/zh.h index 8a09b40..97bd3a4 100644 --- a/Lang/zh.h +++ b/Lang/zh.h @@ -57,7 +57,7 @@ #define MenuRemovePlugin L"移除插件" #define MenuPluginRankUp L"上移" #define MenuPluginRankDown L"下移" -#define DefaultFont L"黑体" +#define DefaultFont L"微软雅黑" #define InVaildPlugin L"无效的插件" #define CantLoadQtLoader L"无法加载QtLoader.dll" #define LblPluginNotify L"依赖于Qt的插件仅会在启动时载入。" diff --git a/LunaHost/GUI/CMakeLists.txt b/LunaHost/GUI/CMakeLists.txt index c173e1b..899cb92 100644 --- a/LunaHost/GUI/CMakeLists.txt +++ b/LunaHost/GUI/CMakeLists.txt @@ -1,5 +1,5 @@ add_executable(LunaHost WIN32 confighelper.cpp controls.cpp main.cpp processlistwindow.cpp LunaHost.cpp window.cpp luna.rc pluginmanager.cpp Plugin/pluginexample.cpp app.manifest) target_precompile_headers(LunaHost REUSE_FROM pch) set_target_properties(LunaHost PROPERTIES OUTPUT_NAME "LunaHost${bitappendix}") -target_link_libraries(LunaHost pch host ${YY_Thunks_for_WinXP}) +target_link_libraries(LunaHost comctl32 pch host ${YY_Thunks_for_WinXP}) add_subdirectory(Plugin) \ No newline at end of file diff --git a/LunaHost/GUI/LunaHost.cpp b/LunaHost/GUI/LunaHost.cpp index b9bcac3..3ff1f07 100644 --- a/LunaHost/GUI/LunaHost.cpp +++ b/LunaHost/GUI/LunaHost.cpp @@ -33,18 +33,21 @@ void LunaHost::on_close(){ Sleep(100); } void LunaHost::on_size(int w,int h){ - int height = h-140; + int height = h-110; w-=20; - g_selectprocessbutton->setgeo(10,10,w/3,40); - btnshowsettionwindow->setgeo(10+w/3,10,w/3,40); - btnplugin->setgeo(10+w*2/3,10,w/3,40); - g_hListBox_listtext->setgeo(10, 110, w , height/2); - g_showtexts->setgeo(10, 120+height/2, w , height/2); - g_hEdit_userhook->setgeo(10,60,w*2/3,40); - g_hButton_insert->setgeo(10+w*2/3,60,w/3,40); + auto _w=w-20; + g_selectprocessbutton->setgeo(10,10,_w/3,30); + btnshowsettionwindow->setgeo(10+10+_w/3,10,_w/3,30); + btnplugin->setgeo(10+20+_w*2/3,10,_w/3,30); + g_hListBox_listtext->setgeo(10, 90, w , height/2); + g_showtexts->setgeo(10, 100+height/2, w , height/2); + g_hEdit_userhook->setgeo(10,50,_w*2/3+10,30); + g_hButton_insert->setgeo(10+20+_w*2/3,50,_w/3,30); } LunaHost::LunaHost(){ + + setfont(25); configs=new confighelper; settext(WndLunaHostGui); btnshowsettionwindow=new button(this, BtnShowSettingWindow,100,100,100,100); @@ -138,7 +141,6 @@ LunaHost::LunaHost(){ std::bind(&LunaHost::on_text_recv,this,std::placeholders::_1,std::placeholders::_2) ); - setfont(25); setcentral(1000,600); } @@ -181,9 +183,9 @@ void LunaHost::on_thread_delete(TextThread& thread){ } Settingwindow::Settingwindow(LunaHost* host):mainwindow(host){ - new label(this,LblFlushDelay,10, 10, 150, 40); - new label(this,LblCodePage,10, 60, 150, 40); - ckbfilterrepeat=new checkbox(this,LblFilterRepeat,10, 160, 200, 40); + new label(this,LblFlushDelay,10, 10, 150, 30); + new label(this,LblCodePage,10, 50, 150, 30); + ckbfilterrepeat=new checkbox(this,LblFilterRepeat,10, 130, 200, 30); ckbfilterrepeat->onclick=[=](){ auto ck=ckbfilterrepeat->ischecked(); TextThread::filterRepetition=ck; @@ -191,7 +193,7 @@ Settingwindow::Settingwindow(LunaHost* host):mainwindow(host){ }; ckbfilterrepeat->setcheck(host->configs->get("filterrepeat",false)); - g_check_clipboard =new checkbox(this,BtnToClipboard,10, 110, 200, 40) ; + g_check_clipboard =new checkbox(this,BtnToClipboard,10, 90, 200, 30) ; g_check_clipboard->onclick=[=](){ auto ck=g_check_clipboard->ischecked(); ((LunaHost*)parent)->check_toclipboard=ck; @@ -199,8 +201,8 @@ Settingwindow::Settingwindow(LunaHost* host):mainwindow(host){ }; g_check_clipboard->setcheck(host->configs->get("ToClipboard",false)); - g_timeout = new spinbox(this,std::to_wstring(host->configs->get("flushDelay",TextThread::flushDelay)).c_str(),160, 10, 100, 40) ; - g_codepage = new spinbox(this,std::to_wstring(host->configs->get("codepage",Host::defaultCodepage)).c_str(),160, 60, 100, 40) ; + g_timeout = new spinbox(this,std::to_wstring(host->configs->get("flushDelay",TextThread::flushDelay)).c_str(),150, 10, 100, 30) ; + g_codepage = new spinbox(this,std::to_wstring(host->configs->get("codepage",Host::defaultCodepage)).c_str(),150, 50, 100, 30) ; g_timeout->onvaluechange=[=](int v){ TextThread::flushDelay=v; host->configs->set("flushDelay",v); @@ -213,11 +215,11 @@ Settingwindow::Settingwindow(LunaHost* host):mainwindow(host){ } }; g_codepage->setminmax(0,CP_UTF8); - setcentral(300,300); + setcentral(300,240); settext(WndSetting); } void Pluginwindow::on_size(int w,int h){ - listplugins->setgeo(10,80,w-20,h-100); + listplugins->setgeo(10,80,w-20,h-90); } Pluginwindow::Pluginwindow(mainwindow*p,Pluginmanager* pl):mainwindow(p){ pluginmanager=pl; diff --git a/LunaHost/GUI/controls.cpp b/LunaHost/GUI/controls.cpp index 9597a55..544f8bb 100644 --- a/LunaHost/GUI/controls.cpp +++ b/LunaHost/GUI/controls.cpp @@ -1,13 +1,13 @@ #include"controls.h" #include"window.h" -#include control::control(mainwindow*_parent){ parent=_parent; parent->controls.push_back(this); + } void control::dispatch(WPARAM){} - +void control::dispatch_2(WPARAM wParam, LPARAM lParam){}; button::button(mainwindow* parent,LPCWSTR text,int x,int y,int w,int h,DWORD style):control(parent){ winId=CreateWindowEx(0, L"BUTTON", text, WS_CHILD | WS_VISIBLE |style , x, y, w, h, parent->winId , NULL, NULL, NULL); @@ -138,4 +138,75 @@ int listbox::count(){ } int listbox::insertitem(int i,LPCWSTR t){ return SendMessage(winId, LB_INSERTSTRING, i, (LPARAM)t); +} + +listview::listview(mainwindow* parent,int x,int y,int w,int h):control(parent){ + winId=CreateWindowEx(0, WC_LISTVIEW, NULL, WS_VISIBLE |WS_VSCROLL| WS_CHILD | LVS_REPORT |LVS_SINGLESEL, x, y, w, h, parent->winId, NULL,NULL, NULL); + ListView_SetExtendedListViewStyle(winId, LVS_EX_FULLROWSELECT); // Set extended styles + setfont(22); + hImageList = ImageList_Create(22,22, //GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), + ILC_COLOR32, 1 ,1); + ListView_SetImageList(winId, hImageList, LVSIL_SMALL); +} +int listview::insertcol(int i,const std::wstring& text){ + LVCOLUMN lvc; + lvc.mask = LVCF_TEXT; + lvc.pszText = const_cast(text.c_str()); + //lvc.cx = 100; + return ListView_InsertColumn(winId, i, &lvc); +} +int listview::insertitem(int row,const std::wstring& text,HICON hicon){ + + LVITEM lvi; + lvi.mask = LVIF_TEXT | LVIF_IMAGE; + lvi.pszText = const_cast(text.c_str()); + lvi.iItem = row; + lvi.iSubItem = 0; + lvi.iImage = ImageList_AddIcon(hImageList, hicon); + return ListView_InsertItem(winId, &lvi); +} +int listview::additem(const std::wstring& text,HICON hicon){ + return insertitem(count(),text,hicon); +} +void listview::clear(){ + ListView_DeleteAllItems(winId); +} +int listview::count(){ + return ListView_GetItemCount(winId); +} +void listview::dispatch_2(WPARAM wParam, LPARAM lParam){ + NMHDR* pnmhdr = (NMHDR*)lParam; + switch (pnmhdr->code){ + + case LVN_ITEMCHANGED: + { + NMLISTVIEW* pnmListView = (NMLISTVIEW*)lParam; + if ((pnmListView->uChanged & LVIF_STATE) && (pnmListView->uNewState & LVIS_SELECTED)) + { + oncurrentchange(pnmListView->iItem); + } + break; + } + } +} +std::wstring listview::text(int row,int col){ + std::wstring text;text.resize(65535); + LV_ITEM _macro_lvi; + _macro_lvi.iSubItem = (col); + _macro_lvi.cchTextMax = (65535); + _macro_lvi.pszText = (text.data()); + SNDMSG((winId), LVM_GETITEMTEXT, (WPARAM)(row), (LPARAM)(LV_ITEM *)&_macro_lvi); + return text.c_str(); +} +void listview::setheader(const std::vector& headers){ + for(int i=0;i class control:public basewindow{ public: mainwindow* parent; control(mainwindow*); virtual void dispatch(WPARAM); - + virtual void dispatch_2(WPARAM wParam, LPARAM lParam); std::functiononcontextmenu=[](){return (HMENU)nullptr;}; std::functiononcontextmenucallback=[](WPARAM){}; }; @@ -62,4 +63,20 @@ public: LONG_PTR getdata(int); int count(); }; +class listview:public control{ + int headernum=1; + HIMAGELIST hImageList; +public: + listview(mainwindow*,int,int,int,int); + int insertitem(int,const std::wstring&,HICON hicon); + int insertcol(int,const std::wstring& ); + void clear(); + int count(); + std::function oncurrentchange=[](int){}; + std::wstring text(int,int=0); + void setheader(const std::vector&); + void autosize(); + int additem(const std::wstring&,HICON hicon); + void listview::dispatch_2(WPARAM wParam, LPARAM lParam); +}; #endif \ No newline at end of file diff --git a/LunaHost/GUI/processlistwindow.cpp b/LunaHost/GUI/processlistwindow.cpp index 9315e2a..ff7c55a 100644 --- a/LunaHost/GUI/processlistwindow.cpp +++ b/LunaHost/GUI/processlistwindow.cpp @@ -4,6 +4,7 @@ #include"host.h" #include"processlistwindow.h" #include"Lang/Lang.h" +#include std::unordered_map> getprocesslist() { std::unordered_map>exe_pid; @@ -42,17 +43,20 @@ std::unordered_map> getprocesslist() } return exe_pid; } -void processlistwindow::PopulateProcessList(listbox* _listbox,std::unordered_map>&exe_pid){ + +void processlistwindow::PopulateProcessList(listview* _listbox,std::unordered_map>&exe_pid){ _listbox->clear(); for(auto& exe:exe_pid){ - _listbox->additem(exe.first.c_str()); + auto hicon=GetExeIcon(exe.first.c_str()); + _listbox->additem(exe.first.c_str(),hicon); + DestroyIcon(hicon); } } processlistwindow::processlistwindow(mainwindow* p):mainwindow(p){ - g_hEdit = new textedit(this,L"",10, 10, 400, 40,ES_AUTOHSCROLL); - g_hButton=new button(this,BtnAttach,420, 10, 100, 40); - g_refreshbutton =new button(this,BtnRefresh,530, 10, 100, 40); + g_hEdit = new textedit(this,L"",10, 10, 400, 30,ES_AUTOHSCROLL); + g_hButton=new button(this,BtnAttach,420, 10, 100, 30); + g_refreshbutton =new button(this,BtnRefresh,530, 10, 100, 30); g_hButton->onclick=[&](){ auto str=g_hEdit->text(); if(str.size()){ @@ -72,7 +76,8 @@ processlistwindow::processlistwindow(mainwindow* p):mainwindow(p){ g_exe_pid=getprocesslist(); PopulateProcessList(g_hListBox,g_exe_pid); }; - g_hListBox = new listbox(this,10, 60, 310, 200); + g_hListBox = new listview(this,10, 60, 310, 200); + g_hListBox->setheader({L""}); g_hListBox->oncurrentchange=[&](int idx){ auto pids=g_exe_pid[g_hListBox->text(idx)]; @@ -94,5 +99,11 @@ void processlistwindow::on_show(){ PopulateProcessList(g_hListBox,g_exe_pid); } void processlistwindow::on_size(int w,int h){ - g_hListBox->setgeo(10,60,w-20,h-70); + w=w-20; + auto _w=w-20; + g_hEdit->setgeo(10,10,_w/2,30); + g_hButton->setgeo(10+_w/2+10,10,_w/4,30); + g_refreshbutton->setgeo(10+_w/2+_w/4+20,10,_w/4,30); + g_hListBox->setgeo(10,50,w,h-60); + g_hListBox->autosize(); } \ No newline at end of file diff --git a/LunaHost/GUI/processlistwindow.h b/LunaHost/GUI/processlistwindow.h index b03606e..cfd3f57 100644 --- a/LunaHost/GUI/processlistwindow.h +++ b/LunaHost/GUI/processlistwindow.h @@ -5,10 +5,10 @@ class processlistwindow:public mainwindow{ textedit* g_hEdit; button* g_hButton; - listbox* g_hListBox; + listview* g_hListBox; button* g_refreshbutton; std::unordered_map> g_exe_pid; - void PopulateProcessList(listbox*,std::unordered_map>&); + void PopulateProcessList(listview*,std::unordered_map>&); public: processlistwindow(mainwindow* parent=0); void on_size(int w,int h); diff --git a/LunaHost/GUI/window.cpp b/LunaHost/GUI/window.cpp index 8c44cc7..348da52 100644 --- a/LunaHost/GUI/window.cpp +++ b/LunaHost/GUI/window.cpp @@ -1,6 +1,15 @@ #include"window.h" #include"controls.h" #include"Lang/Lang.h" +#include +HICON GetExeIcon(const wchar_t* filePath) { + SHFILEINFO fileInfo; + HICON hIcon = NULL; + if (SHGetFileInfo(filePath, 0, &fileInfo, sizeof(fileInfo), SHGFI_ICON | SHGFI_LARGEICON)) { + hIcon = fileInfo.hIcon; + } + return hIcon; +} void basewindow::setfont(int sz,LPCWSTR fn){ if(fn==0)fn=DefaultFont; hfont=CreateFont(sz, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, @@ -51,6 +60,17 @@ LRESULT mainwindow::wndproc(UINT message, WPARAM wParam, LPARAM lParam){ on_size(width,height); break; } + case WM_NOTIFY: + { + NMHDR* pnmhdr = (NMHDR*)lParam; + for(auto ctl:controls) + { + if(pnmhdr->hwndFrom==ctl->winId) + { + ctl->dispatch_2(wParam,lParam);break; + } + } + } case WM_COMMAND: { if(lParam==0){ @@ -133,7 +153,8 @@ mainwindow::mainwindow(mainwindow* _parent){ wc.hInstance = GetModuleHandle(0); wc.lpszClassName = CLASS_NAME; wc.hbrBackground = (HBRUSH)(COLOR_WINDOW ); - wc.hIcon=LoadIconW(GetModuleHandle(0),L"IDI_ICON1"); + wc.hIcon= GetExeIcon(GetModuleFilename().value().c_str());//LoadIconW(GetModuleHandle(0),L"IDI_ICON1"); + static auto _=RegisterClass(&wc); HWND hWnd = CreateWindowEx( WS_EX_CLIENTEDGE,CLASS_NAME,CLASS_NAME,WS_OVERLAPPEDWINDOW, diff --git a/LunaHost/GUI/window.h b/LunaHost/GUI/window.h index 2329eb0..651981b 100644 --- a/LunaHost/GUI/window.h +++ b/LunaHost/GUI/window.h @@ -28,4 +28,5 @@ public: void setcentral(int,int); std::paircalculateXY(int w,int h); }; +HICON GetExeIcon(const wchar_t* filePath); #endif \ No newline at end of file