private { import std.utf; import std.string; import std.path; import basewindow; import entry; import skin; import resource; import tabwindow; import inifile; import utils; import config; import vector; import dialogs; } enum { WM_NOTIFYICON = WM_USER } alias Vector!(TabWindowThread) TabThreads; alias Vector!(TabWindow) TabWindows; class MainWindow : BaseWindow { private: NOTIFYICONDATA nIconData; TabThreads threads; TabWindows tabs; public: this() { threads = new TabThreads; tabs = new TabWindows; } extern(Windows) uint WindowProc(HWND hWnd, uint uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CREATE: OnCreate(hWnd, cast(LPCREATESTRUCT)lParam); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDM_TASKTRAY_CREATETAB: OnCommandCreateTab(hWnd); break; case IDM_TASKTRAY_ABOUT: break; case IDM_TASKTRAY_EXIT: SendMessage(hWnd, WM_CLOSE, 0, 0); break; default: break; } break; case WM_NOTIFYICON: switch (lParam) { case WM_RBUTTONUP: OnNotifyIconRightButtonUp(hWnd); break; default: break; } break; case WM_CLOSE: OnClose(hWnd); break; default: return BaseWindow.WindowProc(hWnd, uMsg, wParam, lParam); } return 0; } // ウィンドウ生成前処理 void PreCreateWindow(inout WNDCLASSEX wcex) { wcex.hIcon = cast(HICON) LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MAIN), IMAGE_ICON, 32, 32, LR_DEFAULTSIZE | LR_DEFAULTCOLOR); } // 初期化処理 void OnCreate(HWND hWnd, LPCREATESTRUCT lpcs) { // タスクトレイへの登録は書き直す必要がある // 参照 http://support.microsoft.com/default.aspx?scid=kb;ja;418138 nIconData.cbSize = NOTIFYICONDATA.sizeof; nIconData.uID = 1; nIconData.hWnd = hWnd; nIconData.uFlags = NIF_MESSAGE | NIF_ICON; nIconData.hIcon = cast(HICON) LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MAIN), IMAGE_ICON, 16, 16, LR_DEFAULTSIZE | LR_DEFAULTCOLOR); nIconData.uCallbackMessage = WM_NOTIFYICON; Shell_NotifyIcon(NIM_ADD, &nIconData); // 既存のタブ設定をロード for (int i = 0; i < TabSettings.GetInstance().settings.size(); i++) { tab_setting config = TabSettings.GetInstance().settings[i]; config.entry = LoadEntry(Config.GetInstance().GetGroupFullPath() ~"\\"~ TabSettings.GetInstance.settings[i].group_name); config.hParentWnd = hWnd; config.action = TabSettings.GetInstance().settings[i].action; // CreateTab(config); TabWindowThread tab = new TabWindowThread(config); threads.add(tab); tab.start(); } // ShowWindow(hWnd, SW_SHOW); ShowWindow(hWnd, SW_HIDE); } void CreateTab(tab_setting config) { char[] skin_path = Config.GetInstance().GetSkinFullPath() ~ "\\" ~ config.action.skin_name ~ "\\skin.ini"; SkinParts skin_parts = LoadSkinParts(skin_path); Skin tab = skin_parts["tab"]; TabWindow window = new TabWindow(config, tab); window.CreateEx(WS_EX_TOOLWINDOW | WS_EX_LAYERED, toUTF16z(std.string.toString(config.index) ~ "." ~ config.name), toUTF16z(config.name), WS_POPUP | WS_CLIPCHILDREN, config.x, config.y, tab.Width, tab.GetChild("caption").Height, NULL, NULL, NULL); TabWindowThread tab_thread = new TabWindowThread(window); threads.add(tab_thread); tab_thread.start(); } // タブ生成コマンド void OnCommandCreateTab(HWND hWnd) { tab_setting config; config.action = Config.GetInstance.common; TabSettingDialog dlg = new TabSettingDialog(&config); if (dlg.CreateModal(hWnd) == IDOK) { config.hParentWnd = hWnd; config.entry = LoadEntry(Config.GetInstance().GetGroupFullPath() ~ "\\" ~ config.group_name); config.index = TabSettings.GetInstance().settings.size(); config.x = 500; config.y = 500; TabSettings.GetInstance().settings.add(config); // CreateTab(config); TabWindowThread tab = new TabWindowThread(config); threads.add(tab); tab.start(); } } // タスクトレイアイコンが右クリックされた void OnNotifyIconRightButtonUp(HWND hWnd) { SetForegroundWindow(hWnd); POINT pt; HMENU hMenu = LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(IDM_TASKTRAY)); HMENU hSubMenu = GetSubMenu(hMenu, 0); GetCursorPos(&pt); TrackPopupMenu(hSubMenu, TPM_BOTTOMALIGN, pt.x, pt.y, 0, hWnd, NULL); DestroyMenu(hMenu); } // Close処理 void OnClose(HWND hWnd) { Shell_NotifyIcon(NIM_DELETE, &nIconData); TabSettings.GetInstance().SaveToFile(); PostQuitMessage(0); } }