INT_PTR CALLBACK OptDlgProc(HWND hDlg,UINT msg,WPARAM wparam,LPARAM lparam) { RECT rect; plgsettings *ps; //0: current; 1: original logmsg("OptDlgProc"); switch(msg){ case WM_INITDIALOG: logmsg("OptDlgProc::INITDIALOG"); TranslateDialogDefault(hDlg); ps=(plgsettings*)malloc(sizeof(plgsettings)*2); loadDBSettings(&ps[0]); ps[1]=ps[0]; SetWindowLongPtr(hDlg, GWLP_USERDATA, (LONG_PTR)ps); SetWindowLongPtr(hwnd, GWL_STYLE, WS_POPUP | WS_SIZEBOX); SetWindowPos(hwnd, 0, 0, 0, 0, 0, SWP_NOZORDER|SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_FRAMECHANGED); SetWindowLongPtr(GetDlgItem(hDlg,IDC_TREE1),GWL_STYLE,GetWindowLongPtr(GetDlgItem(hDlg,IDC_TREE1),GWL_STYLE)|TVS_NOHSCROLL|TVS_CHECKBOXES); SetWindowLongPtr(GetDlgItem(hDlg,IDC_TREE2),GWL_STYLE,GetWindowLongPtr(GetDlgItem(hDlg,IDC_TREE1),GWL_STYLE)|TVS_NOHSCROLL|TVS_CHECKBOXES); CheckDlgButton(hDlg, IDC_RADIO1+ps->align-1, BST_CHECKED); CheckDlgButton(hDlg, IDC_RADIO10+9-ps->salign, BST_CHECKED); CheckDlgButton(hDlg, IDC_CHECK1, ps->altShadow); CheckDlgButton(hDlg, IDC_CHECK2, ps->showMsgWindow); CheckDlgButton(hDlg, IDC_CHECK3, ps->transparent); CheckDlgButton(hDlg, IDC_CHECK4, ps->showShadow); CheckDlgButton(hDlg, IDC_CHECK5, ps->messages); SetDlgItemText(hDlg, IDC_EDIT2, ps->msgformat); CheckDlgButton(hDlg, IDC_CHECK6, ps->a_user); CheckDlgButton(hDlg, IDC_CHECK7, ps->showmystatus); SetDlgItemInt(hDlg, IDC_EDIT1, ps->distance, 0); SendDlgItemMessage(hDlg, IDC_SLIDER1, TBM_SETRANGE, 0, MAKELONG(0, 255)); SendDlgItemMessage(hDlg, IDC_SLIDER1, TBM_SETPOS, TRUE, (LPARAM)ps->alpha); { TCHAR buf[20]; mir_sntprintf(buf, SIZEOF(buf), _T("%d %%"), ps->alpha*100/255); SetDlgItemText(hDlg, IDC_ALPHATXT, buf); } SetDlgItemInt(hDlg, IDC_EDIT5, ps->timeout, 0); FillCheckBoxTree(GetDlgItem(hDlg, IDC_TREE1), ps->announce); FillCheckBoxTree(GetDlgItem(hDlg, IDC_TREE2), ps->showWhen); return 0; case WM_HSCROLL: if (LOWORD(wparam)==SB_ENDSCROLL||LOWORD(wparam)==SB_THUMBPOSITION||LOWORD(wparam)==SB_ENDSCROLL) return 0; ps=(plgsettings*)GetWindowLongPtr(hDlg, GWLP_USERDATA); ps->alpha=SendDlgItemMessage(hDlg, IDC_SLIDER1, TBM_GETPOS, 0, 0); { TCHAR buf[20]; mir_sntprintf(buf, SIZEOF(buf), _T("%d %%"), ps->alpha*100/255); SetDlgItemText(hDlg, IDC_ALPHATXT, buf); } goto xxx; case WM_DESTROY: logmsg("OptDlgProc::DESTROY"); ps=(plgsettings*)GetWindowLongPtr(hDlg, GWLP_USERDATA); ps[0]=ps[1]; saveDBSettings(&ps[0]); SetWindowLongPtr(hwnd, GWL_STYLE, WS_POPUP); SetWindowPos(hwnd, 0, 0, 0, 0, 0, SWP_NOZORDER|SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_FRAMECHANGED); SetWindowPos(hwnd, 0, ps->winxpos, ps->winypos, ps->winx, ps->winy, SWP_NOZORDER|SWP_NOACTIVATE); SetLayeredWindowAttributes(hwnd, ps->bkclr, ps->alpha, (ps->transparent?LWA_COLORKEY:0)|LWA_ALPHA); free((void*)GetWindowLongPtr(hDlg, GWLP_USERDATA)); return 0; case WM_COMMAND: logmsg("OptDlgProc::COMMAND"); ps=(plgsettings*)GetWindowLongPtr(hDlg, GWLP_USERDATA); switch (LOWORD(wparam)) { case IDC_BUTTON7: MessageBox(hDlg, TranslateT("Variables:\n %n : Nick\n %m : Message\n %l : New line"), TranslateT("Help"), MB_ICONINFORMATION|MB_OK); return 0; case IDC_BUTTON5: SendMessage(hwnd, WM_USER+1, (WPARAM)TranslateT("Miranda NG is great and this is a long message."), 0); break; case IDC_BUTTON1: selectFont(hDlg, &(ps->lf)); break; case IDC_BUTTON2: selectColor(hDlg, &ps->clr_status); break; case IDC_BUTTON6: selectColor(hDlg, &ps->clr_msg); break; case IDC_BUTTON3: selectColor(hDlg, &ps->clr_shadow); break; case IDC_BUTTON4: selectColor(hDlg, &ps->bkclr); break; case IDC_CHECK4: ps->showShadow=IsDlgButtonChecked(hDlg, IDC_CHECK4); break; case IDC_CHECK1: ps->altShadow=IsDlgButtonChecked(hDlg, IDC_CHECK1); break; case IDC_CHECK2: ps->showMsgWindow=IsDlgButtonChecked(hDlg, IDC_CHECK2); case IDC_EDIT1: ps->distance=GetDlgItemInt(hDlg, IDC_EDIT1, 0, 0); break; case IDC_EDIT5: ps->timeout=GetDlgItemInt(hDlg, IDC_EDIT5, 0, 0); break; case IDC_CHECK3: ps->transparent=IsDlgButtonChecked(hDlg, IDC_CHECK3); break; case IDC_CHECK5: ps->messages=IsDlgButtonChecked(hDlg, IDC_CHECK5); break; case IDC_CHECK6: ps->a_user=IsDlgButtonChecked(hDlg, IDC_CHECK6); break; case IDC_CHECK7: ps->showmystatus=IsDlgButtonChecked(hDlg, IDC_CHECK7); break; case IDC_RADIO1: case IDC_RADIO2: case IDC_RADIO3: case IDC_RADIO4: case IDC_RADIO5: case IDC_RADIO6: case IDC_RADIO7: case IDC_RADIO8: case IDC_RADIO9: if (IsDlgButtonChecked(hDlg, LOWORD(wparam))) ps->align=LOWORD(wparam)-IDC_RADIO1+1; break; case IDC_RADIO10: case IDC_RADIO11: case IDC_RADIO12: case IDC_RADIO13: case IDC_RADIO14: case IDC_RADIO15: case IDC_RADIO16: case IDC_RADIO17: case IDC_RADIO18: if (IsDlgButtonChecked(hDlg, LOWORD(wparam))) ps->salign=10-(LOWORD(wparam)-IDC_RADIO10+1); break; } xxx: saveDBSettings(ps); SetWindowPos(hwnd, 0, 0, 0, ps->winx, ps->winy, SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE); SetLayeredWindowAttributes(hwnd, db_get_dw(NULL,THIS_MODULE, "bkclr", DEFAULT_BKCLR), db_get_b(NULL,THIS_MODULE, "alpha", DEFAULT_ALPHA), (db_get_b(NULL,THIS_MODULE, "transparent", DEFAULT_TRANPARENT)?LWA_COLORKEY:0)|LWA_ALPHA); InvalidateRect(hwnd, 0, TRUE); SendMessage(GetParent(hDlg),PSM_CHANGED,0,0); return 0; case WM_NOTIFY: logmsg("OptDlgProc::NOTIFY"); switch(((LPNMHDR)lparam)->code){ case TVN_SETDISPINFO: case NM_CLICK: case NM_RETURN: case TVN_SELCHANGED: if (((LPNMHDR)lparam)->idFrom==IDC_TREE1) SendMessage(GetParent(hDlg),PSM_CHANGED,0,0); break; case PSN_APPLY: ps=(plgsettings*)GetWindowLongPtr(hDlg, GWLP_USERDATA); GetWindowRect(hwnd, &rect); ps->winx=rect.right-rect.left; ps->winy=rect.bottom-rect.top; ps->winxpos=rect.left; ps->winypos=rect.top; ps->announce=MakeCheckBoxTreeFlags(GetDlgItem(hDlg, IDC_TREE1)); ps->showWhen=MakeCheckBoxTreeFlags(GetDlgItem(hDlg, IDC_TREE2)); GetDlgItemText(hDlg, IDC_EDIT2, ps->msgformat, 255); ps[1]=ps[0]; //apply current settings at closing saveDBSettings(ps); SetLayeredWindowAttributes(hwnd, db_get_dw(NULL,THIS_MODULE, "bkclr", DEFAULT_BKCLR), db_get_b(NULL,THIS_MODULE, "alpha", DEFAULT_ALPHA), (db_get_b(NULL,THIS_MODULE, "transparent", DEFAULT_TRANPARENT)?LWA_COLORKEY:0)|LWA_ALPHA); InvalidateRect(hwnd, 0, TRUE); break; } break; } return 0; }
BOOL CALLBACK SearchRssItemDlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: { //设置窗口的透明属性。 DWORD dwExStyle = GetWindowLong(hwnd, GWL_USERDATA); dwExStyle |= WS_EX_LAYERED; SetWindowLong(hwnd, GWL_USERDATA, dwExStyle); SetLayeredWindowAttributes(hwnd, NULL, 200, LWA_ALPHA); //根据传过来的位置参数设置窗口的位置。 //要得到的是按钮的左上角坐标,作为窗口的右上角坐标。 RECT rssSearchBtnRect = *(RECT*)lParam; RECT searchRssItemDlgRect; GetClientRect(hwnd, &searchRssItemDlgRect); iWinWidth = searchRssItemDlgRect.right - searchRssItemDlgRect.left; iWinHeight = searchRssItemDlgRect.bottom - searchRssItemDlgRect.top; //设置窗口的位置。 SetWindowPos(hwnd, NULL, rssSearchBtnRect.left - iWinWidth, rssSearchBtnRect.top, iWinWidth, iWinHeight, SWP_NOSIZE | SWP_NOZORDER); //初始化搜索编辑框。 SetDlgItemText(hwnd, IDC_SearchRssItemMsgEdit, TEXT("")); } return TRUE; case WM_COMMAND: { switch (LOWORD(wParam)) { case IDC_StartSearchRssItemBtn: { //获得文本框内输入的数据。 TCHAR szSearchRssItemMsg[256] = { NULL }; GetDlgItemText(hwnd, IDC_SearchRssItemMsgEdit, szSearchRssItemMsg, sizeof(szSearchRssItemMsg)); //返回消息给RssTab窗口。 HWND hParentWnd = (HWND)GetWindowLong(hwnd, GWL_USERDATA); SendMessage(hParentWnd, WM_SEARCHITEMMSG, (WPARAM)szSearchRssItemMsg, (LPARAM)IDC_SearchRssItemBtn); DestroyWindow(hwnd); } return TRUE; default: return FALSE; } } return TRUE; case WM_MAINDLGMOVE_RssDlg: { //接收到按钮的左上角坐标。 int iXRightPixel = (int)wParam; int iYTopPixel = (int)lParam; //设置窗口的位置。 SetWindowPos(hwnd, NULL, iXRightPixel - iWinWidth, iYTopPixel, iWinWidth, iWinHeight, SWP_NOSIZE | SWP_NOZORDER); } return TRUE; case WM_DRAWITEM: { LPDRAWITEMSTRUCT lpDrawItemStruct = (LPDRAWITEMSTRUCT)lParam; switch (lpDrawItemStruct->CtlType) { case ODT_BUTTON: { DrawBkgndToButton(hwnd, wParam, lpDrawItemStruct); } return TRUE; default: return FALSE; } } return FALSE; default: return FALSE; } return FALSE; }
// MW-2006-03-20: Bug 3316 - There seems absolutely no way of preventing flicker // when transitioning from no alpha to alpha. Therefore, we need to create a new // window opened *behind* the current window; show it; redraw it; then delete // the existing window. void MCStack::setopacity(uint1 p_level) { // If the stack is not ours to open, then we do nothing ('runtime' mode/remoteable // window). if (!MCModeMakeLocalWindows()) return; // Do nothing if not NT if (MCmajorosversion < 0x0500) return; if (m_window_shape != NULL && !m_window_shape -> is_sharp) composite(); else if (window != NULL) { HWND t_old_window; t_old_window = NULL; DWORD t_old_long, t_new_long; t_old_long = GetWindowLong((HWND)window -> handle . window, GWL_EXSTYLE); if (p_level == 255) t_new_long = t_old_long & ~WS_EX_LAYERED; else t_new_long = t_old_long | WS_EX_LAYERED; if (t_new_long != t_old_long) { if (IsWindowVisible((HWND)window -> handle . window) && (t_new_long & WS_EX_LAYERED) != 0) t_old_window = (HWND)window -> handle . window; else SetWindowLong((HWND)window -> handle . window, GWL_EXSTYLE, t_new_long); } if (t_old_window != NULL) { uint32_t t_style, t_ex_style; getstyle(t_style, t_ex_style); // MW-2006-07-27: [[ Bug 3690 ]] - Make sure layered attribute is set if we need it t_ex_style = (t_ex_style & ~WS_EX_LAYERED) | (t_new_long & WS_EX_LAYERED); RECT t_rect; t_rect = getwrect(rect, t_style, t_ex_style); Bool t_is_xp_menu; t_is_xp_menu = (mode == WM_PULLDOWN || mode == WM_POPUP || mode == WM_CASCADE) && (MCcurtheme && MCcurtheme->getthemeid() == LF_NATIVEWIN); if (!t_is_xp_menu && mode < WM_PULLDOWN) window -> handle . window = (MCSysWindowHandle)CreateWindowExW(t_ex_style, MC_WIN_CLASS_NAME_W, WideCString(getname_cstring()), t_style | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, t_rect . left, t_rect . top, t_rect . right - t_rect . left, t_rect . bottom - t_rect . top, NULL, NULL, MChInst, NULL); else window -> handle . window = (MCSysWindowHandle)CreateWindowExA(t_ex_style, t_is_xp_menu ? MC_MENU_WIN_CLASS_NAME : mode >= WM_PULLDOWN ? MC_POPUP_WIN_CLASS_NAME : MC_WIN_CLASS_NAME, getname_cstring(), t_style | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, t_rect . left, t_rect . top, t_rect . right - t_rect . left, t_rect . bottom - t_rect . top, NULL, NULL, MChInst, NULL); // MW-2010-10-22: [[ Bug 8151 ]] Make sure we update the title string. if (titlestring != nil) MCscreen -> setname(window, titlestring); SetWindowLongA((HWND)window->handle.window, GWL_USERDATA, mode); if (flags & F_DECORATIONS && !(decorations & WD_SHAPE) && !(decorations & WD_CLOSE)) EnableMenuItem(GetSystemMenu((HWND)window->handle.window, False), SC_CLOSE, MF_BYCOMMAND | MF_GRAYED); if (m_window_shape != nil && m_window_shape -> is_sharp) { MCRegionRef t_region; t_region = (MCRegionRef)m_window_shape -> handle; MCRegionOffset(t_region, rect . x - t_rect . left, rect . y - t_rect . top); MCRegionSetAsWindowShape(t_region, window->handle.window); // The window now owns the region. m_window_shape -> handle = nil; } RevokeDragDrop(t_old_window); CoLockObjectExternal(droptarget, FALSE, TRUE); droptarget -> setstack(NULL); droptarget -> setstack(this); CoLockObjectExternal(droptarget, TRUE, TRUE); RegisterDragDrop((HWND)window -> handle . window, droptarget); SetWindowPos((HWND)window -> handle . window, t_old_window, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOREDRAW | SWP_NOSENDCHANGING | SWP_NOSIZE | SWP_SHOWWINDOW); MCPlayer *t_player; for(t_player = MCplayers; t_player != NULL; t_player = t_player -> getnextplayer()) if (t_player -> getstack() == this) t_player -> changewindow((MCSysWindowHandle)t_old_window); } if (p_level < 255) SetLayeredWindowAttributes((HWND)window -> handle . window, 0, p_level, LWA_ALPHA); if (t_old_window != NULL) { RedrawWindow((HWND)window -> handle . window, NULL, NULL, RDW_INVALIDATE | RDW_FRAME | RDW_UPDATENOW); DestroyWindow(t_old_window); } } }
void TopMenu::getMsg(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, DWORD time, POINT pt, UINT wRemoveMsg) { BOOL b; BOOL removed = (wRemoveMsg & PM_REMOVE); if(removed && message == WM_SYSCOMMAND) { if((wParam&0xFFF0) == TM_ALWAYS_ON_TOP) { DWORD dwStyleEx = (DWORD)GetWindowLong(hwnd, GWL_EXSTYLE); if(dwStyleEx & WS_EX_TOPMOST) { if(!SetWindowPos(hwnd, HWND_NOTOPMOST, 0,0,0,0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE)) { MessageBox(NULL, "Cannot unset top most order.", "TopMenu", MB_OK); return; } } else { if(!SetWindowPos(hwnd, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE)) { MessageBox(NULL, "Cannot unset top most order.", "TopMenu", MB_OK); return; } } } if((wParam&0xFFF0) == TM_PRIORITY_IDLE) { if(!SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS)) { MessageBox(NULL, "Cannot set priority class.", "TopMenu", MB_OK); return; } } if((wParam&0xFFF0) == TM_PRIORITY_BN) { if(!SetPriorityClass(GetCurrentProcess(), BELOW_NORMAL_PRIORITY_CLASS)) { MessageBox(NULL, "Cannot set priority class.", "TopMenu", MB_OK); return; } } if((wParam&0xFFF0) == TM_PRIORITY_NORMAL) { if(!SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS)) { MessageBox(NULL, "Cannot set priority class.", "TopMenu", MB_OK); return; } } if((wParam&0xFFF0) == TM_PRIORITY_AN) { if(!SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS)) { MessageBox(NULL, "Cannot set priority class.", "TopMenu", MB_OK); return; } } if((wParam&0xFFF0) == TM_PRIORITY_HIGH) { if(!SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS)) { MessageBox(NULL, "Cannot set priority class.", "TopMenu", MB_OK); return; } } if((wParam&0xFFF0) == TM_PRIORITY_RT) { if(!SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS)) { MessageBox(NULL, "Cannot set priority class.", "TopMenu", MB_OK); return; } } if((wParam&0xFFF0) == TM_TRANSPARENT_100) { SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED); if(!SetLayeredWindowAttributes(hwnd, RGB(0,0,0), (byte)((10 * 255)/10), LWA_ALPHA)) { MessageBox(NULL, "Cannot set layered window attributes.", "TopMenu", MB_OK); return; } } if((wParam&0xFFF0) == TM_TRANSPARENT_90) { SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED); if(!SetLayeredWindowAttributes(hwnd, RGB(0,0,0), (byte)((9 * 255)/10), LWA_ALPHA)) { MessageBox(NULL, "Cannot set layered window attributes.", "TopMenu", MB_OK); return; } } if((wParam&0xFFF0) == TM_TRANSPARENT_80) { SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED); if(!SetLayeredWindowAttributes(hwnd, RGB(0,0,0), (byte)((8 * 255)/10), LWA_ALPHA)) { MessageBox(NULL, "Cannot set layered window attributes.", "TopMenu", MB_OK); return; } } if((wParam&0xFFF0) == TM_TRANSPARENT_70) { SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED); if(!SetLayeredWindowAttributes(hwnd, RGB(0,0,0), (byte)((7 * 255)/10), LWA_ALPHA)) { MessageBox(NULL, "Cannot set layered window attributes.", "TopMenu", MB_OK); return; } } if((wParam&0xFFF0) == TM_TRANSPARENT_60) { SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED); if(!SetLayeredWindowAttributes(hwnd, RGB(0,0,0), (byte)((6 * 255)/10), LWA_ALPHA)) { MessageBox(NULL, "Cannot set layered window attributes.", "TopMenu", MB_OK); return; } } if((wParam&0xFFF0) == TM_TRANSPARENT_50) { SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED); if(!SetLayeredWindowAttributes(hwnd, RGB(0,0,0), (byte)((5 * 255)/10), LWA_ALPHA)) { MessageBox(NULL, "Cannot set layered window attributes.", "TopMenu", MB_OK); return; } } if((wParam&0xFFF0) == TM_TRANSPARENT_40) { SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED); if(!SetLayeredWindowAttributes(hwnd, RGB(0,0,0), (byte)((4 * 255)/10), LWA_ALPHA)) { MessageBox(NULL, "Cannot set layered window attributes.", "TopMenu", MB_OK); return; } } if((wParam&0xFFF0) == TM_TRANSPARENT_30) { SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED); if(!SetLayeredWindowAttributes(hwnd, RGB(0,0,0), (byte)((3 * 255)/10), LWA_ALPHA)) { MessageBox(NULL, "Cannot set layered window attributes.", "TopMenu", MB_OK); return; } } if((wParam&0xFFF0) == TM_TRANSPARENT_20) { SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED); if(!SetLayeredWindowAttributes(hwnd, RGB(0,0,0), (byte)((2 * 255)/10), LWA_ALPHA)) { MessageBox(NULL, "Cannot set layered window attributes.", "TopMenu", MB_OK); return; } } if((wParam&0xFFF0) == TM_TRANSPARENT_10) { SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED); if(!SetLayeredWindowAttributes(hwnd, RGB(0,0,0), (byte)((1 * 255)/10), LWA_ALPHA)) { MessageBox(NULL, "Cannot set layered window attributes.", "TopMenu", MB_OK); return; } } if((wParam&0xFFF0) == TM_TRANSPARENT_0) { SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED); if(!SetLayeredWindowAttributes(hwnd, RGB(0,0,0), (byte)((0 * 255)/10), LWA_ALPHA)) { MessageBox(NULL, "Cannot set layered window attributes.", "TopMenu", MB_OK); return; } } if((wParam&0xFFF0) == TM_MINIMIZE_TO_TRAY) { HWND hwndTray = CreateWindow("TrayIconMonitor", NULL, WS_POPUP, 0, 0, 0, 0, hwnd, NULL, NULL, NULL); if(!hwndTray) { MessageBox(NULL, "Cannot create tray icon window.", "TopMenu", MB_OK); return; } NOTIFYICONDATA iconData; ZeroMemory(&iconData, sizeof(iconData)); iconData.cbSize = sizeof(NOTIFYICONDATA); iconData.hWnd = hwndTray; iconData.uID = GetWindowLong(hwnd, GWL_ID); iconData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; iconData.uCallbackMessage = WM_APP; iconData.hIcon = m_hProgIcon; GetWindowText(hwnd, iconData.szTip, sizeof(iconData.szTip)); iconData.uVersion = NOTIFYICON_VERSION; if(!Shell_NotifyIcon(NIM_ADD, &iconData)) { b=DestroyWindow(hwndTray); ASSERT(b); MessageBox(NULL, "Cannot submit tray icon.", "TopMenu", MB_OK); return; } ShowWindow(hwnd, SW_HIDE); } } }
/** * Sets the opacity of this window * * @param InOpacity The new window opacity represented as a floating point scalar */ void FWindowsWindow::SetOpacity( const float InOpacity ) { SetLayeredWindowAttributes( HWnd, 0, FMath::TruncToInt( InOpacity * 255.0f ), LWA_ALPHA ); }
INT_PTR CALLBACK DlgProcAlarm(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { WindowData *wd = (WindowData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); Utils_RestoreWindowPositionNoSize(hwndDlg, 0, MODULENAME, "Notify"); SetFocus(GetDlgItem(hwndDlg, IDC_SNOOZE)); wd = new WindowData; wd->moving = false; wd->alarm = nullptr; wd->win_num = win_num++; if (wd->win_num > 0) { RECT r; GetWindowRect(hwndDlg, &r); r.top += 20; r.left += 20; SetWindowPos(hwndDlg, nullptr, r.left, r.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); Utils_SaveWindowPosition(hwndDlg, 0, MODULENAME, "Notify"); } SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)wd); // options SendMessage(hwndDlg, WMU_SETOPT, 0, 0); // fonts SendMessage(hwndDlg, WMU_SETFONTS, 0, 0); return FALSE; case WMU_REFRESH: InvalidateRect(hwndDlg, nullptr, TRUE); return TRUE; case WM_CTLCOLORSTATIC: { HDC hdc = (HDC)wParam; HWND hwndCtrl = (HWND)lParam; if (hBackgroundBrush) { if (hTitleFont && GetDlgItem(hwndDlg, IDC_TITLE) == hwndCtrl) SetTextColor(hdc, title_font_colour); else if (hWindowFont) SetTextColor(hdc, window_font_colour); SetBkMode(hdc, TRANSPARENT); return (INT_PTR)hBackgroundBrush; } } break; case WM_CTLCOLORDLG: if (hBackgroundBrush) return (INT_PTR)hBackgroundBrush; break; case WMU_SETFONTS: // fonts if (hWindowFont) SendMessage(hwndDlg, WM_SETFONT, (WPARAM)hWindowFont, TRUE); if (hTitleFont) SendDlgItemMessage(hwndDlg, IDC_TITLE, WM_SETFONT, (WPARAM)hTitleFont, TRUE); if (hBackgroundBrush) { SetClassLongPtr(hwndDlg, GCLP_HBRBACKGROUND, (LONG_PTR)hBackgroundBrush); InvalidateRect(hwndDlg, nullptr, TRUE); } return TRUE; case WMU_SETOPT: Options *opt; if (lParam) opt = (Options*)lParam; else opt = &options; // round corners if (opt->aw_roundcorners) { HRGN hRgn1; RECT r; int w = 10; GetWindowRect(hwndDlg, &r); int h = (r.right - r.left) > (w * 2) ? w : (r.right - r.left); int v = (r.bottom - r.top) > (w * 2) ? w : (r.bottom - r.top); h = (h < v) ? h : v; hRgn1 = CreateRoundRectRgn(0, 0, (r.right - r.left + 1), (r.bottom - r.top + 1), h, h); SetWindowRgn(hwndDlg, hRgn1, 1); } else { HRGN hRgn1; RECT r; int w = 10; GetWindowRect(hwndDlg, &r); int h = (r.right - r.left) > (w * 2) ? w : (r.right - r.left); int v = (r.bottom - r.top) > (w * 2) ? w : (r.bottom - r.top); h = (h < v) ? h : v; hRgn1 = CreateRectRgn(0, 0, (r.right - r.left + 1), (r.bottom - r.top + 1)); SetWindowRgn(hwndDlg, hRgn1, 1); } // transparency #ifdef WS_EX_LAYERED SetWindowLongPtr(hwndDlg, GWL_EXSTYLE, GetWindowLongPtr(hwndDlg, GWL_EXSTYLE) | WS_EX_LAYERED); #endif #ifdef LWA_ALPHA SetLayeredWindowAttributes(hwndDlg, RGB(0, 0, 0), (int)((100 - opt->aw_trans) / 100.0 * 255), LWA_ALPHA); #endif return TRUE; case WMU_SETALARM: { ALARM *data = (ALARM *)lParam; SetWindowText(hwndDlg, data->szTitle); SetWindowText(GetDlgItem(hwndDlg, IDC_TITLE), data->szTitle); SetDlgItemText(hwndDlg, IDC_ED_DESC, data->szDesc); wd->alarm = data; if (data->action & AAF_SOUND && options.loop_sound) { if (data->sound_num <= 3) SetTimer(hwndDlg, ID_TIMER_SOUND, SOUND_REPEAT_PERIOD, nullptr); else if (data->sound_num == 4) SetTimer(hwndDlg, ID_TIMER_SOUND, SPEACH_REPEAT_PERIOD, nullptr); } HWND hw = GetDlgItem(hwndDlg, IDC_SNOOZE); EnableWindow(hw, !(data->flags & ALF_NOSNOOZE)); ShowWindow(hw, (data->flags & ALF_NOSNOOZE) ? SW_HIDE : SW_SHOWNA); } return TRUE; case WMU_FAKEALARM: SetWindowText(hwndDlg, TranslateT("Example alarm")); SetDlgItemText(hwndDlg, IDC_TITLE, TranslateT("Example alarm")); SetDlgItemText(hwndDlg, IDC_ED_DESC, TranslateT("Some example text. Example, example, example.")); return TRUE; case WM_TIMER: if (wParam == ID_TIMER_SOUND && wd) { ALARM *data = wd->alarm; if (data && data->action & AAF_SOUND) { if (data->sound_num <= 3) { char buff[128]; mir_snprintf(buff, "Triggered%d", data->sound_num); Skin_PlaySound(buff); } else if (data->sound_num == 4) { if (data->szTitle != nullptr && data->szTitle[0] != '\0') { if (ServiceExists("Speak/Say")) { CallService("Speak/Say", 0, (LPARAM)data->szTitle); } } } } } return TRUE; case WM_MOVE: Utils_SaveWindowPosition(hwndDlg, 0, MODULENAME, "Notify"); break; case WMU_ADDSNOOZER: if (wd) { ALARM *data = wd->alarm; if (data) { // add snooze minutes to current time FILETIME ft; GetLocalTime(&data->time); SystemTimeToFileTime(&data->time, &ft); ULARGE_INTEGER uli; uli.LowPart = ft.dwLowDateTime; uli.HighPart = ft.dwHighDateTime; // there are 10000000 100-nanosecond blocks in a second... uli.QuadPart += mult.QuadPart * (int)(wParam); ft.dwHighDateTime = uli.HighPart; ft.dwLowDateTime = uli.LowPart; FileTimeToSystemTime(&ft, &data->time); data->occurrence = OC_ONCE; data->snoozer = true; data->flags = data->flags & ~ALF_NOSTARTUP; data->id = next_alarm_id++; append_to_list(data); } } return TRUE; case WM_COMMAND: if (HIWORD(wParam) == BN_CLICKED) { switch (LOWORD(wParam)) { case IDCANCEL: // no button - esc pressed case IDOK: // space? case IDC_SNOOZE: SendMessage(hwndDlg, WMU_ADDSNOOZER, (WPARAM)options.snooze_minutes, 0); //drop through case IDC_DISMISS: KillTimer(hwndDlg, ID_TIMER_SOUND); if (wd) { if (wd->alarm) { free_alarm_data(wd->alarm); delete wd->alarm; } delete wd; } SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0); win_num--; WindowList_Remove(hAlarmWindowList, hwndDlg); DestroyWindow(hwndDlg); break; case IDC_SNOOZELIST: POINT pt, pt_rel; GetCursorPos(&pt); pt_rel = pt; ScreenToClient(hwndDlg, &pt_rel); HMENU hMenu = CreatePopupMenu(); MENUITEMINFO mii = { 0 }; mii.cbSize = sizeof(mii); mii.fMask = MIIM_ID | MIIM_STRING; #define AddItem(x) \ mii.wID++; \ mii.dwTypeData = TranslateW(x); \ mii.cch = ( UINT )mir_wstrlen(mii.dwTypeData); \ InsertMenuItem(hMenu, mii.wID, FALSE, &mii); AddItem(LPGENW("5 mins")); AddItem(LPGENW("15 mins")); AddItem(LPGENW("30 mins")); AddItem(LPGENW("1 hour")); AddItem(LPGENW("1 day")); AddItem(LPGENW("1 week")); TPMPARAMS tpmp = { 0 }; tpmp.cbSize = sizeof(tpmp); LRESULT ret = (LRESULT)TrackPopupMenuEx(hMenu, TPM_RETURNCMD, pt.x, pt.y, hwndDlg, &tpmp); switch (ret) { case 0: DestroyMenu(hMenu); return 0; // dismis menu case 1: SendMessage(hwndDlg, WMU_ADDSNOOZER, (WPARAM)5, 0); break; case 2: SendMessage(hwndDlg, WMU_ADDSNOOZER, (WPARAM)15, 0); break; case 3: SendMessage(hwndDlg, WMU_ADDSNOOZER, (WPARAM)30, 0); break; case 4: SendMessage(hwndDlg, WMU_ADDSNOOZER, (WPARAM)60, 0); break; case 5: SendMessage(hwndDlg, WMU_ADDSNOOZER, (WPARAM)(60 * 24), 0); break; case 6: SendMessage(hwndDlg, WMU_ADDSNOOZER, (WPARAM)(60 * 24 * 7), 0); break; } DestroyMenu(hMenu); SendMessage(hwndDlg, WM_COMMAND, IDC_DISMISS, 0); break; } } return TRUE; case WM_MOUSEMOVE: if (wParam & MK_LBUTTON) { SetCapture(hwndDlg); POINT newp; newp.x = (short)LOWORD(lParam); newp.y = (short)HIWORD(lParam); ClientToScreen(hwndDlg, &newp); if (!wd->moving) wd->moving = true; else { RECT r; GetWindowRect(hwndDlg, &r); SetWindowPos(hwndDlg, nullptr, r.left + (newp.x - wd->p.x), r.top + (newp.y - wd->p.y), 0, 0, SWP_NOSIZE | SWP_NOZORDER); } wd->p.x = newp.x; wd->p.y = newp.y; } else { ReleaseCapture(); wd->moving = false; } return TRUE; } return FALSE; }
INT_PTR CALLBACK DlgProcPopupGeneral(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static bool bDlgInit = false; // some controls send WM_COMMAND before or during WM_INITDIALOG static OPTTREE_OPTION *statusOptions = NULL; static int statusOptionsCount = 0; if (statusOptions) { int index; if (OptTree_ProcessMessage(hwnd, msg, wParam, lParam, &index, IDC_STATUSES, statusOptions, statusOptionsCount)) return TRUE; } switch (msg) { case WM_INITDIALOG: // Seconds of delay CheckDlgButton(hwnd, IDC_INFINITEDELAY, PopupOptions.InfiniteDelay ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwnd, IDC_LEAVEHOVERED, PopupOptions.LeaveHovered ? BST_CHECKED : BST_UNCHECKED); EnableWindow(GetDlgItem(hwnd, IDC_SECONDS), !PopupOptions.InfiniteDelay); EnableWindow(GetDlgItem(hwnd, IDC_SECONDS_STATIC1), !PopupOptions.InfiniteDelay); EnableWindow(GetDlgItem(hwnd, IDC_SECONDS_STATIC2), !PopupOptions.InfiniteDelay); EnableWindow(GetDlgItem(hwnd, IDC_LEAVEHOVERED), !PopupOptions.InfiniteDelay); SetDlgItemInt(hwnd, IDC_SECONDS, PopupOptions.Seconds, FALSE); SendDlgItemMessage(hwnd, IDC_SECONDS_SPIN, UDM_SETRANGE, 0, (LPARAM)MAKELONG(SETTING_LIFETIME_MAX, SETTING_LIFETIME_MIN)); // Dynamic Resize CheckDlgButton(hwnd, IDC_DYNAMICRESIZE, PopupOptions.DynamicResize ? BST_CHECKED : BST_UNCHECKED); SetDlgItemText(hwnd, IDC_USEMAXIMUMWIDTH, PopupOptions.DynamicResize ? LPGENT("Maximum width") : LPGENT("Width")); // Minimum Width CheckDlgButton(hwnd, IDC_USEMINIMUMWIDTH, PopupOptions.UseMinimumWidth ? BST_CHECKED : BST_UNCHECKED); SendDlgItemMessage(hwnd, IDC_MINIMUMWIDTH_SPIN, UDM_SETRANGE, 0, (LPARAM)MAKELONG(SETTING_MAXIMUMWIDTH_MAX, SETTING_MINIMUMWIDTH_MIN)); SetDlgItemInt(hwnd, IDC_MINIMUMWIDTH, PopupOptions.MinimumWidth, FALSE); // Maximum Width PopupOptions.UseMaximumWidth = PopupOptions.DynamicResize ? PopupOptions.UseMaximumWidth : TRUE; CheckDlgButton(hwnd, IDC_USEMAXIMUMWIDTH, PopupOptions.UseMaximumWidth ? BST_CHECKED : BST_UNCHECKED); SendDlgItemMessage(hwnd, IDC_MAXIMUMWIDTH_SPIN, UDM_SETRANGE, 0, (LPARAM)MAKELONG(SETTING_MAXIMUMWIDTH_MAX, SETTING_MINIMUMWIDTH_MIN)); SetDlgItemInt(hwnd, IDC_MAXIMUMWIDTH, PopupOptions.MaximumWidth, FALSE); // And finally let's enable/disable them. EnableWindow(GetDlgItem(hwnd, IDC_USEMINIMUMWIDTH), PopupOptions.DynamicResize); EnableWindow(GetDlgItem(hwnd, IDC_MINIMUMWIDTH), PopupOptions.DynamicResize && PopupOptions.UseMinimumWidth); EnableWindow(GetDlgItem(hwnd, IDC_MINIMUMWIDTH_SPIN), PopupOptions.DynamicResize && PopupOptions.UseMinimumWidth); EnableWindow(GetDlgItem(hwnd, IDC_MAXIMUMWIDTH), PopupOptions.UseMaximumWidth); EnableWindow(GetDlgItem(hwnd, IDC_MAXIMUMWIDTH_SPIN), PopupOptions.UseMaximumWidth); // Position combobox. { HWND hCtrl = GetDlgItem(hwnd, IDC_WHERE); ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, TranslateT("Upper left corner")), POS_UPPERLEFT); ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, TranslateT("Lower left corner")), POS_LOWERLEFT); ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, TranslateT("Lower right corner")), POS_LOWERRIGHT); ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, TranslateT("Upper right corner")), POS_UPPERRIGHT); SendDlgItemMessage(hwnd, IDC_WHERE, CB_SETCURSEL, PopupOptions.Position, 0); } // Configure popup area { HWND hCtrl = GetDlgItem(hwnd, IDC_CUSTOMPOS); SendMessage(hCtrl, BUTTONSETASFLATBTN, TRUE, 0); SendMessage(hCtrl, BUTTONADDTOOLTIP, (WPARAM)_T("Popup area"), BATF_TCHAR); SendMessage(hCtrl, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadIconEx(IDI_RESIZE)); } // Spreading combobox { HWND hCtrl = GetDlgItem(hwnd, IDC_LAYOUT); ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, TranslateT("Horizontal")), SPREADING_HORIZONTAL); ComboBox_SetItemData(hCtrl, ComboBox_AddString(hCtrl, TranslateT("Vertical")), SPREADING_VERTICAL); SendDlgItemMessage(hwnd, IDC_LAYOUT, CB_SETCURSEL, PopupOptions.Spreading, 0); } // miscellaneous CheckDlgButton(hwnd, IDC_REORDERPOPUPS, PopupOptions.ReorderPopups ? BST_CHECKED : BST_UNCHECKED); // Popup enabled CheckDlgButton(hwnd, IDC_POPUPENABLED, PopupOptions.ModuleIsEnabled ? BST_UNCHECKED : BST_CHECKED); CheckDlgButton(hwnd, IDC_DISABLEINFS, PopupOptions.DisableWhenFullscreen ? BST_CHECKED : BST_UNCHECKED); EnableWindow(GetDlgItem(hwnd, IDC_DISABLEINFS), PopupOptions.ModuleIsEnabled); EnableWindow(GetDlgItem(hwnd, IDC_STATUSES), PopupOptions.ModuleIsEnabled); // new status options { int protocolCount = 0; PROTOACCOUNT **protocols; Proto_EnumAccounts(&protocolCount, &protocols); DWORD globalFlags = 0; for (int i = 0; i < protocolCount; ++i) { if (!protocols[i]->bIsVirtual) { DWORD protoFlags = CallProtoService(protocols[i]->szModuleName, PS_GETCAPS, PFLAGNUM_2, 0); globalFlags |= protoFlags; statusOptionsCount += CountStatusModes(protoFlags); } } statusOptionsCount += CountStatusModes(globalFlags); statusOptions = new OPTTREE_OPTION[statusOptionsCount]; int pos = AddStatusModes(statusOptions, 0, LPGENT("Global Status"), globalFlags); for (int i = 0; i < protocolCount; ++i) { if (!protocols[i]->bIsVirtual) { DWORD protoFlags = CallProtoService(protocols[i]->szModuleName, PS_GETCAPS, PFLAGNUM_2, 0); if (!CountStatusModes(protoFlags)) continue; TCHAR prefix[128]; mir_sntprintf(prefix, _countof(prefix), LPGENT("Protocol Status")_T("/%s"), protocols[i]->tszAccountName); pos = AddStatusModes(statusOptions, pos, prefix, protoFlags); } } int index; OptTree_ProcessMessage(hwnd, msg, wParam, lParam, &index, IDC_STATUSES, statusOptions, statusOptionsCount); for (int i = 0; i < protocolCount; ++i) { if (!protocols[i]->bIsVirtual) { DWORD protoFlags = CallProtoService(protocols[i]->szModuleName, PS_GETCAPS, PFLAGNUM_2, 0); if (!CountStatusModes(protoFlags)) continue; char prefix[128]; mir_snprintf(prefix, _countof(prefix), "Protocol Status/%s", protocols[i]->szModuleName); TCHAR pszSettingName[256]; mir_sntprintf(pszSettingName, _countof(pszSettingName), LPGENT("Protocol Status")_T("/%s"), protocols[i]->tszAccountName); OptTree_SetOptions(hwnd, IDC_STATUSES, statusOptions, statusOptionsCount, db_get_dw(NULL, MODULNAME, prefix, 0), pszSettingName); } } OptTree_SetOptions(hwnd, IDC_STATUSES, statusOptions, statusOptionsCount, db_get_dw(NULL, MODULNAME, "Global Status", 0), LPGENT("Global Status")); } TranslateDialogDefault(hwnd); // do it on end of WM_INITDIALOG bDlgInit = true; return TRUE; case WM_COMMAND: switch (HIWORD(wParam)) { case BN_CLICKED: // Button controls switch (LOWORD(wParam)) { case IDC_INFINITEDELAY: PopupOptions.InfiniteDelay = !PopupOptions.InfiniteDelay; EnableWindow(GetDlgItem(hwnd, IDC_SECONDS), !PopupOptions.InfiniteDelay); EnableWindow(GetDlgItem(hwnd, IDC_SECONDS_STATIC1), !PopupOptions.InfiniteDelay); EnableWindow(GetDlgItem(hwnd, IDC_SECONDS_STATIC2), !PopupOptions.InfiniteDelay); EnableWindow(GetDlgItem(hwnd, IDC_LEAVEHOVERED), !PopupOptions.InfiniteDelay); SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); break; case IDC_LEAVEHOVERED: PopupOptions.LeaveHovered = !PopupOptions.LeaveHovered; SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); break; case IDC_DYNAMICRESIZE: PopupOptions.DynamicResize = !PopupOptions.DynamicResize; EnableWindow(GetDlgItem(hwnd, IDC_USEMINIMUMWIDTH), PopupOptions.DynamicResize); EnableWindow(GetDlgItem(hwnd, IDC_MINIMUMWIDTH), PopupOptions.DynamicResize && PopupOptions.UseMinimumWidth); EnableWindow(GetDlgItem(hwnd, IDC_MINIMUMWIDTH_SPIN), PopupOptions.DynamicResize && PopupOptions.UseMinimumWidth); SetDlgItemText(hwnd, IDC_USEMAXIMUMWIDTH, PopupOptions.DynamicResize ? TranslateT("Maximum width") : TranslateT("Width")); if (!PopupOptions.DynamicResize) { PopupOptions.UseMaximumWidth = TRUE; CheckDlgButton(hwnd, IDC_USEMAXIMUMWIDTH, BST_CHECKED); EnableWindow(GetDlgItem(hwnd, IDC_USEMAXIMUMWIDTH), TRUE); EnableWindow(GetDlgItem(hwnd, IDC_MAXIMUMWIDTH), TRUE); EnableWindow(GetDlgItem(hwnd, IDC_MAXIMUMWIDTH_SPIN), TRUE); } SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); break; case IDC_USEMINIMUMWIDTH: PopupOptions.UseMinimumWidth = !PopupOptions.UseMinimumWidth; EnableWindow(GetDlgItem(hwnd, IDC_MINIMUMWIDTH), PopupOptions.UseMinimumWidth); EnableWindow(GetDlgItem(hwnd, IDC_MINIMUMWIDTH_SPIN), PopupOptions.UseMinimumWidth); SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); break; case IDC_USEMAXIMUMWIDTH: PopupOptions.UseMaximumWidth = Button_GetCheck((HWND)lParam); if (!PopupOptions.DynamicResize) { // ugly - set always on if DynamicResize = off CheckDlgButton(hwnd, LOWORD(wParam), BST_CHECKED); PopupOptions.UseMaximumWidth = TRUE; } EnableWindow(GetDlgItem(hwnd, IDC_MAXIMUMWIDTH), PopupOptions.UseMaximumWidth); EnableWindow(GetDlgItem(hwnd, IDC_MAXIMUMWIDTH_SPIN), PopupOptions.UseMaximumWidth); SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); break; case IDC_CUSTOMPOS: { RECT rcButton, rcBox; HWND hwndBox = CreateDialog(hInst, MAKEINTRESOURCE(IDD_POSITION), NULL, PositionBoxDlgProc); GetWindowRect((HWND)lParam, &rcButton); GetWindowRect(hwndBox, &rcBox); MoveWindow(hwndBox, rcButton.right - (rcBox.right - rcBox.left) + 15, rcButton.bottom + 3, rcBox.right - rcBox.left, rcBox.bottom - rcBox.top, FALSE); SetWindowLongPtr(hwndBox, GWL_EXSTYLE, GetWindowLongPtr(hwndBox, GWL_EXSTYLE) | WS_EX_LAYERED); SetLayeredWindowAttributes(hwndBox, NULL, 0, LWA_ALPHA); ShowWindow(hwndBox, SW_SHOW); for (int i = 0; i <= 255; i += 15) { SetLayeredWindowAttributes(hwndBox, NULL, i, LWA_ALPHA); UpdateWindow(hwndBox); Sleep(1); } SetWindowLongPtr(hwndBox, GWL_EXSTYLE, GetWindowLongPtr(hwndBox, GWL_EXSTYLE) & ~WS_EX_LAYERED); ShowWindow(hwndBox, SW_SHOW); SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); } break; case IDC_REORDERPOPUPS: { PopupOptions.ReorderPopups = !PopupOptions.ReorderPopups; PopupOptions.ReorderPopupsWarning = PopupOptions.ReorderPopups ? db_get_b(NULL, MODULNAME, "ReorderPopupsWarning", TRUE) : TRUE; SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); } break; case IDC_POPUPENABLED: { int chk = IsDlgButtonChecked(hwnd, IDC_POPUPENABLED); if (PopupOptions.ModuleIsEnabled&&chk || !PopupOptions.ModuleIsEnabled && !chk) svcEnableDisableMenuCommand(0, 0); EnableWindow(GetDlgItem(hwnd, IDC_STATUSES), PopupOptions.ModuleIsEnabled); EnableWindow(GetDlgItem(hwnd, IDC_DISABLEINFS), PopupOptions.ModuleIsEnabled); } break; case IDC_DISABLEINFS: PopupOptions.DisableWhenFullscreen = !PopupOptions.DisableWhenFullscreen; SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); break; case IDC_PREVIEW: PopupPreview(); break; } break; case CBN_SELCHANGE: // ComboBox controls switch (LOWORD(wParam)) { // lParam = Handle to the control case IDC_WHERE: PopupOptions.Position = ComboBox_GetItemData((HWND)lParam, ComboBox_GetCurSel((HWND)lParam)); SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); break; case IDC_LAYOUT: PopupOptions.Spreading = ComboBox_GetItemData((HWND)lParam, ComboBox_GetCurSel((HWND)lParam)); SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); break; } break; case EN_CHANGE: // Edit controls change if (!bDlgInit) break; switch (LOWORD(wParam)) { // lParam = Handle to the control case IDC_SECONDS: { int seconds = GetDlgItemInt(hwnd, LOWORD(wParam), NULL, FALSE); if (seconds >= SETTING_LIFETIME_MIN && seconds <= SETTING_LIFETIME_MAX && seconds != PopupOptions.Seconds) { PopupOptions.Seconds = seconds; SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); } } break; case IDC_MINIMUMWIDTH: { int temp = GetDlgItemInt(hwnd, IDC_MINIMUMWIDTH, NULL, FALSE); if (temp >= SETTING_MINIMUMWIDTH_MIN && temp <= SETTING_MAXIMUMWIDTH_MAX && temp != PopupOptions.MinimumWidth) { PopupOptions.MinimumWidth = temp; SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); } } break; case IDC_MAXIMUMWIDTH: { int temp = GetDlgItemInt(hwnd, IDC_MAXIMUMWIDTH, NULL, FALSE); if (temp >= SETTING_MINIMUMWIDTH_MIN && temp <= SETTING_MAXIMUMWIDTH_MAX && temp != PopupOptions.MaximumWidth) { PopupOptions.MaximumWidth = temp; SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); } } break; }// end switch(idCtrl) break; case EN_KILLFOCUS: // Edit controls lost fokus switch (LOWORD(wParam)) { // lParam = Handle to the control case IDC_SECONDS: { int seconds = GetDlgItemInt(hwnd, LOWORD(wParam), NULL, FALSE); if (seconds > SETTING_LIFETIME_MAX) PopupOptions.Seconds = SETTING_LIFETIME_MAX; else if (seconds < SETTING_LIFETIME_MIN) PopupOptions.Seconds = SETTING_LIFETIME_MIN; if (seconds != PopupOptions.Seconds) { SetDlgItemInt(hwnd, LOWORD(wParam), PopupOptions.Seconds, FALSE); ErrorMSG(SETTING_LIFETIME_MIN, SETTING_LIFETIME_MAX); SetFocus((HWND)lParam); } } break; case IDC_MINIMUMWIDTH: { int temp = GetDlgItemInt(hwnd, LOWORD(wParam), NULL, FALSE); if (temp < SETTING_MINIMUMWIDTH_MIN) PopupOptions.MinimumWidth = SETTING_MINIMUMWIDTH_MIN; else if (temp > SETTING_MAXIMUMWIDTH_MAX) PopupOptions.MinimumWidth = SETTING_MAXIMUMWIDTH_MAX; if (temp != PopupOptions.MinimumWidth) { SetDlgItemInt(hwnd, LOWORD(wParam), PopupOptions.MinimumWidth, FALSE); ErrorMSG(SETTING_MINIMUMWIDTH_MIN, SETTING_MAXIMUMWIDTH_MAX); SetFocus((HWND)lParam); break; } if (temp > PopupOptions.MaximumWidth) { PopupOptions.MaximumWidth = min(temp, SETTING_MAXIMUMWIDTH_MAX); SetDlgItemInt(hwnd, IDC_MAXIMUMWIDTH, PopupOptions.MaximumWidth, FALSE); } } break; case IDC_MAXIMUMWIDTH: { int temp = GetDlgItemInt(hwnd, LOWORD(wParam), NULL, FALSE); if (temp >= SETTING_MAXIMUMWIDTH_MAX) PopupOptions.MaximumWidth = SETTING_MAXIMUMWIDTH_MAX; else if (temp < SETTING_MINIMUMWIDTH_MIN) PopupOptions.MaximumWidth = SETTING_MINIMUMWIDTH_MIN; if (temp != PopupOptions.MaximumWidth) { SetDlgItemInt(hwnd, LOWORD(wParam), PopupOptions.MaximumWidth, FALSE); ErrorMSG(SETTING_MINIMUMWIDTH_MIN, SETTING_MAXIMUMWIDTH_MAX); SetFocus((HWND)lParam); break; } if (temp < PopupOptions.MinimumWidth) { PopupOptions.MinimumWidth = max(temp, SETTING_MINIMUMWIDTH_MIN); SetDlgItemInt(hwnd, IDC_MINIMUMWIDTH, PopupOptions.MinimumWidth, FALSE); } } break; } break; } break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->idFrom) { case 0: switch (((LPNMHDR)lParam)->code) { case PSN_RESET: LoadOption_General(); return TRUE; case PSN_APPLY: // Seconds db_set_b(NULL, MODULNAME, "InfiniteDelay", PopupOptions.InfiniteDelay); db_set_w(NULL, MODULNAME, "Seconds", (WORD)PopupOptions.Seconds); db_set_b(NULL, MODULNAME, "LeaveHovered", PopupOptions.LeaveHovered); // Dynamic Resize db_set_b(NULL, MODULNAME, "DynamicResize", PopupOptions.DynamicResize); db_set_b(NULL, MODULNAME, "UseMinimumWidth", PopupOptions.UseMinimumWidth); db_set_w(NULL, MODULNAME, "MinimumWidth", PopupOptions.MinimumWidth); db_set_b(NULL, MODULNAME, "UseMaximumWidth", PopupOptions.UseMaximumWidth); db_set_w(NULL, MODULNAME, "MaximumWidth", PopupOptions.MaximumWidth); // Position db_set_b(NULL, MODULNAME, "Position", (BYTE)PopupOptions.Position); // Configure popup area db_set_w(NULL, MODULNAME, "gapTop", (WORD)PopupOptions.gapTop); db_set_w(NULL, MODULNAME, "gapBottom", (WORD)PopupOptions.gapBottom); db_set_w(NULL, MODULNAME, "gapLeft", (WORD)PopupOptions.gapLeft); db_set_w(NULL, MODULNAME, "gapRight", (WORD)PopupOptions.gapRight); db_set_w(NULL, MODULNAME, "spacing", (WORD)PopupOptions.spacing); // Spreading db_set_b(NULL, MODULNAME, "Spreading", (BYTE)PopupOptions.Spreading); // miscellaneous Check_ReorderPopups(hwnd); // this save also PopupOptions.ReorderPopups // disable When db_set_b(NULL, MODULNAME, "DisableWhenFullscreen", PopupOptions.DisableWhenFullscreen); // new status options { int protocolCount; PROTOACCOUNT **protocols; Proto_EnumAccounts(&protocolCount, &protocols); for (int i = 0; i < protocolCount; ++i) { if (!protocols[i]->bIsVirtual) { char prefix[128]; mir_snprintf(prefix, _countof(prefix), "Protocol Status/%s", protocols[i]->szModuleName); TCHAR pszSettingName[256]; mir_sntprintf(pszSettingName, _countof(pszSettingName), _T("Protocol Status/%s"), protocols[i]->tszAccountName); db_set_dw(NULL, MODULNAME, prefix, OptTree_GetOptions(hwnd, IDC_STATUSES, statusOptions, statusOptionsCount, pszSettingName)); } } db_set_dw(NULL, MODULNAME, "Global Status", OptTree_GetOptions(hwnd, IDC_STATUSES, statusOptions, statusOptionsCount, _T("Global Status"))); } return TRUE; } break; case IDC_MINIMUMWIDTH_SPIN: { LPNMUPDOWN lpnmud = (LPNMUPDOWN)lParam; int temp = lpnmud->iPos + lpnmud->iDelta; if (temp > PopupOptions.MaximumWidth) { PopupOptions.MaximumWidth = min(temp, SETTING_MAXIMUMWIDTH_MAX); SetDlgItemInt(hwnd, IDC_MAXIMUMWIDTH, PopupOptions.MaximumWidth, FALSE); } } break; case IDC_MAXIMUMWIDTH_SPIN: { LPNMUPDOWN lpnmud = (LPNMUPDOWN)lParam; int temp = lpnmud->iPos + lpnmud->iDelta; if (temp < PopupOptions.MinimumWidth) { PopupOptions.MinimumWidth = max(temp, SETTING_MINIMUMWIDTH_MIN); SetDlgItemInt(hwnd, IDC_MINIMUMWIDTH, PopupOptions.MinimumWidth, FALSE); } } } break; case WM_DESTROY: if (statusOptions) { for (int i = 0; i < statusOptionsCount; ++i) { mir_free(statusOptions[i].pszOptionName); mir_free(statusOptions[i].pszSettingName); } delete[] statusOptions; statusOptions = NULL; statusOptionsCount = 0; bDlgInit = false; } break; } return FALSE; }
/* helper functions */ DWORD notification_daemon_main(LPVOID lpdwThreadParam) { HINSTANCE hDLLInstance = (HINSTANCE) GetModuleHandle(NULL); WNDCLASSEX wcex = {sizeof(WNDCLASSEX)}; TCHAR szTitle[] = TEXT("libnotify_notification"); TCHAR szWindowClass[] = TEXT("libnotify"); HDC hdc = NULL; HFONT hOldFont = NULL; RECT rc = {0}; MSG msg = {0}; /* register window class */ wcex.style = CS_HREDRAW | CS_VREDRAW | CS_DROPSHADOW; wcex.lpfnWndProc = thread_proc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hDLLInstance; wcex.hIcon = NULL; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH); wcex.lpszMenuName = NULL; wcex.lpszClassName = szWindowClass; wcex.hIconSm = NULL; if(0 == RegisterClassEx(&wcex)) goto cleanup_and_exit; /* create the notification window */ notification_window = CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_LAYERED | WS_EX_TRANSPARENT, szWindowClass, szTitle, WS_OVERLAPPED | WS_POPUP, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hDLLInstance, NULL); if(!notification_window) goto cleanup_and_exit; /* screen width / 3.5 is the maximum allowed notification width */ notification_window_width_max = (GetSystemMetrics(SM_CXSCREEN) * 2) / 7; icon_size = (uint16_t) GetSystemMetrics(SM_CXICON); icon_padding = icon_size / 3; /* icon spacing is a third of the icon width */ /* height and width set here are dummy, they will later be reset based on DrawText */ notification_window_width = notification_window_width_max; notification_window_height = notification_window_width / 4; SetWindowPos(notification_window, HWND_TOPMOST, 0, 0, notification_window_width, notification_window_height, SWP_HIDEWINDOW | SWP_NOACTIVATE | SWP_NOREPOSITION); SetLayeredWindowAttributes(notification_window, 0, notification_window_alpha, LWA_ALPHA); font_summary = CreateFont(0, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_ROMAN, NULL); if(!font_summary) goto cleanup_and_exit; font_body = CreateFont(0, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_ROMAN, NULL); if(!font_body) goto cleanup_and_exit; hdc = GetDC(notification_window); if(hdc) { hOldFont = (HFONT) SelectObject(hdc, (HFONT) font_summary); if(hOldFont) { /* set the width and get the height for a single line (summary) from DrawText; for rational on width calc., see the above geometry */ rc.right = notification_window_width - (icon_size + (icon_padding * 3)); DrawText(hdc, TEXT("placeholder"), -1, &rc, DT_CALCRECT | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS | DT_NOPREFIX); summary_body_divider = (uint16_t) rc.bottom; SelectObject(hdc, (HFONT) hOldFont); } ReleaseDC(notification_window, hdc); if(!hOldFont) goto cleanup_and_exit; } else goto cleanup_and_exit; SetEvent((HANDLE) lpdwThreadParam); while(GetMessage(&msg, NULL, 0, 0)) { if((msg.message == WM_LIBNOTIFYEXIT) || (msg.message == WM_QUIT)) { if(hook_mouse_over) { UnhookWindowsHookEx(hook_mouse_over); hook_mouse_over = NULL; } KillTimer(notification_window, TIMER_ANIMATION); KillTimer(notification_window, TIMER_NOTIFICATION); if(font_summary) DeleteObject(font_summary); if(font_body) DeleteObject(font_body); break; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } return msg.wParam; /* cleanup and return */ cleanup_and_exit: if(font_summary) DeleteObject(font_summary); if(font_body) DeleteObject(font_body); return ((DWORD) -1); }
int WinGui::Window::opacity(int alpha){ SetWindowLong(hWnd, GWL_EXSTYLE, WS_EX_LAYERED); SetLayeredWindowAttributes(hWnd, 0, alpha, LWA_ALPHA); return 0; }
// ---------------------------------------------------------------------- // Windows proc for the one and only window in this app. // // ---------------------------------------------------------------------- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HBRUSH hbrLit = NULL; static HBRUSH hbrUnlit = NULL; static HFONT hFont = NULL; static UINT_PTR nTimerId = 101; switch (message) { case WM_CREATE: { // Make BLACK the transparency color SetLayeredWindowAttributes(hWnd, RGB(0,0,0), 0, LWA_COLORKEY); // Initialize the DPI scalar. InitializeDPIScale(hWnd); // Create brushes and font that will be used in WM_PAINT hbrLit = CreateSolidBrush(RGB(0,128,255)); hbrUnlit = CreateSolidBrush(RGB(0,64,128)); hFont = CreateFont(DPIScale(64), 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, 0, 0, 0, 0, 0, L"Segoe UI"); // Position at the center of the primary monitor POINT const ptZeroZero = {}; HMONITOR hMonitor = MonitorFromPoint(ptZeroZero, MONITOR_DEFAULTTOPRIMARY); MONITORINFO mi = {sizeof(mi)}; GetMonitorInfo(hMonitor, &mi); SIZE const size = { g_currentVolume.cSteps * DPIScale(10), DPIScale(60) }; POINT const pt = { mi.rcMonitor.left + (mi.rcMonitor.left + mi.rcMonitor.right - size.cx) / 2, mi.rcMonitor.top + (mi.rcMonitor.top + mi.rcMonitor.bottom - size.cy) / 2 }; SetWindowPos(hWnd, HWND_TOPMOST, pt.x, pt.y, size.cx, size.cy, SWP_SHOWWINDOW); break; } case WM_DESTROY: { DeleteObject(hbrLit); DeleteObject(hbrUnlit); DeleteObject(hFont); PostQuitMessage(0); return 0; } case WM_ERASEBKGND: { // Don't do any erasing here. It's done in WM_PAINT to avoid flicker. return 1; } case WM_VOLUMECHANGE: { // get the new volume level g_pVolumeMonitor->GetLevelInfo(&g_currentVolume); // make window visible for 2 seconds ShowWindow(hWnd, SW_SHOW); InvalidateRect(hWnd, NULL, TRUE); nTimerId = SetTimer(hWnd, 101, 2000, NULL); return 0; } case WM_ENDPOINTCHANGE: { g_pVolumeMonitor->ChangeEndpoint(); return 0; } case WM_TIMER: { // make the window go away ShowWindow(hWnd, SW_HIDE); KillTimer(hWnd, nTimerId); return 0; } case WM_PAINT: { PAINTSTRUCT ps; HPAINTBUFFER hBufferedPaint = NULL; RECT rc; GetClientRect(hWnd, &rc); HDC hdc = BeginPaint(hWnd, &ps); if (g_bDblBuffered) { // Get doublebuffered DC HDC hdcMem; hBufferedPaint = BeginBufferedPaint(hdc, &rc, BPBF_COMPOSITED, NULL, &hdcMem); if (hBufferedPaint) { hdc = hdcMem; } } // black background (transparency color) FillRect(hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); // Draw LEDs for (UINT i = 0; i < (g_currentVolume.cSteps-1); i++) { RECT const rcLed = { DPIScale(i * 10), DPIScale(10), DPIScale(i * 10 + 8), rc.bottom-DPIScale(15) }; if ((i < g_currentVolume.nStep) && (!g_currentVolume.bMuted)) FillRect(hdc, &rcLed, hbrLit); else FillRect(hdc, &rcLed, hbrUnlit); } if (g_currentVolume.bMuted) { HGDIOBJ hof = SelectObject(hdc, hFont); SetBkMode(hdc, TRANSPARENT); SetTextColor(hdc, RGB(255, 64, 64)); RECT rcText = rc; rcText.bottom -= DPIScale(11); DrawText(hdc, L"MUTED", -1, &rcText, DT_CENTER | DT_SINGLELINE | DT_VCENTER); SelectObject(hdc, hof); } if (hBufferedPaint) { // end painting BufferedPaintMakeOpaque(hBufferedPaint, NULL); EndBufferedPaint(hBufferedPaint, TRUE); } EndPaint(hWnd, &ps); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); }
// Entry point int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow) { g_hinst = hInst; // Get ini path GetModuleFileName(NULL, inipath, ARRAY_SIZE(inipath)); PathRemoveFileSpec(inipath); wcscat(inipath, L"\\"APP_NAME".ini"); wchar_t txt[10]; // Convert szCmdLine to argv and argc (max 10 arguments) char *argv[10]; int argc = 1; argv[0] = szCmdLine; while ((argv[argc]=strchr(argv[argc-1],' ')) != NULL) { *argv[argc] = '\0'; if (argc == ARRAY_SIZE(argv)) break; argv[argc++]++; } // Check arguments int i; int elevate=0; for (i=0; i < argc; i++) { if (!strcmp(argv[i],"-elevate") || !strcmp(argv[i],"-e")) { // -elevate = create a new instance with administrator privileges elevate = 1; } } // Check if elevated if in >= Vista OSVERSIONINFO vi = { sizeof(OSVERSIONINFO) }; GetVersionEx(&vi); vista = (vi.dwMajorVersion >= 6); if (vista) { HANDLE token; TOKEN_ELEVATION elevation; DWORD len; if (OpenProcessToken(GetCurrentProcess(),TOKEN_READ,&token) && GetTokenInformation(token,TokenElevation,&elevation,sizeof(elevation),&len)) { elevated = elevation.TokenIsElevated; } } // Register some messages WM_UPDATESETTINGS = RegisterWindowMessage(L"UpdateSettings"); // Check AlwaysElevate if (!elevated) { GetPrivateProfileString(L"Advanced", L"AlwaysElevate", L"0", txt, ARRAY_SIZE(txt), inipath); if (_wtoi(txt)) { elevate = 1; } // Handle request to elevate to administrator privileges if (elevate) { wchar_t path[MAX_PATH]; GetModuleFileName(NULL, path, ARRAY_SIZE(path)); int ret = (INT_PTR) ShellExecute(NULL, L"runas", path, NULL, NULL, SW_SHOWNORMAL); if (ret > 32) { return 0; } } } // Create window WNDCLASSEX wnd = { sizeof(WNDCLASSEX), 0, WindowProc, 0, 0, hInst, NULL, NULL, (HBRUSH)(COLOR_WINDOW+1), NULL, APP_NAME, NULL }; wnd.hCursor = LoadImage(hInst, L"kill", IMAGE_CURSOR, 0, 0, LR_DEFAULTCOLOR); RegisterClassEx(&wnd); g_hwnd = CreateWindowEx(WS_EX_TOOLWINDOW|WS_EX_TOPMOST|WS_EX_LAYERED, wnd.lpszClassName, NULL, WS_POPUP, 0, 0, 0, 0, NULL, NULL, hInst, NULL); SetLayeredWindowAttributes(g_hwnd, 0, 1, LWA_ALPHA); // Almost transparent // Tray icon InitTray(); UpdateTray(); // Hook keyboard HookKeyboard(); // TimerCheck GetPrivateProfileString(L"General", L"TimerCheck", L"0", txt, ARRAY_SIZE(txt), inipath); if (_wtoi(txt)) { SetTimer(g_hwnd, CHECKTIMER, CHECKINTERVAL, NULL); } // Message loop MSG msg; while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HWND hWnd; WNDCLASSEX wcex; MSG nMsg; HFONT hfHelp; long lStyle; const char* lpWndClass = "CClock"; const char* lpTitle = ""; lWinWidth = 450; lWinHeight = 135; lDeskWidth = GetDeviceCaps(GetDC(GetDesktopWindow()), HORZRES); lDeskHeight = GetDeviceCaps(GetDC(GetDesktopWindow()), VERTRES); crWndColor = RGB(0, 0, 0); srand((unsigned)time(NULL)); // The WNDCLASSEX details wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_DROPSHADOW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APP)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = CreateSolidBrush(crWndColor); wcex.lpszMenuName = NULL; wcex.lpszClassName = lpWndClass; wcex.hIconSm = NULL; RegisterClassEx(&wcex); hWnd = CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_TOPMOST, lpWndClass, lpTitle, WS_POPUP, (lDeskWidth - lWinWidth)/2, (lDeskHeight - lWinHeight)/2, lWinWidth, lWinHeight, NULL, NULL, hInstance, NULL); hLblHelp = CreateWindowEx(WS_EX_TOOLWINDOW, "STATIC", "?", WS_CHILD | SS_NOTIFY, 440, -2, 25, 20, hWnd, NULL, hInstance, NULL); hfHelp = CreateFont(0, 6, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "Tahoma"); SendMessage(hLblHelp, WM_SETFONT, (WPARAM)hfHelp, (LPARAM)TRUE); lOpacity = 255; lStyle = GetWindowLong(hWnd, GWL_EXSTYLE); SetWindowLong(hWnd, GWL_EXSTYLE, lStyle | WS_EX_LAYERED); SetLayeredWindowAttributes(hWnd, crWndColor, lOpacity, LWA_ALPHA); ShowWindow(hWnd, SW_SHOWNORMAL); ShowWindow(hLblHelp, SW_SHOWNORMAL); UpdateWindow(hWnd); SetTimer(hWnd, nIDTmr, 1000, TmrProc); fnParseTime(hWnd); while(GetMessage(&nMsg, NULL, 0, 0) > 0) { TranslateMessage(&nMsg); DispatchMessage(&nMsg); } DeleteObject(hfHelp); return nMsg.wParam; }
void POPUP_DISPLAY::update() { // once per 40 milliseconds update popup windows alpha if (clock() > nextUpdateTime) { nextUpdateTime = clock() + DISPLAY_UPDATE_TICK; if (branches.isSafeToShowBranchesData() && bookmarks.itemUnderMouse >= 0 && bookmarks.itemUnderMouse < TOTAL_BOOKMARKS && bookmarks.bookmarksArray[bookmarks.itemUnderMouse].notEmpty) { if (taseditorConfig.displayBranchScreenshots && !hwndScreenshotBitmap) { // create window hwndScreenshotBitmap = CreateWindowEx(WS_EX_LAYERED | WS_EX_TRANSPARENT, szClassName, szClassName, WS_POPUP, taseditorConfig.windowX + screenshotBitmapX, taseditorConfig.windowY + screenshotBitmapY, SCREENSHOT_WIDTH, SCREENSHOT_HEIGHT, taseditorWindow.hwndTASEditor, NULL, fceu_hInstance, NULL); redrawScreenshotBitmap(); ShowWindow(hwndScreenshotBitmap, SW_SHOWNA); } if (taseditorConfig.displayBranchDescriptions && !hwndNoteDescription) { RECT wrect; GetWindowRect(playback.hwndPlaybackMarkerEditField, &wrect); descriptionX = screenshotBitmapX + (SCREENSHOT_WIDTH - (wrect.right - wrect.left)) / 2; hwndNoteDescription = CreateWindowEx(WS_EX_LAYERED | WS_EX_TRANSPARENT, szClassName2, szClassName2, WS_POPUP, taseditorConfig.windowX + descriptionX, taseditorConfig.windowY + descriptionY, wrect.right - wrect.left, wrect.bottom - wrect.top, taseditorWindow.hwndTASEditor, NULL, fceu_hInstance, NULL); changeDescriptionText(); ShowWindow(hwndNoteDescription, SW_SHOWNA); } // change screenshot_bitmap pic and description text if needed if (currentlyDisplayedBookmark != bookmarks.itemUnderMouse) { if (taseditorConfig.displayBranchScreenshots) changeScreenshotBitmap(); if (taseditorConfig.displayBranchDescriptions) changeDescriptionText(); currentlyDisplayedBookmark = bookmarks.itemUnderMouse; } if (screenshotBitmapPhase < SCREENSHOT_BITMAP_PHASE_MAX) { screenshotBitmapPhase++; // update alpha int phase_alpha = screenshotBitmapPhase; if (phase_alpha > SCREENSHOT_BITMAP_PHASE_ALPHA_MAX) phase_alpha = SCREENSHOT_BITMAP_PHASE_ALPHA_MAX; if (hwndScreenshotBitmap) { SetLayeredWindowAttributes(hwndScreenshotBitmap, 0, (255 * phase_alpha) / SCREENSHOT_BITMAP_PHASE_ALPHA_MAX, LWA_ALPHA); UpdateLayeredWindow(hwndScreenshotBitmap, 0, 0, 0, 0, 0, 0, &blend, ULW_ALPHA); } if (hwndNoteDescription) { SetLayeredWindowAttributes(hwndNoteDescription, 0, (255 * phase_alpha) / SCREENSHOT_BITMAP_PHASE_ALPHA_MAX, LWA_ALPHA); UpdateLayeredWindow(hwndNoteDescription, 0, 0, 0, 0, 0, 0, &blend, ULW_ALPHA); } } } else { // fade and finally hide screenshot if (screenshotBitmapPhase > 0) screenshotBitmapPhase--; if (screenshotBitmapPhase > 0) { // update alpha int phase_alpha = screenshotBitmapPhase; if (phase_alpha > SCREENSHOT_BITMAP_PHASE_ALPHA_MAX) phase_alpha = SCREENSHOT_BITMAP_PHASE_ALPHA_MAX; else if (phase_alpha < 0) phase_alpha = 0; if (hwndScreenshotBitmap) { SetLayeredWindowAttributes(hwndScreenshotBitmap, 0, (255 * phase_alpha) / SCREENSHOT_BITMAP_PHASE_ALPHA_MAX, LWA_ALPHA); UpdateLayeredWindow(hwndScreenshotBitmap, 0, 0, 0, 0, 0, 0, &blend, ULW_ALPHA); } if (hwndNoteDescription) { SetLayeredWindowAttributes(hwndNoteDescription, 0, (255 * phase_alpha) / SCREENSHOT_BITMAP_PHASE_ALPHA_MAX, LWA_ALPHA); UpdateLayeredWindow(hwndNoteDescription, 0, 0, 0, 0, 0, 0, &blend, ULW_ALPHA); } } else { // destroy popup windows screenshotBitmapPhase = 0; if (hwndScreenshotBitmap) { DestroyWindow(hwndScreenshotBitmap); hwndScreenshotBitmap = 0; } if (hwndNoteDescription) { DestroyWindow(hwndNoteDescription); hwndNoteDescription = 0; } // immediately redraw the window below those UpdateWindow(taseditorWindow.hwndTASEditor); } } } }
/** * Splash screen thread entry function */ uint32 WINAPI StartSplashScreenThread( LPVOID unused ) { WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC) SplashScreenWindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(FWindowsPlatformMisc::GetAppIcon())); if(wc.hIcon == NULL) { wc.hIcon = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION); } wc.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("SplashScreenClass"); if(!RegisterClass(&wc)) { return 0; } // Load splash screen image, display it and handle all window's messages GSplashScreenBitmap = (HBITMAP) LoadImage(hInstance, (LPCTSTR)*GSplashScreenFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); if(GSplashScreenBitmap) { BITMAP bm; GetObject(GSplashScreenBitmap, sizeof(bm), &bm); const int32 BorderWidth = GetSystemMetrics(SM_CXBORDER); const int32 BorderHeight = GetSystemMetrics(SM_CYBORDER); const int32 WindowWidth = bm.bmWidth + BorderWidth; const int32 WindowHeight = bm.bmHeight + BorderHeight; int32 ScreenPosX = (GetSystemMetrics(SM_CXSCREEN) - WindowWidth) / 2; int32 ScreenPosY = (GetSystemMetrics(SM_CYSCREEN) - WindowHeight) / 2; const bool bAllowFading = true; // Force the editor splash screen to show up in the taskbar and alt-tab lists uint32 dwWindowStyle = (GIsEditor ? WS_EX_APPWINDOW : 0) | WS_EX_TOOLWINDOW; if( bAllowFading ) { dwWindowStyle |= WS_EX_LAYERED; } GSplashScreenWnd = CreateWindowEx( dwWindowStyle, wc.lpszClassName, TEXT("SplashScreen"), WS_BORDER|WS_POPUP, ScreenPosX, ScreenPosY, WindowWidth, WindowHeight, (HWND) NULL, (HMENU) NULL, hInstance, (LPVOID) NULL); if( bAllowFading ) { // Set window to fully transparent to start out SetLayeredWindowAttributes( GSplashScreenWnd, 0, 0, LWA_ALPHA ); } // Setup font { HFONT SystemFontHandle = ( HFONT )GetStockObject( DEFAULT_GUI_FONT ); // Create small font { LOGFONT MyFont; FMemory::Memzero( &MyFont, sizeof( MyFont ) ); GetObject( SystemFontHandle, sizeof( MyFont ), &MyFont ); MyFont.lfHeight = 10; // MyFont.lfQuality = ANTIALIASED_QUALITY; GSplashScreenSmallTextFontHandle = CreateFontIndirect( &MyFont ); if( GSplashScreenSmallTextFontHandle == NULL ) { // Couldn't create font, so just use a system font GSplashScreenSmallTextFontHandle = SystemFontHandle; } } // Create normal font { LOGFONT MyFont; FMemory::Memzero( &MyFont, sizeof( MyFont ) ); GetObject( SystemFontHandle, sizeof( MyFont ), &MyFont ); MyFont.lfHeight = 12; // MyFont.lfQuality = ANTIALIASED_QUALITY; GSplashScreenNormalTextFontHandle = CreateFontIndirect( &MyFont ); if( GSplashScreenNormalTextFontHandle == NULL ) { // Couldn't create font, so just use a system font GSplashScreenNormalTextFontHandle = SystemFontHandle; } } } // Setup bounds for version info text 1 GSplashScreenTextRects[ SplashTextType::VersionInfo1 ].top = bm.bmHeight - 60; GSplashScreenTextRects[ SplashTextType::VersionInfo1 ].bottom = bm.bmHeight - 40; GSplashScreenTextRects[ SplashTextType::VersionInfo1 ].left = 10; GSplashScreenTextRects[ SplashTextType::VersionInfo1 ].right = bm.bmWidth - 20; // Setup bounds for copyright info text if( GIsEditor ) { GSplashScreenTextRects[ SplashTextType::CopyrightInfo ].top = bm.bmHeight - 44; GSplashScreenTextRects[ SplashTextType::CopyrightInfo ].bottom = bm.bmHeight - 34; } else { GSplashScreenTextRects[ SplashTextType::CopyrightInfo ].top = bm.bmHeight - 16; GSplashScreenTextRects[ SplashTextType::CopyrightInfo ].bottom = bm.bmHeight - 6; } GSplashScreenTextRects[ SplashTextType::CopyrightInfo ].left = 10; GSplashScreenTextRects[ SplashTextType::CopyrightInfo ].right = bm.bmWidth - 20; // Setup bounds for startup progress text GSplashScreenTextRects[ SplashTextType::StartupProgress ].top = bm.bmHeight - 20; GSplashScreenTextRects[ SplashTextType::StartupProgress ].bottom = bm.bmHeight; GSplashScreenTextRects[ SplashTextType::StartupProgress ].left = 10; GSplashScreenTextRects[ SplashTextType::StartupProgress ].right = bm.bmWidth - 20; if (GSplashScreenWnd) { SetWindowText(GSplashScreenWnd, *GSplashScreenAppName.ToString()); ShowWindow(GSplashScreenWnd, SW_SHOW); UpdateWindow(GSplashScreenWnd); const double FadeStartTime = FPlatformTime::Seconds(); const float FadeDuration = 0.2f; int32 CurrentOpacityByte = 0; MSG message; bool bIsSplashFinished = false; while( !bIsSplashFinished ) { if( PeekMessage(&message, NULL, 0, 0, PM_REMOVE) ) { TranslateMessage(&message); DispatchMessage(&message); if( message.message == WM_QUIT ) { bIsSplashFinished = true; } } // Update window opacity if( bAllowFading && CurrentOpacityByte < 255 ) { // Set window to fully transparent to start out const float TimeSinceFadeStart = (float)( FPlatformTime::Seconds() - FadeStartTime ); const float FadeAmount = FMath::Clamp( TimeSinceFadeStart / FadeDuration, 0.0f, 1.0f ); const int32 NewOpacityByte = 255 * FadeAmount; if( NewOpacityByte != CurrentOpacityByte ) { CurrentOpacityByte = NewOpacityByte; SetLayeredWindowAttributes( GSplashScreenWnd, 0, CurrentOpacityByte, LWA_ALPHA ); } // We're still fading, but still yield a timeslice FPlatformProcess::Sleep( 0.0f ); } else { // Give up some time FPlatformProcess::Sleep( 1.0f / 60.0f ); } } } DeleteObject(GSplashScreenBitmap); GSplashScreenBitmap = NULL; } UnregisterClass(wc.lpszClassName, hInstance); return 0; }
INT_PTR CALLBACK cfg::DlgProcCluiOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: { opt_clui_changed = 0; TranslateDialogDefault(hwndDlg); CheckDlgButton(hwndDlg, IDC_BRINGTOFRONT, cfg::getByte("CList", "BringToFront", SETTING_BRINGTOFRONT_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_ALWAYSHIDEONTASKBAR, cfg::getByte("CList", "AlwaysHideOnTB", 1) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_ONTOP, cfg::getByte("CList", "OnTop", SETTING_ONTOP_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CLIENTDRAG, cfg::getByte("CLUI", "ClientAreaDrag", SETTING_CLIENTDRAG_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_FADEINOUT, cfg::dat.fadeinout ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_AUTOSIZE, cfg::dat.autosize); CheckDlgButton(hwndDlg, IDC_ONDESKTOP, cfg::getByte("CList", "OnDesktop", 0) ? BST_CHECKED : BST_UNCHECKED); SendDlgItemMessage(hwndDlg, IDC_MAXSIZESPIN, UDM_SETRANGE, 0, MAKELONG(100, 0)); SendDlgItemMessage(hwndDlg, IDC_MAXSIZESPIN, UDM_SETPOS, 0, cfg::getByte("CLUI", "MaxSizeHeight", 75)); SendDlgItemMessage(hwndDlg, IDC_CLUIFRAMESBDR, CPM_SETCOLOUR, 0, cfg::getDword("CLUI", "clr_frameborder", RGB(40, 40, 40))); CheckDlgButton(hwndDlg, IDC_AUTOSIZEUPWARD, cfg::getByte("CLUI", "AutoSizeUpward", 0) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_AUTOHIDE, cfg::getByte("CList", "AutoHide", SETTING_AUTOHIDE_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); SendDlgItemMessage(hwndDlg, IDC_HIDETIMESPIN, UDM_SETRANGE, 0, MAKELONG(900, 1)); SendDlgItemMessage(hwndDlg, IDC_HIDETIMESPIN, UDM_SETPOS, 0, MAKELONG(cfg::getWord("CList", "HideTime", SETTING_HIDETIME_DEFAULT), 0)); Utils::enableDlgControl(hwndDlg, IDC_HIDETIME, IsDlgButtonChecked(hwndDlg, IDC_AUTOHIDE)); Utils::enableDlgControl(hwndDlg, IDC_HIDETIMESPIN, IsDlgButtonChecked(hwndDlg, IDC_AUTOHIDE)); Utils::enableDlgControl(hwndDlg, IDC_STATIC01, IsDlgButtonChecked(hwndDlg, IDC_AUTOHIDE)); if (!IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE)) { Utils::enableDlgControl(hwndDlg, IDC_STATIC21, FALSE); Utils::enableDlgControl(hwndDlg, IDC_STATIC22, FALSE); Utils::enableDlgControl(hwndDlg, IDC_MAXSIZEHEIGHT, FALSE); Utils::enableDlgControl(hwndDlg, IDC_MAXSIZESPIN, FALSE); Utils::enableDlgControl(hwndDlg, IDC_AUTOSIZEUPWARD, FALSE); } CheckDlgButton(hwndDlg, IDC_TRANSPARENT, cfg::dat.isTransparent ? BST_CHECKED : BST_UNCHECKED); if (!IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)) { Utils::enableDlgControl(hwndDlg, IDC_STATIC11, FALSE); Utils::enableDlgControl(hwndDlg, IDC_STATIC12, FALSE); Utils::enableDlgControl(hwndDlg, IDC_TRANSACTIVE, FALSE); Utils::enableDlgControl(hwndDlg, IDC_TRANSINACTIVE, FALSE); Utils::enableDlgControl(hwndDlg, IDC_ACTIVEPERC, FALSE); Utils::enableDlgControl(hwndDlg, IDC_INACTIVEPERC, FALSE); } SendDlgItemMessage(hwndDlg, IDC_TRANSACTIVE, TBM_SETRANGE, FALSE, MAKELONG(1, 255)); SendDlgItemMessage(hwndDlg, IDC_TRANSINACTIVE, TBM_SETRANGE, FALSE, MAKELONG(1, 255)); SendDlgItemMessage(hwndDlg, IDC_TRANSACTIVE, TBM_SETPOS, TRUE, cfg::dat.alpha); SendDlgItemMessage(hwndDlg, IDC_TRANSINACTIVE, TBM_SETPOS, TRUE, cfg::dat.autoalpha); SendMessage(hwndDlg, WM_HSCROLL, 0x12345678, 0); CheckDlgButton(hwndDlg, IDC_USEAERO, Skin::settings.fUseAero ? BST_CHECKED : BST_UNCHECKED); SendDlgItemMessage(hwndDlg, IDC_FRAMEGAPSPIN, UDM_SETRANGE, 0, MAKELONG(10, 0)); SendDlgItemMessage(hwndDlg, IDC_FRAMEGAPSPIN, UDM_SETPOS, 0, (LPARAM)cfg::dat.gapBetweenFrames); return TRUE; } case WM_COMMAND: if (LOWORD(wParam) == IDC_AUTOHIDE) { Utils::enableDlgControl(hwndDlg, IDC_HIDETIME, IsDlgButtonChecked(hwndDlg, IDC_AUTOHIDE)); Utils::enableDlgControl(hwndDlg, IDC_HIDETIMESPIN, IsDlgButtonChecked(hwndDlg, IDC_AUTOHIDE)); Utils::enableDlgControl(hwndDlg, IDC_STATIC01, IsDlgButtonChecked(hwndDlg, IDC_AUTOHIDE)); } else if (LOWORD(wParam) == IDC_TRANSPARENT) { Utils::enableDlgControl(hwndDlg, IDC_STATIC11, IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)); Utils::enableDlgControl(hwndDlg, IDC_STATIC12, IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)); Utils::enableDlgControl(hwndDlg, IDC_TRANSACTIVE, IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)); Utils::enableDlgControl(hwndDlg, IDC_TRANSINACTIVE, IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)); Utils::enableDlgControl(hwndDlg, IDC_ACTIVEPERC, IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)); Utils::enableDlgControl(hwndDlg, IDC_INACTIVEPERC, IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)); } else if (LOWORD(wParam) == IDC_AUTOSIZE) { Utils::enableDlgControl(hwndDlg, IDC_STATIC21, IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE)); Utils::enableDlgControl(hwndDlg, IDC_STATIC22, IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE)); Utils::enableDlgControl(hwndDlg, IDC_MAXSIZEHEIGHT, IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE)); Utils::enableDlgControl(hwndDlg, IDC_MAXSIZESPIN, IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE)); Utils::enableDlgControl(hwndDlg, IDC_AUTOSIZEUPWARD, IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE)); } if ((LOWORD(wParam) == IDC_FRAMEGAP || LOWORD(wParam) == IDC_HIDETIME || LOWORD(wParam) == IDC_ROWGAP || LOWORD(wParam) == IDC_MAXSIZEHEIGHT) && (HIWORD(wParam) != EN_CHANGE || (HWND) lParam != GetFocus())) return 0; SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); opt_clui_changed = 1; break; case WM_HSCROLL: { char str[10]; wsprintfA(str, "%d%%", 100 * SendDlgItemMessage(hwndDlg, IDC_TRANSINACTIVE, TBM_GETPOS, 0, 0) / 255); SetDlgItemTextA(hwndDlg, IDC_INACTIVEPERC, str); wsprintfA(str, "%d%%", 100 * SendDlgItemMessage(hwndDlg, IDC_TRANSACTIVE, TBM_GETPOS, 0, 0) / 255); SetDlgItemTextA(hwndDlg, IDC_ACTIVEPERC, str); } if (wParam != 0x12345678) { SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); opt_clui_changed = 1; } break; case WM_NOTIFY: switch (((LPNMHDR) lParam)->code) { case PSN_APPLY: { BOOL translated; BYTE oldFading; COLORREF clr_cluiframes; if(!opt_clui_changed) return TRUE; cfg::writeByte("CLUI", "FadeInOut", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_FADEINOUT)); cfg::dat.fadeinout = IsDlgButtonChecked(hwndDlg, IDC_FADEINOUT) ? 1 : 0; oldFading = cfg::dat.fadeinout; cfg::dat.fadeinout = FALSE; cfg::dat.gapBetweenFrames = GetDlgItemInt(hwndDlg, IDC_FRAMEGAP, &translated, FALSE); cfg::writeDword("CLUIFrames", "GapBetweenFrames", cfg::dat.gapBetweenFrames); cfg::writeByte("CList", "OnTop", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_ONTOP)); SetWindowPos(pcli->hwndContactList, IsDlgButtonChecked(hwndDlg, IDC_ONTOP) ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); SendMessage(pcli->hwndContactList, WM_SIZE, 0, 0); cfg::writeByte("CList", "BringToFront", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_BRINGTOFRONT)); cfg::writeByte("CList", "AlwaysHideOnTB", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_ALWAYSHIDEONTASKBAR)); cfg::writeDword("CLUI", "Frameflags", cfg::dat.dwFlags); cfg::writeByte("CLUI", "ClientAreaDrag", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_CLIENTDRAG)); clr_cluiframes = (COLORREF)SendDlgItemMessage(hwndDlg, IDC_CLUIFRAMESBDR, CPM_GETCOLOUR, 0, 0); if(CLUI::hPenFrames) DeleteObject(CLUI::hPenFrames); CLUI::hPenFrames = CreatePen(PS_SOLID, 1, clr_cluiframes); cfg::writeDword("CLUI", "clr_frameborder", clr_cluiframes); CLUI::applyBorderStyle(); cfg::writeByte("CLUI", "AutoSize", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE)); if((cfg::dat.autosize = IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE) ? 1 : 0)) { SendMessage(pcli->hwndContactList, WM_SIZE, 0, 0); SendMessage(pcli->hwndContactTree, WM_SIZE, 0, 0); } cfg::writeByte("CLUI", "MaxSizeHeight", (BYTE) GetDlgItemInt(hwndDlg, IDC_MAXSIZEHEIGHT, NULL, FALSE)); cfg::writeByte("CLUI", "AutoSizeUpward", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZEUPWARD)); cfg::writeByte("CList", "AutoHide", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_AUTOHIDE)); cfg::writeWord("CList", "HideTime", (WORD) SendDlgItemMessage(hwndDlg, IDC_HIDETIMESPIN, UDM_GETPOS, 0, 0)); cfg::writeByte("CList", "Transparent", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)); cfg::dat.isTransparent = IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT) ? 1 : 0; cfg::writeByte("CList", "Alpha", (BYTE) SendDlgItemMessage(hwndDlg, IDC_TRANSACTIVE, TBM_GETPOS, 0, 0)); cfg::dat.alpha = (BYTE) SendDlgItemMessage(hwndDlg, IDC_TRANSACTIVE, TBM_GETPOS, 0, 0); cfg::writeByte("CList", "AutoAlpha", (BYTE) SendDlgItemMessage(hwndDlg, IDC_TRANSINACTIVE, TBM_GETPOS, 0, 0)); cfg::dat.autoalpha = (BYTE) SendDlgItemMessage(hwndDlg, IDC_TRANSINACTIVE, TBM_GETPOS, 0, 0); cfg::writeByte("CList", "OnDesktop", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_ONDESKTOP)); cfg::writeDword("CLUI", "Frameflags", cfg::dat.dwFlags); cfg::writeByte(SKIN_DB_MODULE, "sfUseAero", IsDlgButtonChecked(hwndDlg, IDC_USEAERO)); if(g_CLUISkinnedBkColorRGB) cfg::dat.colorkey = g_CLUISkinnedBkColorRGB; else { SendMessage(pcli->hwndContactList, WM_SIZE, 0, 0); cfg::dat.colorkey = RGB(255, 0, 255); } Api::updateState(); if(!cfg::isAero) { if (cfg::dat.isTransparent || Skin::metrics.fHaveColorkey) { SetLayeredWindowAttributes(pcli->hwndContactList, 0, 255, LWA_ALPHA | LWA_COLORKEY); SetLayeredWindowAttributes(pcli->hwndContactList, (COLORREF)(Skin::metrics.fHaveColorkey ? cfg::dat.colorkey : 0), (BYTE)(cfg::dat.isTransparent ? cfg::dat.autoalpha : 255), (DWORD)((cfg::dat.isTransparent ? LWA_ALPHA : 0L) | (Skin::metrics.fHaveColorkey ? LWA_COLORKEY : 0L))); } else SetLayeredWindowAttributes(pcli->hwndContactList, RGB(0, 0, 0), (BYTE)255, LWA_ALPHA); } CLUI::configureGeometry(1); ShowWindow(pcli->hwndContactList, SW_SHOW); SendMessage(pcli->hwndContactList, WM_SIZE, 0, 0); SetWindowPos(pcli->hwndContactList, 0, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED); RedrawWindow(pcli->hwndContactList, NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW); cfg::dat.fadeinout = oldFading; SFL_SetState(cfg::dat.bUseFloater & CLUI_FLOATER_AUTOHIDE ? (cfg::getByte("CList", "State", SETTING_STATE_NORMAL) == SETTING_STATE_NORMAL ? 0 : 1) : 1); opt_clui_changed = 0; return TRUE; } } break; } return FALSE; }
INT_PTR CALLBACK DlgProcCluiOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: { opt_clui_changed = 0; TranslateDialogDefault(hwndDlg); CheckDlgButton(hwndDlg, IDC_BRINGTOFRONT, cfg::getByte("CList", "BringToFront", SETTING_BRINGTOFRONT_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_ALWAYSHIDEONTASKBAR, cfg::getByte("CList", "AlwaysHideOnTB", 1) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_ONTOP, cfg::getByte("CList", "OnTop", SETTING_ONTOP_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_SHOWMAINMENU, cfg::getByte("CLUI", "ShowMainMenu", SETTING_SHOWMAINMENU_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CLIENTDRAG, cfg::getByte("CLUI", "ClientAreaDrag", SETTING_CLIENTDRAG_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_FADEINOUT, cfg::dat.fadeinout ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_AUTOSIZE, cfg::dat.autosize ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_DROPSHADOW, cfg::getByte("CList", "WindowShadow", 0) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_ONDESKTOP, cfg::getByte("CList", "OnDesktop", 0) ? BST_CHECKED : BST_UNCHECKED); SendDlgItemMessage(hwndDlg, IDC_BORDERSTYLE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Title bar")); SendDlgItemMessage(hwndDlg, IDC_BORDERSTYLE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Tool Window")); SendDlgItemMessage(hwndDlg, IDC_BORDERSTYLE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Thin border")); SendDlgItemMessage(hwndDlg, IDC_BORDERSTYLE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("No border")); SendDlgItemMessage(hwndDlg, IDC_BORDERSTYLE, CB_SETCURSEL, cfg::getByte("CLUI", "WindowStyle", SETTING_WINDOWSTYLE_TOOLWINDOW), 0); SendDlgItemMessage(hwndDlg, IDC_MAXSIZESPIN, UDM_SETRANGE, 0, MAKELONG(100, 0)); SendDlgItemMessage(hwndDlg, IDC_MAXSIZESPIN, UDM_SETPOS, 0, cfg::getByte("CLUI", "MaxSizeHeight", 75)); SendDlgItemMessage(hwndDlg, IDC_CLIPBORDERSPIN, UDM_SETRANGE, 0, MAKELONG(10, 0)); SendDlgItemMessage(hwndDlg, IDC_CLIPBORDERSPIN, UDM_SETPOS, 0, cfg::dat.bClipBorder); SendDlgItemMessage(hwndDlg, IDC_CLEFTSPIN, UDM_SETRANGE, 0, MAKELONG(255, 0)); SendDlgItemMessage(hwndDlg, IDC_CRIGHTSPIN, UDM_SETRANGE, 0, MAKELONG(255, 0)); SendDlgItemMessage(hwndDlg, IDC_CTOPSPIN, UDM_SETRANGE, 0, MAKELONG(255, 0)); SendDlgItemMessage(hwndDlg, IDC_CBOTTOMSPIN, UDM_SETRANGE, 0, MAKELONG(255, 0)); SendDlgItemMessage(hwndDlg, IDC_CLEFTSPIN, UDM_SETPOS, 0, cfg::dat.bCLeft - (cfg::dat.dwFlags & CLUI_FRAME_CLISTSUNKEN ? 3 : 0)); SendDlgItemMessage(hwndDlg, IDC_CRIGHTSPIN, UDM_SETPOS, 0, cfg::dat.bCRight - (cfg::dat.dwFlags & CLUI_FRAME_CLISTSUNKEN ? 3 : 0)); SendDlgItemMessage(hwndDlg, IDC_CTOPSPIN, UDM_SETPOS, 0, cfg::dat.bCTop); SendDlgItemMessage(hwndDlg, IDC_CBOTTOMSPIN, UDM_SETPOS, 0, cfg::dat.bCBottom); CheckDlgButton(hwndDlg, IDC_AUTOSIZEUPWARD, cfg::getByte("CLUI", "AutoSizeUpward", 0) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_AUTOHIDE, cfg::getByte("CList", "AutoHide", SETTING_AUTOHIDE_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); SendDlgItemMessage(hwndDlg, IDC_HIDETIMESPIN, UDM_SETRANGE, 0, MAKELONG(900, 1)); SendDlgItemMessage(hwndDlg, IDC_HIDETIMESPIN, UDM_SETPOS, 0, MAKELONG(cfg::getWord("CList", "HideTime", SETTING_HIDETIME_DEFAULT), 0)); Utils::enableDlgControl(hwndDlg, IDC_HIDETIME, IsDlgButtonChecked(hwndDlg, IDC_AUTOHIDE)); Utils::enableDlgControl(hwndDlg, IDC_HIDETIMESPIN, IsDlgButtonChecked(hwndDlg, IDC_AUTOHIDE)); Utils::enableDlgControl(hwndDlg, IDC_STATIC01, IsDlgButtonChecked(hwndDlg, IDC_AUTOHIDE)); if (BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE)) { Utils::enableDlgControl(hwndDlg, IDC_STATIC21, FALSE); Utils::enableDlgControl(hwndDlg, IDC_STATIC22, FALSE); Utils::enableDlgControl(hwndDlg, IDC_MAXSIZEHEIGHT, FALSE); Utils::enableDlgControl(hwndDlg, IDC_MAXSIZESPIN, FALSE); Utils::enableDlgControl(hwndDlg, IDC_AUTOSIZEUPWARD, FALSE); } { DBVARIANT dbv; if (!cfg::getTString(NULL, "CList", "TitleText", &dbv)) { SetDlgItemText(hwndDlg, IDC_TITLETEXT, dbv.ptszVal); db_free(&dbv); } else SetDlgItemTextA(hwndDlg, IDC_TITLETEXT, MIRANDANAME); } CheckDlgButton(hwndDlg, IDC_TRANSPARENT, cfg::dat.isTransparent ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_FULLTRANSPARENT, cfg::dat.bFullTransparent ? BST_CHECKED : BST_UNCHECKED); if (BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)) { Utils::enableDlgControl(hwndDlg, IDC_STATIC11, FALSE); Utils::enableDlgControl(hwndDlg, IDC_STATIC12, FALSE); Utils::enableDlgControl(hwndDlg, IDC_TRANSACTIVE, FALSE); Utils::enableDlgControl(hwndDlg, IDC_TRANSINACTIVE, FALSE); Utils::enableDlgControl(hwndDlg, IDC_ACTIVEPERC, FALSE); Utils::enableDlgControl(hwndDlg, IDC_INACTIVEPERC, FALSE); } SendDlgItemMessage(hwndDlg, IDC_TRANSACTIVE, TBM_SETRANGE, FALSE, MAKELONG(1, 255)); SendDlgItemMessage(hwndDlg, IDC_TRANSINACTIVE, TBM_SETRANGE, FALSE, MAKELONG(1, 255)); SendDlgItemMessage(hwndDlg, IDC_TRANSACTIVE, TBM_SETPOS, TRUE, cfg::dat.alpha); SendDlgItemMessage(hwndDlg, IDC_TRANSINACTIVE, TBM_SETPOS, TRUE, cfg::dat.autoalpha); SendMessage(hwndDlg, WM_HSCROLL, 0x12345678, 0); CheckDlgButton(hwndDlg, IDC_ROUNDEDBORDER, cfg::dat.dwFlags & CLUI_FRAME_ROUNDEDFRAME ? BST_CHECKED : BST_UNCHECKED); SendDlgItemMessage(hwndDlg, IDC_FRAMEGAPSPIN, UDM_SETRANGE, 0, MAKELONG(10, 0)); SendDlgItemMessage(hwndDlg, IDC_FRAMEGAPSPIN, UDM_SETPOS, 0, (LPARAM)cfg::dat.gapBetweenFrames); } return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDC_AUTOHIDE) { Utils::enableDlgControl(hwndDlg, IDC_HIDETIME, IsDlgButtonChecked(hwndDlg, IDC_AUTOHIDE)); Utils::enableDlgControl(hwndDlg, IDC_HIDETIMESPIN, IsDlgButtonChecked(hwndDlg, IDC_AUTOHIDE)); Utils::enableDlgControl(hwndDlg, IDC_STATIC01, IsDlgButtonChecked(hwndDlg, IDC_AUTOHIDE)); } else if (LOWORD(wParam) == IDC_TRANSPARENT) { Utils::enableDlgControl(hwndDlg, IDC_STATIC11, IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)); Utils::enableDlgControl(hwndDlg, IDC_STATIC12, IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)); Utils::enableDlgControl(hwndDlg, IDC_TRANSACTIVE, IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)); Utils::enableDlgControl(hwndDlg, IDC_TRANSINACTIVE, IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)); Utils::enableDlgControl(hwndDlg, IDC_ACTIVEPERC, IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)); Utils::enableDlgControl(hwndDlg, IDC_INACTIVEPERC, IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)); } else if (LOWORD(wParam) == IDC_AUTOSIZE) { Utils::enableDlgControl(hwndDlg, IDC_STATIC21, IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE)); Utils::enableDlgControl(hwndDlg, IDC_STATIC22, IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE)); Utils::enableDlgControl(hwndDlg, IDC_MAXSIZEHEIGHT, IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE)); Utils::enableDlgControl(hwndDlg, IDC_MAXSIZESPIN, IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE)); Utils::enableDlgControl(hwndDlg, IDC_AUTOSIZEUPWARD, IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE)); } if ((LOWORD(wParam) == IDC_FRAMEGAP || LOWORD(wParam) == IDC_HIDETIME || LOWORD(wParam) == IDC_CLIPBORDER || LOWORD(wParam) == IDC_TITLETEXT || LOWORD(wParam) == IDC_MAXSIZEHEIGHT || LOWORD(wParam) == IDC_CLEFT || LOWORD(wParam) == IDC_CRIGHT || LOWORD(wParam) == IDC_CTOP || LOWORD(wParam) == IDC_CBOTTOM) && (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus())) return 0; if (LOWORD(wParam) == IDC_BORDERSTYLE && (HIWORD(wParam) != CBN_SELCHANGE || (HWND)lParam != GetFocus())) return 0; SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); opt_clui_changed = 1; break; case WM_HSCROLL: { char str[10]; mir_snprintf(str, SIZEOF(str), "%d%%", 100 * SendDlgItemMessage(hwndDlg, IDC_TRANSINACTIVE, TBM_GETPOS, 0, 0) / 255); SetDlgItemTextA(hwndDlg, IDC_INACTIVEPERC, str); mir_snprintf(str, SIZEOF(str), "%d%%", 100 * SendDlgItemMessage(hwndDlg, IDC_TRANSACTIVE, TBM_GETPOS, 0, 0) / 255); SetDlgItemTextA(hwndDlg, IDC_ACTIVEPERC, str); } if (wParam != 0x12345678) { SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); opt_clui_changed = 1; } break; case WM_NOTIFY: if (((LPNMHDR)lParam)->code == PSN_APPLY) { BOOL translated; BYTE oldFading; BYTE windowStyle = (BYTE)SendDlgItemMessage(hwndDlg, IDC_BORDERSTYLE, CB_GETCURSEL, 0, 0); if (!opt_clui_changed) return TRUE; cfg::writeByte("CLUI", "FadeInOut", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_FADEINOUT)); cfg::dat.fadeinout = IsDlgButtonChecked(hwndDlg, IDC_FADEINOUT) ? 1 : 0; oldFading = cfg::dat.fadeinout; cfg::dat.fadeinout = FALSE; cfg::writeByte("CLUI", "WindowStyle", windowStyle); cfg::dat.gapBetweenFrames = GetDlgItemInt(hwndDlg, IDC_FRAMEGAP, &translated, FALSE); cfg::writeDword("CLUIFrames", "GapBetweenFrames", cfg::dat.gapBetweenFrames); cfg::writeByte("CList", "OnTop", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_ONTOP)); SetWindowPos(pcli->hwndContactList, IsDlgButtonChecked(hwndDlg, IDC_ONTOP) ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); cfg::dat.bCLeft = (BYTE)SendDlgItemMessage(hwndDlg, IDC_CLEFTSPIN, UDM_GETPOS, 0, 0); cfg::dat.bCRight = (BYTE)SendDlgItemMessage(hwndDlg, IDC_CRIGHTSPIN, UDM_GETPOS, 0, 0); cfg::dat.bCTop = (BYTE)SendDlgItemMessage(hwndDlg, IDC_CTOPSPIN, UDM_GETPOS, 0, 0); cfg::dat.bCBottom = (BYTE)SendDlgItemMessage(hwndDlg, IDC_CBOTTOMSPIN, UDM_GETPOS, 0, 0); cfg::writeDword("CLUI", "clmargins", MAKELONG(MAKEWORD(cfg::dat.bCLeft, cfg::dat.bCRight), MAKEWORD(cfg::dat.bCTop, cfg::dat.bCBottom))); SendMessage(pcli->hwndContactList, WM_SIZE, 0, 0); cfg::writeByte("CList", "BringToFront", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_BRINGTOFRONT)); cfg::writeByte("CList", "AlwaysHideOnTB", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_ALWAYSHIDEONTASKBAR)); if (windowStyle != SETTING_WINDOWSTYLE_DEFAULT) { LONG style; // Window must be hidden to dynamically remove the taskbar button. // See http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/programmersguide/shell_int/shell_int_programming/taskbar.asp WINDOWPLACEMENT p; p.length = sizeof(p); GetWindowPlacement(pcli->hwndContactList, &p); ShowWindow(pcli->hwndContactList, SW_HIDE); style = GetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE); style |= WS_EX_TOOLWINDOW | WS_EX_WINDOWEDGE; style &= ~WS_EX_APPWINDOW; SetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE, style); SetWindowPlacement(pcli->hwndContactList, &p); ShowWindow(pcli->hwndContactList, SW_SHOW); } else { LONG style; style = GetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE); style &= ~(WS_EX_TOOLWINDOW | WS_EX_WINDOWEDGE); if (cfg::getByte("CList", "AlwaysHideOnTB", 1)) style &= ~WS_EX_APPWINDOW; else { style |= WS_EX_APPWINDOW; AddToTaskBar(pcli->hwndContactList); } SetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE, style); } cfg::dat.bClipBorder = (BYTE)GetDlgItemInt(hwndDlg, IDC_CLIPBORDER, &translated, FALSE); cfg::writeDword("CLUI", "Frameflags", cfg::dat.dwFlags); cfg::writeByte("CLUI", "clipborder", cfg::dat.bClipBorder); cfg::writeByte("CLUI", "ShowMainMenu", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_SHOWMAINMENU)); cfg::writeByte("CLUI", "ClientAreaDrag", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_CLIENTDRAG)); ApplyCLUIBorderStyle(); if (BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_SHOWMAINMENU)) SetMenu(pcli->hwndContactList, NULL); else SetMenu(pcli->hwndContactList, pcli->hMenuMain); { TCHAR title[256]; GetDlgItemText(hwndDlg, IDC_TITLETEXT, title, SIZEOF(title)); cfg::writeTString(NULL, "CList", "TitleText", title); SetWindowText(pcli->hwndContactList, title); } cfg::dat.dwFlags = IsDlgButtonChecked(hwndDlg, IDC_ROUNDEDBORDER) ? cfg::dat.dwFlags | CLUI_FRAME_ROUNDEDFRAME : cfg::dat.dwFlags & ~CLUI_FRAME_ROUNDEDFRAME; cfg::writeByte("CLUI", "AutoSize", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE)); if ((cfg::dat.autosize = IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE) ? 1 : 0)) { SendMessage(pcli->hwndContactList, WM_SIZE, 0, 0); SendMessage(pcli->hwndContactTree, WM_SIZE, 0, 0); } cfg::writeByte("CLUI", "MaxSizeHeight", (BYTE)GetDlgItemInt(hwndDlg, IDC_MAXSIZEHEIGHT, NULL, FALSE)); cfg::writeByte("CLUI", "AutoSizeUpward", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZEUPWARD)); cfg::writeByte("CList", "AutoHide", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_AUTOHIDE)); cfg::writeWord("CList", "HideTime", (WORD)SendDlgItemMessage(hwndDlg, IDC_HIDETIMESPIN, UDM_GETPOS, 0, 0)); cfg::writeByte("CList", "Transparent", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)); cfg::dat.isTransparent = IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT) ? 1 : 0; cfg::writeByte("CList", "Alpha", (BYTE)SendDlgItemMessage(hwndDlg, IDC_TRANSACTIVE, TBM_GETPOS, 0, 0)); cfg::dat.alpha = (BYTE)SendDlgItemMessage(hwndDlg, IDC_TRANSACTIVE, TBM_GETPOS, 0, 0); cfg::writeByte("CList", "AutoAlpha", (BYTE)SendDlgItemMessage(hwndDlg, IDC_TRANSINACTIVE, TBM_GETPOS, 0, 0)); cfg::dat.autoalpha = (BYTE)SendDlgItemMessage(hwndDlg, IDC_TRANSINACTIVE, TBM_GETPOS, 0, 0); cfg::writeByte("CList", "WindowShadow", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_DROPSHADOW)); cfg::writeByte("CList", "OnDesktop", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_ONDESKTOP)); cfg::writeDword("CLUI", "Frameflags", cfg::dat.dwFlags); cfg::dat.bFullTransparent = IsDlgButtonChecked(hwndDlg, IDC_FULLTRANSPARENT) ? 1 : 0; cfg::writeByte("CLUI", "fulltransparent", (BYTE)cfg::dat.bFullTransparent); if (cfg::dat.bLayeredHack) SetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE, GetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE) | WS_EX_LAYERED); if (g_CLUISkinnedBkColorRGB) cfg::dat.colorkey = g_CLUISkinnedBkColorRGB; else if (cfg::dat.bClipBorder == 0 && !(cfg::dat.dwFlags & CLUI_FRAME_ROUNDEDFRAME)) cfg::dat.colorkey = cfg::getDword("CLC", "BkColour", CLCDEFAULT_BKCOLOUR); else { SendMessage(pcli->hwndContactList, WM_SIZE, 0, 0); cfg::dat.colorkey = RGB(255, 0, 255); } if (cfg::dat.isTransparent || cfg::dat.bFullTransparent) { SetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE, GetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE) & ~WS_EX_LAYERED); SetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE, GetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE) | WS_EX_LAYERED); SetLayeredWindowAttributes(pcli->hwndContactList, 0, 255, LWA_ALPHA | LWA_COLORKEY); SetLayeredWindowAttributes(pcli->hwndContactList, (COLORREF)(cfg::dat.bFullTransparent ? cfg::dat.colorkey : 0), (BYTE)(cfg::dat.isTransparent ? cfg::dat.autoalpha : 255), (DWORD)((cfg::dat.isTransparent ? LWA_ALPHA : 0L) | (cfg::dat.bFullTransparent ? LWA_COLORKEY : 0L))); } else { SetLayeredWindowAttributes(pcli->hwndContactList, RGB(0, 0, 0), (BYTE)255, LWA_ALPHA); if (!cfg::dat.bLayeredHack) SetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE, GetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE) & ~WS_EX_LAYERED); } ConfigureCLUIGeometry(1); ShowWindow(pcli->hwndContactList, SW_SHOW); SendMessage(pcli->hwndContactList, WM_SIZE, 0, 0); SetWindowPos(pcli->hwndContactList, 0, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED); RedrawWindow(pcli->hwndContactList, NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW); cfg::dat.fadeinout = oldFading; opt_clui_changed = 0; pcli->pfnClcOptionsChanged(); pcli->pfnClcBroadcast(CLM_AUTOREBUILD, 0, 0); return TRUE; } break; } return FALSE; }
static INT_PTR CALLBACK DlgProcCluiOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); CheckDlgButton(hwndDlg, IDC_BRINGTOFRONT, db_get_b(NULL, "CList", "BringToFront", SETTING_BRINGTOFRONT_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_ONTOP, db_get_b(NULL, "CList", "OnTop", SETTING_ONTOP_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_TOOLWND, db_get_b(NULL, "CList", "ToolWindow", SETTING_TOOLWINDOW_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_MIN2TRAY, db_get_b(NULL, "CList", "Min2Tray", SETTING_MIN2TRAY_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); if (IsDlgButtonChecked(hwndDlg, IDC_TOOLWND)) EnableWindow(GetDlgItem(hwndDlg, IDC_MIN2TRAY), FALSE); CheckDlgButton(hwndDlg, IDC_SHOWCAPTION, db_get_b(NULL, "CLUI", "ShowCaption", SETTING_SHOWCAPTION_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_SHOWMAINMENU, db_get_b(NULL, "CLUI", "ShowMainMenu", SETTING_SHOWMAINMENU_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CLIENTDRAG, db_get_b(NULL, "CLUI", "ClientAreaDrag", SETTING_CLIENTDRAG_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); if (BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_SHOWCAPTION)) { EnableWindow(GetDlgItem(hwndDlg, IDC_MIN2TRAY), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_TOOLWND), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_TITLETEXT), FALSE); } CheckDlgButton(hwndDlg, IDC_FADEINOUT, db_get_b(NULL, "CLUI", "FadeInOut", 0) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_AUTOSIZE, db_get_b(NULL, "CLUI", "AutoSize", 0) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_DROPSHADOW, db_get_b(NULL, "CList", "WindowShadow", 0) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_ONDESKTOP, db_get_b(NULL, "CList", "OnDesktop", 0) ? BST_CHECKED : BST_UNCHECKED); SendDlgItemMessage(hwndDlg, IDC_MAXSIZESPIN, UDM_SETRANGE, 0, MAKELONG(100, 0)); SendDlgItemMessage(hwndDlg, IDC_MAXSIZESPIN, UDM_SETPOS, 0, db_get_b(NULL, "CLUI", "MaxSizeHeight", 75)); CheckDlgButton(hwndDlg, IDC_AUTOSIZEUPWARD, db_get_b(NULL, "CLUI", "AutoSizeUpward", 0) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_AUTOHIDE, db_get_b(NULL, "CList", "AutoHide", SETTING_AUTOHIDE_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); SendDlgItemMessage(hwndDlg, IDC_HIDETIMESPIN, UDM_SETRANGE, 0, MAKELONG(900, 1)); SendDlgItemMessage(hwndDlg, IDC_HIDETIMESPIN, UDM_SETPOS, 0, MAKELONG(db_get_w(NULL, "CList", "HideTime", SETTING_HIDETIME_DEFAULT), 0)); EnableWindow(GetDlgItem(hwndDlg, IDC_HIDETIME), IsDlgButtonChecked(hwndDlg, IDC_AUTOHIDE)); EnableWindow(GetDlgItem(hwndDlg, IDC_HIDETIMESPIN), IsDlgButtonChecked(hwndDlg, IDC_AUTOHIDE)); EnableWindow(GetDlgItem(hwndDlg, IDC_STATIC01), IsDlgButtonChecked(hwndDlg, IDC_AUTOHIDE)); if (BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE)) { EnableWindow(GetDlgItem(hwndDlg, IDC_STATIC21), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_STATIC22), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_MAXSIZEHEIGHT), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_MAXSIZESPIN), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_AUTOSIZEUPWARD), FALSE); } { DBVARIANT dbv; if ( !db_get_ts(NULL, "CList", "TitleText", &dbv)) { SetDlgItemText(hwndDlg, IDC_TITLETEXT, dbv.ptszVal); db_free( &dbv ); } else SetDlgItemTextA(hwndDlg, IDC_TITLETEXT, MIRANDANAME); } CheckDlgButton(hwndDlg, IDC_TRANSPARENT, db_get_b(NULL, "CList", "Transparent", SETTING_TRANSPARENT_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); if (BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)) { EnableWindow(GetDlgItem(hwndDlg, IDC_STATIC11), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_STATIC12), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_TRANSACTIVE), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_TRANSINACTIVE), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_ACTIVEPERC), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_INACTIVEPERC), FALSE); } SendDlgItemMessage(hwndDlg, IDC_TRANSACTIVE, TBM_SETRANGE, FALSE, MAKELONG(1, 255)); SendDlgItemMessage(hwndDlg, IDC_TRANSINACTIVE, TBM_SETRANGE, FALSE, MAKELONG(1, 255)); SendDlgItemMessage(hwndDlg, IDC_TRANSACTIVE, TBM_SETPOS, TRUE, db_get_b(NULL, "CList", "Alpha", SETTING_ALPHA_DEFAULT)); SendDlgItemMessage(hwndDlg, IDC_TRANSINACTIVE, TBM_SETPOS, TRUE, db_get_b(NULL, "CList", "AutoAlpha", SETTING_AUTOALPHA_DEFAULT)); SendMessage(hwndDlg, WM_HSCROLL, 0x12345678, 0); return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDC_AUTOHIDE) { EnableWindow(GetDlgItem(hwndDlg, IDC_HIDETIME), IsDlgButtonChecked(hwndDlg, IDC_AUTOHIDE)); EnableWindow(GetDlgItem(hwndDlg, IDC_HIDETIMESPIN), IsDlgButtonChecked(hwndDlg, IDC_AUTOHIDE)); EnableWindow(GetDlgItem(hwndDlg, IDC_STATIC01), IsDlgButtonChecked(hwndDlg, IDC_AUTOHIDE)); } else if (LOWORD(wParam) == IDC_TRANSPARENT) { EnableWindow(GetDlgItem(hwndDlg, IDC_STATIC11), IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)); EnableWindow(GetDlgItem(hwndDlg, IDC_STATIC12), IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)); EnableWindow(GetDlgItem(hwndDlg, IDC_TRANSACTIVE), IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)); EnableWindow(GetDlgItem(hwndDlg, IDC_TRANSINACTIVE), IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)); EnableWindow(GetDlgItem(hwndDlg, IDC_ACTIVEPERC), IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)); EnableWindow(GetDlgItem(hwndDlg, IDC_INACTIVEPERC), IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)); } else if (LOWORD(wParam) == IDC_AUTOSIZE) { EnableWindow(GetDlgItem(hwndDlg, IDC_STATIC21), IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE)); EnableWindow(GetDlgItem(hwndDlg, IDC_STATIC22), IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE)); EnableWindow(GetDlgItem(hwndDlg, IDC_MAXSIZEHEIGHT), IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE)); EnableWindow(GetDlgItem(hwndDlg, IDC_MAXSIZESPIN), IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE)); EnableWindow(GetDlgItem(hwndDlg, IDC_AUTOSIZEUPWARD), IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE)); } else if (LOWORD(wParam) == IDC_TOOLWND) { EnableWindow(GetDlgItem(hwndDlg, IDC_MIN2TRAY), BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_TOOLWND)); } else if (LOWORD(wParam) == IDC_SHOWCAPTION) { EnableWindow(GetDlgItem(hwndDlg, IDC_TOOLWND), IsDlgButtonChecked(hwndDlg, IDC_SHOWCAPTION)); EnableWindow(GetDlgItem(hwndDlg, IDC_MIN2TRAY), BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_TOOLWND) && IsDlgButtonChecked(hwndDlg, IDC_SHOWCAPTION)); EnableWindow(GetDlgItem(hwndDlg, IDC_TITLETEXT), IsDlgButtonChecked(hwndDlg, IDC_SHOWCAPTION)); } if ((LOWORD(wParam) == IDC_HIDETIME || LOWORD(wParam) == IDC_TITLETEXT || LOWORD(wParam) == IDC_MAXSIZEHEIGHT) && (HIWORD(wParam) != EN_CHANGE || (HWND) lParam != GetFocus())) return 0; // Enable apply button SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; case WM_HSCROLL: { char str[10]; mir_snprintf(str, SIZEOF(str), "%d%%", 100 * SendDlgItemMessage(hwndDlg, IDC_TRANSINACTIVE, TBM_GETPOS, 0, 0) / 255); SetDlgItemTextA(hwndDlg, IDC_INACTIVEPERC, str); mir_snprintf(str, SIZEOF(str), "%d%%", 100 * SendDlgItemMessage(hwndDlg, IDC_TRANSACTIVE, TBM_GETPOS, 0, 0) / 255); SetDlgItemTextA(hwndDlg, IDC_ACTIVEPERC, str); } if (wParam != 0x12345678) SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; case WM_NOTIFY: if (((LPNMHDR) lParam)->code == PSN_APPLY) { db_set_b(NULL, "CList", "OnTop", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_ONTOP)); db_set_b(NULL, "CList", "ToolWindow", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_TOOLWND)); db_set_b(NULL, "CList", "BringToFront", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_BRINGTOFRONT)); db_set_b(NULL, "CLUI", "FadeInOut", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_FADEINOUT)); db_set_b(NULL, "CLUI", "AutoSize", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE)); db_set_b(NULL, "CLUI", "MaxSizeHeight", (BYTE) GetDlgItemInt(hwndDlg, IDC_MAXSIZEHEIGHT, NULL, FALSE)); db_set_b(NULL, "CLUI", "AutoSizeUpward", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZEUPWARD)); db_set_b(NULL, "CList", "AutoHide", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_AUTOHIDE)); db_set_w(NULL, "CList", "HideTime", (WORD) SendDlgItemMessage(hwndDlg, IDC_HIDETIMESPIN, UDM_GETPOS, 0, 0)); db_set_b(NULL, "CList", "Transparent", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)); db_set_b(NULL, "CList", "Alpha", (BYTE) SendDlgItemMessage(hwndDlg, IDC_TRANSACTIVE, TBM_GETPOS, 0, 0)); db_set_b(NULL, "CList", "AutoAlpha", (BYTE) SendDlgItemMessage(hwndDlg, IDC_TRANSINACTIVE, TBM_GETPOS, 0, 0)); db_set_b(NULL, "CList", "WindowShadow", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_DROPSHADOW)); db_set_b(NULL, "CList", "OnDesktop", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_ONDESKTOP)); db_set_b(NULL, "CLUI", "ShowCaption", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_SHOWCAPTION)); db_set_b(NULL, "CLUI", "ShowMainMenu", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_SHOWMAINMENU)); db_set_b(NULL, "CLUI", "ClientAreaDrag", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_CLIENTDRAG)); db_set_b(NULL, "CList", "Min2Tray", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_MIN2TRAY)); { TCHAR title[256]; GetDlgItemText(hwndDlg, IDC_TITLETEXT, title, SIZEOF(title)); db_set_ts(NULL, "CList", "TitleText", title); SetWindowText(pcli->hwndContactList, title); } pcli->pfnLoadCluiGlobalOpts(); SetWindowPos(pcli->hwndContactList, IsDlgButtonChecked(hwndDlg, IDC_ONTOP) ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); if (IsDlgButtonChecked(hwndDlg, IDC_TOOLWND)) { // Window must be hidden to dynamically remove the taskbar button. // See http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/programmersguide/shell_int/shell_int_programming/taskbar.asp WINDOWPLACEMENT p; p.length = sizeof(p); GetWindowPlacement(pcli->hwndContactList, &p); ShowWindow(pcli->hwndContactList, SW_HIDE); SetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE, GetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE) | WS_EX_TOOLWINDOW | WS_EX_WINDOWEDGE); SetWindowPlacement(pcli->hwndContactList, &p); } else SetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE, GetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE) & ~WS_EX_TOOLWINDOW); if (IsDlgButtonChecked(hwndDlg, IDC_ONDESKTOP)) { HWND hProgMan = FindWindowA("Progman", NULL); if (IsWindow(hProgMan)) SetParent(pcli->hwndContactList, hProgMan); } else SetParent(pcli->hwndContactList, NULL); if (IsDlgButtonChecked(hwndDlg, IDC_SHOWCAPTION)) SetWindowLongPtr(pcli->hwndContactList, GWL_STYLE, GetWindowLongPtr(pcli->hwndContactList, GWL_STYLE) | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX); else SetWindowLongPtr(pcli->hwndContactList, GWL_STYLE, GetWindowLongPtr(pcli->hwndContactList, GWL_STYLE) & ~(WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX)); if (BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_SHOWMAINMENU)) SetMenu(pcli->hwndContactList, NULL); else SetMenu(pcli->hwndContactList, pcli->hMenuMain); SetWindowPos(pcli->hwndContactList, 0, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED); RedrawWindow(pcli->hwndContactList, NULL, NULL, RDW_FRAME | RDW_INVALIDATE); if (IsIconic(pcli->hwndContactList) && BST_UNCHECKED == IsDlgButtonChecked(hwndDlg, IDC_TOOLWND)) ShowWindow(pcli->hwndContactList, IsDlgButtonChecked(hwndDlg, IDC_MIN2TRAY) ? SW_HIDE : SW_SHOW); if (IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)) { SetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE, GetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE) | WS_EX_LAYERED); SetLayeredWindowAttributes(pcli->hwndContactList, RGB(0, 0, 0), (BYTE)db_get_b(NULL, "CList", "AutoAlpha", SETTING_AUTOALPHA_DEFAULT), LWA_ALPHA); } else SetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE, GetWindowLongPtr(pcli->hwndContactList, GWL_EXSTYLE) & ~WS_EX_LAYERED); SendMessage(pcli->hwndContactTree, WM_SIZE, 0, 0); //forces it to send a cln_listsizechanged return TRUE; } break; } return FALSE; }
// インスタンスの初期化(全画面をウィンドウで覆う) BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; // HWND hLayerWnd; hInst = hInstance; // グローバル変数にインスタンス処理を格納します。 int x, y, w, h; // 仮想スクリーン全体をカバー x = GetSystemMetrics(SM_XVIRTUALSCREEN); y = GetSystemMetrics(SM_YVIRTUALSCREEN); w = GetSystemMetrics(SM_CXVIRTUALSCREEN); h = GetSystemMetrics(SM_CYVIRTUALSCREEN); // x, y のオフセット値を覚えておく ofX = x; ofY = y; // 完全に透過したウィンドウを作る hWnd = CreateWindowEx( WS_EX_TRANSPARENT | WS_EX_TOOLWINDOW | WS_EX_TOPMOST #if(_WIN32_WINNT >= 0x0500) | WS_EX_NOACTIVATE #endif , szWindowClass, NULL, WS_POPUP, 0, 0, 0, 0, NULL, NULL, hInstance, NULL); // 作れなかった...? if (!hWnd) return FALSE; // 全画面を覆う MoveWindow(hWnd, x, y, w, h, FALSE); // nCmdShow を無視 (SW_MAXIMIZE とかされると困る) ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); // ESCキー検知タイマー SetTimer(hWnd, 1, 100, NULL); // レイヤーウィンドウの作成 hLayerWnd = CreateWindowEx( WS_EX_TOOLWINDOW #if(_WIN32_WINNT >= 0x0500) | WS_EX_LAYERED | WS_EX_NOACTIVATE #endif , szWindowClassL, NULL, WS_POPUP, 100, 100, 300, 300, hWnd, NULL, hInstance, NULL); SetLayeredWindowAttributes(hLayerWnd, RGB(255, 0, 0), 100, LWA_COLORKEY|LWA_ALPHA); return TRUE; }
static VOID DoTimer(PFLT_WND FltInfo, UINT idTimer) { switch (idTimer) { /* timer to check if cursor is in toolbar coords */ case ID_TIMER1: { POINT pt; /* kill timer if toobar is not opaque */ if (FltInfo->bOpaque != TRUE) { KillTimer(FltInfo->hSelf, ID_TIMER1); break; } if (GetCursorPos(&pt)) { RECT rect; if (GetWindowRect(FltInfo->hSelf, &rect)) { if (!PtInRect(&rect, pt)) { KillTimer(FltInfo->hSelf, ID_TIMER1); KillTimer(FltInfo->hSelf, ID_TIMER2); /* timer to fade out toolbar */ SetTimer(FltInfo->hSelf, ID_TIMER3, 50, NULL); } } } } break; /* timer to fade in toolbar */ case ID_TIMER2: { SetLayeredWindowAttributes(FltInfo->hSelf, 0, (255 * FltInfo->Transparancy) / 100, LWA_ALPHA); /* increment transparancy until it is opaque (100) */ FltInfo->Transparancy += 5; if (FltInfo->Transparancy == 100) { SetWindowLongPtr(FltInfo->hSelf, GWL_EXSTYLE, GetWindowLongPtr(FltInfo->hSelf, GWL_EXSTYLE) & ~WS_EX_LAYERED); FltInfo->bOpaque = TRUE; KillTimer(FltInfo->hSelf, ID_TIMER2); } } break; case ID_TIMER3: { LONG Style; Style = GetWindowLongPtr(FltInfo->hSelf, GWL_EXSTYLE); if (Style & ~WS_EX_LAYERED) { SetWindowLongPtr(FltInfo->hSelf, GWL_EXSTYLE, Style | WS_EX_LAYERED); } FltInfo->Transparancy -= 5; if (FltInfo->Transparancy >= 60) { /* set the tranclucency to 60% */ SetLayeredWindowAttributes(FltInfo->hSelf, 0, (255 * FltInfo->Transparancy) / 100, LWA_ALPHA); if (FltInfo->Transparancy == 60) { FltInfo->bOpaque = FALSE; KillTimer(FltInfo->hSelf, ID_TIMER3); } } } break; } }
LRESULT CALLBACK FloatToolbarWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { PFLT_WND FltInfo; /* Get the window context */ FltInfo = (PFLT_WND)GetWindowLongPtr(hwnd, GWLP_USERDATA); if (FltInfo == NULL && Message != WM_CREATE) { goto HandleDefaultMessage; } switch(Message) { case WM_CREATE: { FltInfo = (PFLT_WND)(((LPCREATESTRUCT)lParam)->lpCreateParams); /*FIXME: read this from registry */ // FltInfo->bShow = TRUE; SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)FltInfo); FltInfo->bOpaque = FALSE; SetWindowLongPtr(hwnd, GWL_EXSTYLE, GetWindowLongPtr(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED); /* set the tranclucency to 60% */ FltInfo->Transparancy = 60; SetLayeredWindowAttributes(hwnd, 0, (255 * FltInfo->Transparancy) / 100, LWA_ALPHA); } break; case WM_TIMER: { DoTimer(FltInfo, wParam); } break; case WM_NCMOUSEMOVE: case WM_MOUSEMOVE: { if (FltInfo->bOpaque == FALSE) { RedrawWindow(hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); FltInfo->bOpaque = TRUE; //MessageBox(NULL, _T("in"), _T("Hit test"), MB_OK | MB_ICONEXCLAMATION); /* timer to check if cursor is in toolbar coords */ SetTimer(hwnd, ID_TIMER1, 200, NULL); /* timer to fade in the toolbars */ SetTimer(hwnd, ID_TIMER2, 50, NULL); } } break; case WM_CLOSE: ShowHideWindow(FltInfo->hSelf); break; case WM_COMMAND: { if (LOWORD(wParam) == IDCANCEL) ShowHideWindow(FltInfo->hSelf); switch(LOWORD(wParam)) { case ID_NEW: MessageBox(hwnd, _T("Kapow!"), _T("Hit test"), MB_OK | MB_ICONEXCLAMATION); break; case ID_CLONESTAMP: case ID_COLORPICKER: case ID_ECLIPSE: case ID_ECLIPSESEL: case ID_ERASER: case ID_FREEFORM: case ID_LASOO: case ID_LINE: case ID_MAGICWAND: case ID_MOVE: case ID_MOVESEL: case ID_PAINTBRUSH: case ID_PAINTBUCKET: case ID_PENCIL: case ID_RECOLORING: case ID_RECTANGLE: case ID_ROUNDRECT: case ID_TEXT: case ID_ZOOM: /*SendMessage(Info->hSelf, LOWORD(wParam), wParam, lParam);*/ break; } } break; case WM_NCACTIVATE: /* FIXME: needs fully implementing */ return DefWindowProc(hwnd, Message, TRUE, lParam); break; case WM_DESTROY: SetWindowLongPtr(hwnd, GWLP_USERDATA, 0); break; default: HandleDefaultMessage: return DefWindowProc(hwnd, Message, wParam, lParam); } return 0; }
/*! 縦書きスクリプトウインドウ作る @param[in] hInst インスタンスハンドル @param[in] hPrWnd メインのウインドウハンドル */ HWND VertScripterCreate( HINSTANCE hInst, HWND hPrWnd ) { LONG x, y; HWND hDktpWnd; UINT height; TCHAR atBuffer[MAX_STRING]; RECT rect, vwRect, dtRect; hDktpWnd = GetDesktopWindow( ); GetWindowRect( hDktpWnd, &dtRect ); GetWindowRect( hPrWnd, &rect ); x = dtRect.right - rect.right; if( VT_WIDTH > x ) { rect.right = dtRect.right - VT_WIDTH; } if( ghVertWnd ) { SetForegroundWindow( ghVertViewWnd ); SetWindowPos( ghVertWnd, HWND_TOP, rect.right, rect.top, 0, 0, SWP_NOSIZE ); SetForegroundWindow( ghVertWnd ); return ghVertWnd; } gbLeftGo = 0; gbSpTrans = 0; gbQuickClose = 1; // 初期状態で直ぐ閉じる // 本体ウインドウ ghVertWnd = CreateWindowEx( WS_EX_TOOLWINDOW | WS_EX_TOPMOST, VERTSCRIPT_CLASS, TEXT("縦書き"), WS_POPUP | WS_CAPTION | WS_SYSMENU, rect.right, rect.top, VT_WIDTH, VT_HEIGHT, NULL, NULL, hInst, NULL ); // ツールバー ghVertToolBar = CreateWindowEx( WS_EX_CLIENTEDGE, TOOLBARCLASSNAME, TEXT("verttoolbar"), WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | TBSTYLE_LIST | TBSTYLE_TOOLTIPS, 0, 0, 0, 0, ghVertWnd, (HMENU)IDTB_VLINE_TOOLBAR, hInst, NULL ); if( 0 == gdToolBarHei ) // 数値未取得なら { GetWindowRect( ghVertToolBar, &rect ); gdToolBarHei = rect.bottom - rect.top; } // 自動ツールチップスタイルを追加 SendMessage( ghVertToolBar, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_MIXEDBUTTONS ); SendMessage( ghVertToolBar, TB_SETIMAGELIST, 0, (LPARAM)ghVertImgLst ); SendMessage( ghVertToolBar, TB_SETBUTTONSIZE, 0, MAKELPARAM(16,16) ); SendMessage( ghVertToolBar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0 ); // ツールチップ文字列を設定・ボタンテキストがツールチップになる StringCchCopy( atBuffer, MAX_STRING, TEXT("文字列挿入") ); gstVttbInfo[0].iString = SendMessage( ghVertToolBar, TB_ADDSTRING, 0, (LPARAM)atBuffer ); StringCchCopy( atBuffer, MAX_STRING, TEXT("文字列更新") ); gstVttbInfo[2].iString = SendMessage( ghVertToolBar, TB_ADDSTRING, 0, (LPARAM)atBuffer ); StringCchCopy( atBuffer, MAX_STRING, TEXT("左から配置") ); gstVttbInfo[3].iString = SendMessage( ghVertToolBar, TB_ADDSTRING, 0, (LPARAM)atBuffer ); StringCchCopy( atBuffer, MAX_STRING, TEXT("空白を透過") ); gstVttbInfo[4].iString = SendMessage( ghVertToolBar, TB_ADDSTRING, 0, (LPARAM)atBuffer ); SendMessage( ghVertToolBar , TB_ADDBUTTONS, (WPARAM)TB_ITEMS, (LPARAM)&gstVttbInfo ); // ツールバーにボタンを挿入 SendMessage( ghVertToolBar , TB_AUTOSIZE, 0, 0 ); // ボタンのサイズに合わせてツールバーをリサイズ InvalidateRect( ghVertToolBar , NULL, TRUE ); // クライアント全体を再描画する命令 GetClientRect( ghVertWnd, &rect ); // 文字間STATIC CreateWindowEx( 0, WC_STATIC, TEXT("行間"), WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE | SS_RIGHT, 2, gdToolBarHei, 45, VT_PARAMHEI, ghVertWnd, (HMENU)IDS_VLINE_INTERVAL, hInst, NULL ); // 文字間EDIT gdVertInterval = 22; CreateWindowEx( 0, WC_EDIT, TEXT("22"), WS_CHILD | WS_VISIBLE | WS_BORDER | ES_READONLY, 49, gdToolBarHei, 50, VT_PARAMHEI, ghVertWnd, (HMENU)IDE_VLINE_INTERVAL, hInst, NULL ); // 文字間SPIN CreateWindowEx( 0, UPDOWN_CLASS, TEXT("intervalspin"), WS_CHILD | WS_VISIBLE | UDS_AUTOBUDDY, 99, gdToolBarHei, 10, VT_PARAMHEI, ghVertWnd, (HMENU)IDUD_VLINE_INTERVAL, hInst, NULL ); CreateWindowEx( 0, WC_BUTTON, TEXT("確定したら閉じる"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 120, gdToolBarHei, 180, VT_PARAMHEI, ghVertWnd, (HMENU)IDCB_VLINE_QUICKCLOSE, hInst, NULL ); CheckDlgButton( ghVertWnd, IDCB_VLINE_QUICKCLOSE, gbQuickClose ? BST_CHECKED : BST_UNCHECKED ); height = gdToolBarHei + VT_PARAMHEI; //文字列入力枠 ghTextWnd = CreateWindowEx( 0, WC_EDIT, TEXT(""), WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE, 0, height, rect.right, rect.bottom - height, ghVertWnd, (HMENU)IDE_VLINE_TEXT, hInst, NULL ); SetWindowFont( ghTextWnd, ghAaFont, TRUE ); // サブクラス gpfOrigVertEditProc = SubclassWindow( ghTextWnd, gpfVertEditProc ); ShowWindow( ghVertWnd, SW_SHOW ); UpdateWindow( ghVertWnd ); //表示・位置決め半透明フローティングウインドー ghVertViewWnd = CreateWindowEx( WS_EX_TOOLWINDOW | WS_EX_LAYERED, VERTVIEW_CLASS, TEXT("配置"), WS_POPUP | WS_THICKFRAME | WS_CAPTION | WS_VISIBLE, 0, 0, 160, 120, NULL, NULL, hInst, NULL); SetLayeredWindowAttributes( ghVertViewWnd, 0, gbAlpha, LWA_ALPHA ); // 透明度はレイヤボックスの設定を使う ZeroMemory( &gstFrmSz, sizeof(POINT) ); ClientToScreen( ghVertViewWnd, &gstFrmSz ); // ウインドウ位置を確定させる GetWindowRect( ghViewWnd, &vwRect ); // 編集窓 gstViewOrigin.x = vwRect.left; // ビューウインドウの位置記録 gstViewOrigin.y = vwRect.top; x = (vwRect.left + LINENUM_WID) - gstFrmSz.x; y = (vwRect.top + RULER_AREA) - gstFrmSz.y; TRACE( TEXT("VERT %d x %d"), x, y ); // この時点で0dot,0lineの位置にクライヤント左上がアッー! #ifdef _DEBUG SetWindowPos( ghVertViewWnd, HWND_TOP, x, y, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW ); #else SetWindowPos( ghVertViewWnd, HWND_TOPMOST, x, y, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW ); #endif gstOffset.x = x - vwRect.left; gstOffset.y = y - vwRect.top; return ghVertWnd; }
bool Ctrl::IsAlphaSupported() { return SetLayeredWindowAttributes(); }
// Modifie la transparence void SetTransparency( HWND hwnd, int value ) { #ifndef NO_TRANSPARENCY SetLayeredWindowAttributes( hwnd, 0, value, LWA_ALPHA ) ; #endif }
bool setTransparency(HWND hWnd, unsigned char alpha) { SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED); SetLayeredWindowAttributes(hWnd, 0, alpha, LWA_ALPHA); return true; }
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE ignoreMe0, LPSTR ignoreMe1, INT ignoreMe2) { LPCSTR szName = "Pez App"; WNDCLASSEXA wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(0), 0, 0, 0, 0, szName, 0 }; DWORD dwStyle = WS_SYSMENU | WS_VISIBLE | WS_POPUP; DWORD dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; RECT rect; int windowWidth, windowHeight, windowLeft, windowTop; HWND hWnd; PIXELFORMATDESCRIPTOR pfd; HDC hDC; HGLRC hRC; int pixelFormat; GLenum err; MSG msg = {0}; LARGE_INTEGER previousTime; LARGE_INTEGER freqTime; wc.hCursor = LoadCursor(0, IDC_ARROW); RegisterClassExA(&wc); SetRect(&rect, 0, 0, PEZ_VIEWPORT_WIDTH, PEZ_VIEWPORT_HEIGHT); AdjustWindowRectEx(&rect, dwStyle, FALSE, dwExStyle); windowWidth = rect.right - rect.left; windowHeight = rect.bottom - rect.top; windowLeft = GetSystemMetrics(SM_XVIRTUALSCREEN) + GetSystemMetrics(SM_CXSCREEN) / 2 - windowWidth / 2; windowTop = GetSystemMetrics(SM_CYSCREEN) / 2 - windowHeight / 2; hWnd = CreateWindowExA(0, szName, szName, dwStyle, windowLeft, windowTop, windowWidth, windowHeight, 0, 0, 0, 0); // Create the GL context. ZeroMemory(&pfd, sizeof(pfd)); pfd.nSize = sizeof(pfd); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 24; pfd.cDepthBits = 0; pfd.cStencilBits = 0; pfd.iLayerType = PFD_MAIN_PLANE; hDC = GetDC(hWnd); pixelFormat = ChoosePixelFormat(hDC, &pfd); SetPixelFormat(hDC, pixelFormat, &pfd); hRC = wglCreateContext(hDC); wglMakeCurrent(hDC, hRC); if (PEZ_ENABLE_MULTISAMPLING) { int pixelAttribs[] = { WGL_SAMPLES_ARB, 16, WGL_SAMPLE_BUFFERS_ARB, GL_TRUE, WGL_DRAW_TO_WINDOW_ARB, GL_TRUE, WGL_SUPPORT_OPENGL_ARB, GL_TRUE, WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB, WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB, WGL_RED_BITS_ARB, 8, WGL_GREEN_BITS_ARB, 8, WGL_BLUE_BITS_ARB, 8, WGL_ALPHA_BITS_ARB, 8, WGL_DEPTH_BITS_ARB, 24, WGL_STENCIL_BITS_ARB, 8, WGL_DOUBLE_BUFFER_ARB, GL_TRUE, 0 }; int* sampleCount = pixelAttribs + 1; int* useSampleBuffer = pixelAttribs + 3; int pixelFormat = -1; PROC proc = wglGetProcAddress("wglChoosePixelFormatARB"); unsigned int numFormats; PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC) proc; if (!wglChoosePixelFormatARB) { PezFatalError("Could not load function pointer for 'wglChoosePixelFormatARB'. Is your driver properly installed?"); } // Try fewer and fewer samples per pixel till we find one that is supported: while (pixelFormat <= 0 && *sampleCount >= 0) { wglChoosePixelFormatARB(hDC, pixelAttribs, 0, 1, &pixelFormat, &numFormats); (*sampleCount)--; if (*sampleCount <= 1) { *useSampleBuffer = GL_FALSE; } } // Win32 allows the pixel format to be set only once per app, so destroy and re-create the app: DestroyWindow(hWnd); hWnd = CreateWindowExA(0, szName, szName, dwStyle, windowLeft, windowTop, windowWidth, windowHeight, 0, 0, 0, 0); SetWindowPos(hWnd, HWND_TOP, windowLeft, windowTop, windowWidth, windowHeight, 0); hDC = GetDC(hWnd); SetPixelFormat(hDC, pixelFormat, &pfd); hRC = wglCreateContext(hDC); wglMakeCurrent(hDC, hRC); } #define PEZ_TRANSPARENT_WINDOW 0 // For transparency, this doesn't seem to work. I think I'd need to read back from an OpenGL FBO and blit it with GDI. if (PEZ_TRANSPARENT_WINDOW) { long flag = GetWindowLong(hWnd, GWL_EXSTYLE); int opacity = 128; flag |= WS_EX_LAYERED; SetWindowLong(hWnd, GWL_EXSTYLE, flag); SetLayeredWindowAttributes(hWnd, 0, opacity, LWA_ALPHA); } err = glewInit(); if (GLEW_OK != err) { PezFatalError("GLEW Error: %s\n", glewGetErrorString(err)); } PezDebugString("OpenGL Version: %s\n", glGetString(GL_VERSION)); if (!PEZ_VERTICAL_SYNC) { wglSwapIntervalEXT(0); } if (PEZ_FORWARD_COMPATIBLE_GL) { const int contextAttribs[] = { WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 2, WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB, 0 }; HGLRC newRC = wglCreateContextAttribsARB(hDC, 0, contextAttribs); wglMakeCurrent(0, 0); wglDeleteContext(hRC); hRC = newRC; wglMakeCurrent(hDC, hRC); } { const char* szWindowTitle = PezInitialize(PEZ_VIEWPORT_WIDTH, PEZ_VIEWPORT_HEIGHT); SetWindowTextA(hWnd, szWindowTitle); } QueryPerformanceFrequency(&freqTime); QueryPerformanceCounter(&previousTime); // ------------------- // Start the Game Loop // ------------------- while (msg.message != WM_QUIT) { if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { LARGE_INTEGER currentTime; __int64 elapsed; double deltaTime; QueryPerformanceCounter(¤tTime); elapsed = currentTime.QuadPart - previousTime.QuadPart; deltaTime = elapsed * 1000000.0 / freqTime.QuadPart; previousTime = currentTime; PezUpdate((unsigned int) deltaTime); PezRender(0); SwapBuffers(hDC); PezCheckCondition(glGetError() == GL_NO_ERROR, "OpenGL error.\n"); } } UnregisterClassA(szName, wc.hInstance); return 0; }
LRESULT CALLBACK WndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam) { HDC hDC, hGenDC; HBRUSH hBrush; BOOL bNeedsMovement; const long SROLLUP = 120; const long SROLLDOWN = 65416; COLORREF crRandom; switch(nMsg) { case WM_CTLCOLORSTATIC: hGenDC = (HDC) wParam; SetTextColor(hGenDC, RGB(0, 0xFF, 0xFF)); SetBkColor(hGenDC, crWndColor); hBrush = CreateSolidBrush(crWndColor); return (INT_PTR)hBrush; case WM_CLOSE: ReleaseDC(hLblHelp, hGenDC); DeleteObject(hBrush); KillTimer(hWnd, nIDTmr); DestroyWindow(hWnd); PostQuitMessage(0); return TRUE; case WM_SETCURSOR: if(wParam == (WPARAM)hLblHelp) SetCursor(LoadCursor(NULL, IDC_HAND)); else SetCursor(LoadCursor(NULL, IDC_ARROW)); return TRUE; case WM_COMMAND: { if((HWND)lParam == hLblHelp) DialogBox(NULL, MAKEINTRESOURCE(IDD_DLG), hWnd, DlgProc); return TRUE; } case WM_KEYDOWN: { bNeedsMovement = FALSE; if(wParam == VK_X && (GetKeyState(VK_CONTROL ) & 8000)) { ReleaseDC(hLblHelp, hGenDC); DeleteObject(hBrush); //KillTimer(hWnd, nIDTmr); DestroyWindow(hWnd); PostQuitMessage(0); return TRUE; } if(wParam == VK_UP && (GetKeyState(VK_CONTROL ) & 8000)) { POSY = POSY > -1 ? POSY - 1 : POSY; bNeedsMovement = TRUE; } if(wParam == VK_DOWN && (GetKeyState(VK_CONTROL ) & 8000)) { POSY = POSY < 1 ? POSY + 1 : POSY; bNeedsMovement = TRUE; } if(wParam == VK_LEFT && (GetKeyState(VK_CONTROL ) & 8000)) { POSX = POSX > -1 ? POSX - 1 : POSX; bNeedsMovement = TRUE; } if(wParam == VK_RIGHT && (GetKeyState(VK_CONTROL ) & 8000)) { POSX = POSX < 1 ? POSX + 1 : POSX; bNeedsMovement = TRUE; } if(GetKeyState(VK_LCONTROL ) & 8000 && (wParam > 48 && wParam < 58)) { crDigitColor = PRESETS[(long)wParam - 49]; crColonColor = PRESETS[(long)wParam - 49]; fnParseTime(hWnd); } if(GetKeyState(VK_RCONTROL ) & 8000 && (wParam > 48 && wParam < 58)) { crColonColor = PRESETS[(long)wParam - 49]; fnParseTime(hWnd); } if(GetKeyState(VK_LCONTROL ) & 8000 && wParam == VK_0) { crRandom = RGB(fnRandom(255), fnRandom(255), fnRandom(255)); crDigitColor = crRandom; crColonColor = crRandom; fnParseTime(hWnd); } if(GetKeyState(VK_RCONTROL ) & 8000 && wParam == VK_0) { crColonColor = RGB(fnRandom(255), fnRandom(255), fnRandom(255)); fnParseTime(hWnd); } if(GetKeyState(VK_CONTROL ) & 8000 && wParam == VK_H) { HELP = !HELP; if(HELP) ShowWindow(hLblHelp, SW_SHOWNORMAL); else ShowWindow(hLblHelp, SW_HIDE); } if(bNeedsMovement) fnMoveWnd(hWnd); return TRUE; } case WM_MOUSEWHEEL: { if((long)HIWORD(wParam) == SROLLUP && (GetKeyState(VK_CONTROL ) & 8000)) if(lOpacity < 255) { lOpacity += 5; SetLayeredWindowAttributes(hWnd, crWndColor, lOpacity, LWA_ALPHA); } if((long)HIWORD(wParam) == SROLLDOWN && (GetKeyState(VK_CONTROL ) & 8000)) if(lOpacity > 20) { lOpacity -= 5; SetLayeredWindowAttributes(hWnd, crWndColor, lOpacity, LWA_ALPHA); } return TRUE; } case WM_MBUTTONDOWN: { if(GetKeyState(VK_CONTROL ) & 8000) { lOpacity = 255; MASKED = !MASKED; if(MASKED) SetLayeredWindowAttributes(hWnd, crWndColor, lOpacity, LWA_COLORKEY); else SetLayeredWindowAttributes(hWnd, crWndColor, lOpacity, LWA_ALPHA); } return TRUE; } case WM_TIMER: { return TRUE; } } return DefWindowProc(hWnd, nMsg, wParam, lParam); }
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow) { STARTUPINFO si; PROCESS_INFORMATION pi; WCHAR combinedOptions[2048]; HWND hWnd; HDC hDC; HGLRC hRC; MSG msg; BOOL quit = FALSE; LPWSTR *szArgList; int argCount; LPWSTR pathToEmulator = NULL; LPWSTR pathToRom = NULL; LPWSTR cmdLineOptions = NULL; bool splitScreen = false; GLuint texID; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); szArgList = CommandLineToArgvW(GetCommandLine(), &argCount); for(int i = 0; i < argCount; i++) { LPWSTR s = szArgList[i]; if(wcsstr( s, TEXT("--emupath=")) > 0) { pathToEmulator = wcsstr( s, TEXT("="))+1; continue; } if(wcsstr( s, TEXT("--rompath=")) > 0) { pathToRom = wcsstr( s, TEXT("="))+1; continue; } if(wcsstr( s, TEXT("--options=")) > 0) { cmdLineOptions = wcsstr( s, TEXT("="))+1; continue; } } if(pathToEmulator == NULL) { exit(1); } wsprintf(combinedOptions, TEXT("\"%s\" \"%s\" %s"), pathToEmulator, pathToRom, cmdLineOptions); RegisterWindowClass(hInstance); hWnd = CreateWindowEx( WS_EX_TOPMOST|WS_EX_TOOLWINDOW , TEXT("GLSample"), TEXT("OpenGL Sample"), WS_POPUP|WS_VISIBLE|WS_SYSMENU, 0, 0, 512, 512, NULL, NULL, hInstance, NULL ); SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED | WS_EX_TRANSPARENT); // enable OpenGL for the window EnableOpenGL( hWnd, &hDC, &hRC ); SetLayeredWindowAttributes(hWnd, 0,255, LWA_ALPHA); // init openGL glEnable(GL_TEXTURE_2D); glDisable(GL_DEPTH_TEST| GL_LIGHTING | GL_CULL_FACE); glGenTextures(1, &texID); if(!CreateProcess(NULL, combinedOptions, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { DWORD error = GetLastError(); exit(error); } while(EnumWindows(EnumWindowsProc, pi.dwThreadId)) Sleep(100); // program main loop while ( !quit ) { if(GetAsyncKeyState( VK_ESCAPE) < 0) { SendMessage(clientHwnd, WM_CLOSE, 0,0); break; } // check the child process DWORD exCode; if(!GetExitCodeProcess(pi.hProcess, &exCode) || exCode != STILL_ACTIVE) { break; } // check for messages if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) { // handle or dispatch messages if ( msg.message == WM_QUIT ) { quit = TRUE; } else { TranslateMessage( &msg ); DispatchMessage( &msg ); } } else { Draw(clientHwnd, texID); SwapBuffers( hDC ); UpdateGLWindow(hWnd); } } // shutdown OpenGL DisableOpenGL( hWnd, hDC, hRC ); // destroy the window explicitly DestroyWindow( hWnd ); return msg.wParam; }
INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd) { WNDCLASSEX cx; HWND hWnd = NULL; cx.cbClsExtra = NULL; cx.cbSize = sizeof(WNDCLASSEX); cx.cbWndExtra = NULL; cx.hbrBackground = (HBRUSH)0; cx.hCursor = LoadCursor(NULL, IDC_ARROW); cx.hIcon = LoadIcon(NULL, IDI_APPLICATION); cx.hIconSm = LoadIcon(NULL, IDI_APPLICATION); cx.hInstance = hInstance; cx.lpfnWndProc = WndProc; cx.lpszClassName = L"Cross"; cx.lpszMenuName = NULL; cx.style = CS_HREDRAW | CS_VREDRAW; if (!RegisterClassEx(&cx)) MessageBox(NULL, L"Couldn't register class", NULL, NULL), exit(0); hWnd = CreateWindowEx(WS_EX_TOPMOST | WS_EX_LAYERED | WS_EX_TOOLWINDOW, L"Cross", L"Cross", WS_POPUP, 0, 0, screenX, screenY, NULL, NULL, hInstance, NULL); SetLayeredWindowAttributes(hWnd, RGB(0, 0, 0), 255, ULW_COLORKEY | LWA_ALPHA); ShowWindow(hWnd, nShowCmd); if (!rMGR.Initilize(hWnd, screenX, screenY)) MessageBox(NULL, L"Couldn't initialize device", NULL, NULL), exit(0); if (!d3.Initilize(&rMGR)) MessageBox(NULL, L"Couldn't initialize D3Menu", NULL, NULL), exit(0); d3.createMenu( "menu1", D3DCOLOR_ARGB(255,152,222,42) ); PMENUENTRY entry = d3.createMenu( "menu2", D3DCOLOR_ARGB(255,152,222,42) ); INT v1 = 10; FLOAT v2 = 20; string v3 = "oh hai johnny!"; d3.createItem( "item1", &v1, D3DCOLOR_ARGB(255,242,37,5), 10, VAR_TYPE::T_INT, nullptr, nullptr, false ); d3.createItem( "item2", &v2, D3DCOLOR_ARGB(255,242,37,5), (SIZE_T)1.5, VAR_TYPE::T_FLOAT, nullptr, nullptr, false ); d3.createItem( "item3", &v3, D3DCOLOR_ARGB(255,242,37,5), 10, VAR_TYPE::T_STRING, nullptr, nullptr, false ); d3.createItem( entry,"item_menu1", &v3, D3DCOLOR_ARGB(255,152,222,42), 10, VAR_TYPE::T_STRING, nullptr, nullptr, false ); d3.createItem( entry,"item_menu2", &v3, D3DCOLOR_ARGB(255,152,222,42), 10, VAR_TYPE::T_STRING, nullptr, nullptr, false ); d3.createItem( entry,"item_menu3", &v3, D3DCOLOR_ARGB(255,152,222,42), 10, VAR_TYPE::T_STRING, nullptr, nullptr, false ); d3.createToggle( "Toggle1", &isRunning, D3DCOLOR_ARGB(255,0,153,204), nullptr, false ); MSG msg; while (isRunning) { d3.handleInput(); renderOverlay(); while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } } rMGR.~rManager(); return msg.wParam; }
LRESULT CALLBACK thread_proc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; RECT rc = {0}; UINT notify_duration = 0; HFONT hOldFont = NULL; switch (message) { case WM_LIBNOTIFYSHOW: if(notification_data) { /* deduce the allowed text width from the max width; see geometry for rationale */ rc.right = notification_window_width_max - (icon_size + (icon_padding * 3)); hdc = GetDC(hWnd); if(hdc) { HFONT hOldFont = NULL; HRGN hRgn = NULL; hOldFont = (HFONT) SelectObject(hdc, font_body); if(hOldFont) { DrawText(hdc, notification_data->body, -1, &rc, DT_CALCRECT | DT_WORDBREAK | DT_EDITCONTROL | DT_NOCLIP | DT_NOPREFIX | DT_EXTERNALLEADING); SelectObject(hdc, hOldFont); } ReleaseDC(hWnd, hdc); if(!hOldFont) return 0; /* exit if font selection failed */ /* calculate the actual bounding rectangle from the DrawText output */ notification_window_height = summary_body_divider + rc.bottom + (icon_padding * 3); notification_window_width = rc.right + icon_size + (icon_padding * 3); /* word count * milliseconds per word */ notify_duration = word_count(notification_data->body) * milliseconds_per_word; /* in case the calculation renders too low a value, replace it with a de facto minimum */ notify_duration = MAX(notify_duration, min_notification_timeout); /* get the screen area uncluttered by the taskbar */ if(SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, 0)) { LONG window_x = 0, window_y = 0; /* system tray @ right bottom */ if((rc.bottom != GetSystemMetrics(SM_CYSCREEN)) || (rc.right != GetSystemMetrics(SM_CXSCREEN))) { window_x = rc.right - (GetSystemMetrics(SM_CXSCREEN) / window_offset_factor) - notification_window_width; window_y = rc.bottom - (GetSystemMetrics(SM_CYSCREEN) / window_offset_factor) - notification_window_height; } else if(rc.left != 0) /* left bottom */ { window_x = rc.left + (GetSystemMetrics(SM_CXSCREEN) / window_offset_factor); window_y = rc.bottom - (GetSystemMetrics(SM_CYSCREEN) / window_offset_factor) - notification_window_height; } else /* right top */ { window_x = rc.right - (GetSystemMetrics(SM_CXSCREEN) / window_offset_factor) - notification_window_width; window_y = rc.top + (GetSystemMetrics(SM_CYSCREEN) / window_offset_factor); } /* resize and reposition the window */ MoveWindow(hWnd, window_x, window_y, notification_window_width, notification_window_height, TRUE); /* set the new positions to be used by the mouse over hook */ notification_window_rect.left = window_x; notification_window_rect.top = window_y; notification_window_rect.right = window_x + notification_window_width; notification_window_rect.bottom = window_y + notification_window_height; /* make it as a rounded rect. */ hRgn = CreateRoundRectRgn(0, 0, notification_window_width, notification_window_height, rounded_rect_edge, rounded_rect_edge); SetWindowRgn(notification_window, hRgn, TRUE); /* since bRedraw is set to TRUE in SetWindowRgn invalidation isn't required */ /*InvalidateRect(hWnd, NULL, TRUE);*/ /* show the window and set the timers for animation and overall visibility */ ShowWindow(hWnd, SW_SHOWNOACTIVATE); SetTimer(notification_window, TIMER_ANIMATION, fade_duration, NULL); SetTimer(notification_window, TIMER_NOTIFICATION, notify_duration, NULL); } } } break; case WM_LIBNOTIFYCLOSE: /* clean up and reset flags */ { if(hook_mouse_over) { UnhookWindowsHookEx(hook_mouse_over); hook_mouse_over = NULL; } KillTimer(hWnd, TIMER_ANIMATION); KillTimer(hWnd, TIMER_NOTIFICATION); is_fading_out = FALSE; ShowWindow(hWnd, SW_HIDE); } break; case WM_PAINT: if(notification_data && notification_data->summary && notification_data->body && notification_data->icon) { hdc = BeginPaint(hWnd, &ps); SetTextColor(hdc, RGB(255, 255, 255)); SetBkMode(hdc, TRANSPARENT); hOldFont = (HFONT) SelectObject(hdc, font_summary); if(hOldFont) { /* set the padding as left offset and center the icon horizontally */ DrawIcon(hdc, icon_padding, (notification_window_height / 2) - (icon_size / 2), notification_data->icon); /* calculate and DrawText for both summary and body based on the geometry given above */ rc.left = icon_size + (icon_padding * 2); rc.right = notification_window_width - icon_padding; rc.top = icon_padding; rc.bottom = summary_body_divider + (icon_padding * 2); DrawText(hdc, notification_data->summary, -1, &rc, DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS | DT_NOPREFIX); if(SelectObject(hdc, font_body)) { rc.top = rc.bottom; rc.bottom = notification_window_height - icon_padding; DrawText(hdc, notification_data->body, -1, &rc, DT_WORDBREAK | DT_EDITCONTROL | DT_NOCLIP | DT_NOPREFIX | DT_EXTERNALLEADING); } SelectObject(hdc, hOldFont); } EndPaint(hWnd, &ps); } break; case WM_DESTROY: PostQuitMessage(0); break; case WM_TIMER: if(IsWindowVisible(hWnd)) { if(wParam == TIMER_ANIMATION) /* notification animation timer */ { if(is_fading_out) { if(notification_window_alpha > 5) { notification_window_alpha -= 25; SetLayeredWindowAttributes(notification_window, 0, notification_window_alpha, LWA_ALPHA); } else { /* once fully faded out, self destroy and reset the flags */ KillTimer(hWnd, TIMER_ANIMATION); is_fading_out = FALSE; notification_window_alpha = 0; PostMessage(hWnd, WM_LIBNOTIFYCLOSE, 0, 0); } } else { if(notification_window_alpha < 250) { notification_window_alpha += 25; SetLayeredWindowAttributes(notification_window, 0, notification_window_alpha, LWA_ALPHA); } else { /* self destory as alpha reaches the maximum */ KillTimer(hWnd, TIMER_ANIMATION); notification_window_alpha = 255; /* set the mouse over hook once the window is fully visible */ hook_mouse_over = SetWindowsHookEx(WH_MOUSE_LL, mouse_over_hook_proc, (HINSTANCE) GetModuleHandle(NULL), 0); } } } else /* notification duration timer */ { /* self destruct once timed out */ KillTimer(hWnd, TIMER_NOTIFICATION); /* kill the hook set by animation timer */ if(hook_mouse_over) { UnhookWindowsHookEx(hook_mouse_over); hook_mouse_over = NULL; } /* start fading out sequence */ is_fading_out = TRUE; SetTimer(hWnd, 1, fade_duration, NULL); } } break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
void TfrmMain::wmTimer(WPARAM wParam, LPARAM lParam) { if (wParam == ID_bvlTarget) { // Timer for Target selector static int primarymouse; if(!m_hTargetHighlighter) { primarymouse=GetSystemMetrics(SM_SWAPBUTTON)?VK_RBUTTON:VK_LBUTTON; m_hTargetHighlighter=CreateWindowEx(WS_EX_LAYERED|WS_EX_TRANSPARENT|WS_EX_TOOLWINDOW,(LPTSTR)g_clsTargetHighlighter,NULL,WS_POPUP,0,0,0,0,NULL,NULL,hInst,NULL); if(!m_hTargetHighlighter) return; SetLayeredWindowAttributes(m_hTargetHighlighter,0,123,LWA_ALPHA); SetSystemCursor(CopyCursor(IcoLib_GetIcon(ICO_PLUG_SSTARGET)),OCR_NORMAL); Hide(); } if(!(GetAsyncKeyState(primarymouse)&0x8000)) { KillTimer(m_hWnd,ID_bvlTarget); SystemParametersInfo(SPI_SETCURSORS,0,NULL,0); DestroyWindow(m_hTargetHighlighter),m_hTargetHighlighter=NULL; SetTargetWindow(m_hTargetWindow); Show(); return; } POINT point; GetCursorPos(&point); m_hTargetWindow=WindowFromPoint(point); if(!((GetAsyncKeyState(VK_SHIFT)|GetAsyncKeyState(VK_MENU))&0x8000)) for(HWND hTMP; (hTMP=GetParent(m_hTargetWindow)); m_hTargetWindow=hTMP); if(m_hTargetWindow!=m_hLastWin) { m_hLastWin=m_hTargetWindow; RECT rect; GetWindowRect(m_hLastWin,&rect); int width=rect.right-rect.left; int height=rect.bottom-rect.top; if(g_iTargetBorder) { SetWindowPos(m_hTargetHighlighter,NULL,0,0,0,0,SWP_HIDEWINDOW|SWP_NOMOVE|SWP_NOSIZE); if(width>g_iTargetBorder*2 && height>g_iTargetBorder*2) { HRGN hRegnNew=CreateRectRgn(0,0,width,height); HRGN hRgnHole=CreateRectRgn(g_iTargetBorder,g_iTargetBorder,width-g_iTargetBorder,height-g_iTargetBorder); CombineRgn(hRegnNew,hRegnNew,hRgnHole,RGN_XOR); DeleteObject(hRgnHole); SetWindowRgn(m_hTargetHighlighter,hRegnNew,FALSE);//cleans up hRegnNew } else SetWindowRgn(m_hTargetHighlighter,NULL,FALSE); } SetWindowPos(m_hTargetHighlighter,HWND_TOPMOST,rect.left,rect.top,width,height,SWP_SHOWWINDOW|SWP_NOACTIVATE); } return; } if (wParam == ID_chkTimed) { // Timer for Screenshot #ifdef _DEBUG OutputDebugStringA("SS Bitmap Timer Start\r\n" ); #endif if(!m_bCapture) { //only start once if (m_Screenshot) { FIP->FI_Unload(m_Screenshot); m_Screenshot = NULL; } m_bCapture = true; switch (m_opt_tabCapture) { case 0: m_Screenshot = CaptureWindow(m_hTargetWindow, m_opt_chkClientArea); break; case 1: m_Screenshot = CaptureMonitor((m_opt_cboxDesktop > 0) ? m_Monitors[m_opt_cboxDesktop-1].szDevice : NULL); break; default: KillTimer(m_hWnd,ID_chkTimed); m_bCapture = false; #ifdef _DEBUG OutputDebugStringA("SS Bitmap Timer Stop (no tabCapture)\r\n" ); #endif return; } if (!m_Screenshot) m_bCapture = false; } if (m_Screenshot) { KillTimer(m_hWnd,ID_chkTimed); m_bCapture = false; #ifdef _DEBUG OutputDebugStringA("SS Bitmap Timer Stop (CaptureDone)\r\n" ); #endif SendMessage(m_hWnd,UM_EVENT, 0, (LPARAM)EVT_CaptureDone); } } }