void API::onInit() { HMODULE hUserDll = 0; pfnSetLayout = (DWORD ( WINAPI *)(HDC, DWORD))GetProcAddress( GetModuleHandleA( "GDI32.DLL" ), "SetLayout" ); hUserDll = GetModuleHandleA("user32.dll"); if (hUserDll) { pfnMonitorFromPoint = ( pfnMonitorFromPoint_t )GetProcAddress(hUserDll, "MonitorFromPoint"); pfnMonitorFromWindow = ( pfnMonitorFromWindow_t )GetProcAddress(hUserDll, "MonitorFromWindow"); pfnGetMonitorInfo = ( pfnGetMonitorInfo_t )GetProcAddress(hUserDll, "GetMonitorInfoA"); pfnSetLayeredWindowAttributes = ( pfnSetLayeredWindowAttributes_t )GetProcAddress(hUserDll, "SetLayeredWindowAttributes"); pfnUpdateLayeredWindow = ( pfnUpdateLayeredWindow_t )GetProcAddress(hUserDll, "UpdateLayeredWindow"); pfnTrackMouseEvent = ( pfnTrackMouseEvent_t )GetProcAddress(hUserDll, "TrackMouseEvent"); } pfnAlphaBlend = (pfnAlphaBlend_t) GetProcAddress(GetModuleHandleA("gdi32"), "GdiAlphaBlend"); pfnGradientFill = (PGF) GetProcAddress(GetModuleHandleA("gdi32"), "GdiGradientFill"); if (0 == pfnAlphaBlend) { HMODULE hMsImgDll = LoadLibraryA("msimg32.dll"); pfnAlphaBlend = (pfnAlphaBlend_t)GetProcAddress(hMsImgDll, "AlphaBlend"); pfnGradientFill = (PGF) GetProcAddress(hMsImgDll, "GradientFill"); } sysConfig.isVistaPlus = (IsWinVerVistaPlus() ? true : false); sysConfig.isSevenPlus = (IsWinVer7Plus() ? true : false); sysConfig.isXPPlus = (IsWinVerXPPlus() ? true : false); sysConfig.isWin2KPlus = (IsWinVer2000Plus() ? true : false); if(sysConfig.isXPPlus) { if ((hUxTheme = Utils::loadSystemLibrary(_T("\\uxtheme.dll")), true) != 0) { pfnIsThemeActive = (pfnIsThemeActive_t)GetProcAddress(hUxTheme, "IsThemeActive"); pfnOpenThemeData = (pfnOpenThemeData_t)GetProcAddress(hUxTheme, "OpenThemeData"); pfnDrawThemeBackground = (pfnDrawThemeBackground_t)GetProcAddress(hUxTheme, "DrawThemeBackground"); pfnCloseThemeData = (pfnCloseThemeData_t)GetProcAddress(hUxTheme, "CloseThemeData"); pfnDrawThemeText = (pfnDrawThemeText_t)GetProcAddress(hUxTheme, "DrawThemeText"); pfnIsThemeBackgroundPartiallyTransparent = (pfnIsThemeBackgroundPartiallyTransparent_t)GetProcAddress(hUxTheme, "IsThemeBackgroundPartiallyTransparent"); pfnDrawThemeParentBackground = (pfnDrawThemeParentBackground_t)GetProcAddress(hUxTheme, "DrawThemeParentBackground"); pfnGetThemeBackgroundContentRect = (pfnGetThemeBackgroundContentRect_t)GetProcAddress(hUxTheme, "GetThemeBackgroundContentRect"); pfnEnableThemeDialogTexture = (pfnEnableThemeDialogTexture_t)GetProcAddress(hUxTheme, "EnableThemeDialogTexture"); if (pfnIsThemeActive != 0 && pfnOpenThemeData != 0 && pfnDrawThemeBackground != 0 && pfnCloseThemeData != 0 && pfnDrawThemeText != 0 && pfnIsThemeBackgroundPartiallyTransparent != 0 && pfnDrawThemeParentBackground != 0 && pfnGetThemeBackgroundContentRect != 0) { sysConfig.uxThemeValid = true; } } } if(sysConfig.isVistaPlus) { if ((hDwm = Utils::loadSystemLibrary(_T("\\dwmapi.dll")), true) != 0) { pfnDwmIsCompositionEnabled = (pfnDwmIsCompositionEnabled_t)GetProcAddress(hDwm, "DwmIsCompositionEnabled"); pfnDwmExtendFrameIntoClientArea = (pfnDwmExtendFrameIntoClientArea_t)GetProcAddress(hDwm,"DwmExtendFrameIntoClientArea"); } } updateState(); }
int InitHyperlink(void) { WNDCLASS wcl; wcl.lpfnWndProc=HyperlinkWndProc; wcl.cbClsExtra=0; wcl.cbWndExtra=sizeof(struct HyperlinkWndData*); wcl.hInstance=hMirandaInst; if(IsWinVer2000Plus()) wcl.hCursor=NULL; else wcl.hCursor=LoadCursor(wcl.hInstance,MAKEINTRESOURCE(IDC_HYPERLINKHAND)); wcl.lpszClassName=WNDCLASS_HYPERLINK; wcl.hbrBackground=NULL; wcl.hIcon=NULL; wcl.lpszMenuName=NULL; wcl.style=CS_HREDRAW|CS_VREDRAW|CS_GLOBALCLASS|CS_PARENTDC; RegisterClass(&wcl); /* automatically unregistered on exit */ return 0; }
static INT_PTR CALLBACK DlgProcCluiOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); CheckDlgButton(hwndDlg, IDC_BRINGTOFRONT, DBGetContactSettingByte(NULL, "CList", "BringToFront", SETTING_BRINGTOFRONT_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_ONTOP, DBGetContactSettingByte(NULL, "CList", "OnTop", SETTING_ONTOP_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_TOOLWND, DBGetContactSettingByte(NULL, "CList", "ToolWindow", SETTING_TOOLWINDOW_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_MIN2TRAY, DBGetContactSettingByte(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, DBGetContactSettingByte(NULL, "CLUI", "ShowCaption", SETTING_SHOWCAPTION_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_SHOWMAINMENU, DBGetContactSettingByte(NULL, "CLUI", "ShowMainMenu", SETTING_SHOWMAINMENU_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CLIENTDRAG, DBGetContactSettingByte(NULL, "CLUI", "ClientAreaDrag", SETTING_CLIENTDRAG_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); if (!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, DBGetContactSettingByte(NULL, "CLUI", "FadeInOut", 0) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_AUTOSIZE, DBGetContactSettingByte(NULL, "CLUI", "AutoSize", 0) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_DROPSHADOW, DBGetContactSettingByte(NULL, "CList", "WindowShadow", 0) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_ONDESKTOP, DBGetContactSettingByte(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, DBGetContactSettingByte(NULL, "CLUI", "MaxSizeHeight", 75)); CheckDlgButton(hwndDlg, IDC_AUTOSIZEUPWARD, DBGetContactSettingByte(NULL, "CLUI", "AutoSizeUpward", 0) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_AUTOHIDE, DBGetContactSettingByte(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(DBGetContactSettingWord(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 (!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 ( !DBGetContactSettingTString(NULL, "CList", "TitleText", &dbv)) { SetDlgItemText(hwndDlg, IDC_TITLETEXT, dbv.ptszVal); DBFreeVariant( &dbv ); } else SetDlgItemTextA(hwndDlg, IDC_TITLETEXT, MIRANDANAME); } if (!IsWinVer2000Plus()) { EnableWindow(GetDlgItem(hwndDlg, IDC_FADEINOUT), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_TRANSPARENT), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_DROPSHADOW), FALSE); } else CheckDlgButton(hwndDlg, IDC_TRANSPARENT, DBGetContactSettingByte(NULL, "CList", "Transparent", SETTING_TRANSPARENT_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); if (!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, DBGetContactSettingByte(NULL, "CList", "Alpha", SETTING_ALPHA_DEFAULT)); SendDlgItemMessage(hwndDlg, IDC_TRANSINACTIVE, TBM_SETPOS, TRUE, DBGetContactSettingByte(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), !IsDlgButtonChecked(hwndDlg, IDC_TOOLWND)); } else if (LOWORD(wParam) == IDC_SHOWCAPTION) { EnableWindow(GetDlgItem(hwndDlg, IDC_TOOLWND), IsDlgButtonChecked(hwndDlg, IDC_SHOWCAPTION)); EnableWindow(GetDlgItem(hwndDlg, IDC_MIN2TRAY), !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]; 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); break; case WM_NOTIFY: if (((LPNMHDR) lParam)->code == PSN_APPLY) { DBWriteContactSettingByte(NULL, "CList", "OnTop", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_ONTOP)); DBWriteContactSettingByte(NULL, "CList", "ToolWindow", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_TOOLWND)); DBWriteContactSettingByte(NULL, "CList", "BringToFront", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_BRINGTOFRONT)); DBWriteContactSettingByte(NULL, "CLUI", "FadeInOut", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_FADEINOUT)); DBWriteContactSettingByte(NULL, "CLUI", "AutoSize", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZE)); DBWriteContactSettingByte(NULL, "CLUI", "MaxSizeHeight", (BYTE) GetDlgItemInt(hwndDlg, IDC_MAXSIZEHEIGHT, NULL, FALSE)); DBWriteContactSettingByte(NULL, "CLUI", "AutoSizeUpward", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_AUTOSIZEUPWARD)); DBWriteContactSettingByte(NULL, "CList", "AutoHide", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_AUTOHIDE)); DBWriteContactSettingWord(NULL, "CList", "HideTime", (WORD) SendDlgItemMessage(hwndDlg, IDC_HIDETIMESPIN, UDM_GETPOS, 0, 0)); DBWriteContactSettingByte(NULL, "CList", "Transparent", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)); DBWriteContactSettingByte(NULL, "CList", "Alpha", (BYTE) SendDlgItemMessage(hwndDlg, IDC_TRANSACTIVE, TBM_GETPOS, 0, 0)); DBWriteContactSettingByte(NULL, "CList", "AutoAlpha", (BYTE) SendDlgItemMessage(hwndDlg, IDC_TRANSINACTIVE, TBM_GETPOS, 0, 0)); DBWriteContactSettingByte(NULL, "CList", "WindowShadow", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_DROPSHADOW)); DBWriteContactSettingByte(NULL, "CList", "OnDesktop", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_ONDESKTOP)); DBWriteContactSettingByte(NULL, "CLUI", "ShowCaption", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_SHOWCAPTION)); DBWriteContactSettingByte(NULL, "CLUI", "ShowMainMenu", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_SHOWMAINMENU)); DBWriteContactSettingByte(NULL, "CLUI", "ClientAreaDrag", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_CLIENTDRAG)); DBWriteContactSettingByte(NULL, "CList", "Min2Tray", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_MIN2TRAY)); { TCHAR title[256]; GetDlgItemText(hwndDlg, IDC_TITLETEXT, title, SIZEOF(title)); DBWriteContactSettingTString(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); SetWindowLong(pcli->hwndContactList, GWL_EXSTYLE, GetWindowLong(pcli->hwndContactList, GWL_EXSTYLE) | WS_EX_TOOLWINDOW | WS_EX_WINDOWEDGE); SetWindowPlacement(pcli->hwndContactList, &p); } else SetWindowLong(pcli->hwndContactList, GWL_EXSTYLE, GetWindowLong(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)) SetWindowLong(pcli->hwndContactList, GWL_STYLE, GetWindowLong(pcli->hwndContactList, GWL_STYLE) | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX); else SetWindowLong(pcli->hwndContactList, GWL_STYLE, GetWindowLong(pcli->hwndContactList, GWL_STYLE) & ~(WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX)); if (!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) && !IsDlgButtonChecked(hwndDlg, IDC_TOOLWND)) ShowWindow(pcli->hwndContactList, IsDlgButtonChecked(hwndDlg, IDC_MIN2TRAY) ? SW_HIDE : SW_SHOW); if (IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENT)) { SetWindowLong(pcli->hwndContactList, GWL_EXSTYLE, GetWindowLong(pcli->hwndContactList, GWL_EXSTYLE) | WS_EX_LAYERED); if (MySetLayeredWindowAttributes) MySetLayeredWindowAttributes(pcli->hwndContactList, RGB(0, 0, 0), (BYTE) DBGetContactSettingByte(NULL, "CList", "AutoAlpha", SETTING_AUTOALPHA_DEFAULT), LWA_ALPHA); } else SetWindowLong(pcli->hwndContactList, GWL_EXSTYLE, GetWindowLong(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; }
INT_PTR CALLBACK ContactDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_INITDIALOG: SetWindowLongPtr(hwndDlg,GWLP_USERDATA,(LONG_PTR)lParam); if(hEmailFont) DeleteObject(hEmailFont); { LOGFONT lf; hEmailFont=(HFONT)SendDlgItemMessage(hwndDlg,IDC_EMAILS,WM_GETFONT,0,0); GetObject(hEmailFont,sizeof(lf),&lf); lf.lfUnderline=1; hEmailFont=CreateFontIndirect(&lf); } if(hHandCursor==NULL) { if(IsWinVer2000Plus()) hHandCursor=LoadCursor(NULL,IDC_HAND); else hHandCursor=LoadCursor(hMirandaInst,MAKEINTRESOURCE(IDC_HYPERLINKHAND)); } TranslateDialogDefault(hwndDlg); { LVCOLUMN lvc; RECT rc; GetClientRect(GetDlgItem(hwndDlg,IDC_EMAILS),&rc); rc.right-=GetSystemMetrics(SM_CXVSCROLL); lvc.mask=LVCF_WIDTH; ListView_SetExtendedListViewStyleEx(GetDlgItem(hwndDlg,IDC_EMAILS), LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP, LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP); ListView_SetExtendedListViewStyleEx(GetDlgItem(hwndDlg,IDC_PHONES), LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP, LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP); lvc.cx=rc.right/4; ListView_InsertColumn(GetDlgItem(hwndDlg,IDC_EMAILS),0,&lvc); ListView_InsertColumn(GetDlgItem(hwndDlg,IDC_PHONES),0,&lvc); lvc.cx=rc.right-rc.right/4-40; ListView_InsertColumn(GetDlgItem(hwndDlg,IDC_EMAILS),1,&lvc); lvc.cx=rc.right-rc.right/4-90; ListView_InsertColumn(GetDlgItem(hwndDlg,IDC_PHONES),1,&lvc); lvc.cx=50; ListView_InsertColumn(GetDlgItem(hwndDlg,IDC_PHONES),2,&lvc); lvc.cx=20; ListView_InsertColumn(GetDlgItem(hwndDlg,IDC_EMAILS),2,&lvc); ListView_InsertColumn(GetDlgItem(hwndDlg,IDC_EMAILS),3,&lvc); ListView_InsertColumn(GetDlgItem(hwndDlg,IDC_PHONES),3,&lvc); ListView_InsertColumn(GetDlgItem(hwndDlg,IDC_PHONES),4,&lvc); } break; case M_REMAKELISTS: { char *szProto; LVITEM lvi; int i; char idstr[33]; TCHAR idstr2[33]; DBVARIANT dbv; HANDLE hContact=(HANDLE)GetWindowLongPtr(hwndDlg,GWLP_USERDATA); if (hContact != NULL) { szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0); if (szProto==NULL) break; //e-mails ListView_DeleteAllItems(GetDlgItem(hwndDlg,IDC_EMAILS)); lvi.mask=LVIF_TEXT|LVIF_PARAM; lvi.lParam=(LPARAM)(-1); lvi.iSubItem=0; lvi.iItem=0; for(i=-1;;i++) { if(i==-1) { if(DBGetContactSettingTString(hContact,szProto,"e-mail",&dbv)) continue; lvi.pszText=TranslateT("Primary"); } else { mir_snprintf(idstr, SIZEOF(idstr), "e-mail%d", i ); if(DBGetContactSettingTString(hContact,szProto,idstr,&dbv)) break; lvi.pszText=idstr2; mir_sntprintf(idstr2, SIZEOF(idstr2), _T("%d"),i+2); } ListView_InsertItem(GetDlgItem(hwndDlg,IDC_EMAILS),&lvi); ListView_SetItemText(GetDlgItem(hwndDlg,IDC_EMAILS),lvi.iItem,1,dbv.ptszVal); DBFreeVariant(&dbv); lvi.iItem++; } lvi.iSubItem=0; for(i=0;;i++) { lvi.lParam=i; mir_snprintf(idstr, SIZEOF(idstr), "Mye-mail%d",i); if(DBGetContactSettingTString(hContact,"UserInfo",idstr,&dbv)) break; lvi.pszText=idstr2; mir_sntprintf(idstr2, SIZEOF(idstr2), TranslateT("Custom %d"),i+1); ListView_InsertItem(GetDlgItem(hwndDlg,IDC_EMAILS),&lvi); ListView_SetItemText(GetDlgItem(hwndDlg,IDC_EMAILS),lvi.iItem,1,dbv.ptszVal); DBFreeVariant(&dbv); lvi.iItem++; } lvi.mask=LVIF_PARAM; lvi.lParam=(LPARAM)(-2); ListView_InsertItem(GetDlgItem(hwndDlg,IDC_EMAILS),&lvi); //phones ListView_DeleteAllItems(GetDlgItem(hwndDlg,IDC_PHONES)); lvi.mask=LVIF_TEXT|LVIF_PARAM; lvi.lParam=(LPARAM)(-1); lvi.iSubItem=0; lvi.iItem=0; if(!DBGetContactSettingTString(hContact,szProto,"Phone",&dbv)) { lvi.pszText=TranslateT("Primary"); ListView_InsertItem(GetDlgItem(hwndDlg,IDC_PHONES),&lvi); ListView_SetItemText(GetDlgItem(hwndDlg,IDC_PHONES),lvi.iItem,1,dbv.ptszVal); DBFreeVariant(&dbv); lvi.iItem++; } if(!DBGetContactSettingTString(hContact,szProto,"Fax",&dbv)) { lvi.pszText=TranslateT("Fax"); ListView_InsertItem(GetDlgItem(hwndDlg,IDC_PHONES),&lvi); ListView_SetItemText(GetDlgItem(hwndDlg,IDC_PHONES),lvi.iItem,1,dbv.ptszVal); DBFreeVariant(&dbv); lvi.iItem++; } if(!DBGetContactSettingTString(hContact,szProto,"Cellular",&dbv)) { lvi.pszText=TranslateT("Mobile"); ListView_InsertItem(GetDlgItem(hwndDlg,IDC_PHONES),&lvi); if(lstrlenA(dbv.pszVal)>4 && !lstrcmpA(dbv.pszVal+lstrlenA(dbv.pszVal)-4," SMS")) { ListView_SetItemText(GetDlgItem(hwndDlg,IDC_PHONES),lvi.iItem,2,_T("y")); dbv.ptszVal[lstrlen(dbv.ptszVal)-4]='\0'; } ListView_SetItemText(GetDlgItem(hwndDlg,IDC_PHONES),lvi.iItem,1,dbv.ptszVal); DBFreeVariant(&dbv); lvi.iItem++; } if(!DBGetContactSettingTString(hContact,szProto,"CompanyPhone",&dbv)) { lvi.pszText=TranslateT("Work Phone"); ListView_InsertItem(GetDlgItem(hwndDlg,IDC_PHONES),&lvi); ListView_SetItemText(GetDlgItem(hwndDlg,IDC_PHONES),lvi.iItem,1,dbv.ptszVal); DBFreeVariant(&dbv); lvi.iItem++; } if(!DBGetContactSettingTString(hContact,szProto,"CompanyFax",&dbv)) { lvi.pszText=TranslateT("Work Fax"); ListView_InsertItem(GetDlgItem(hwndDlg,IDC_PHONES),&lvi); ListView_SetItemText(GetDlgItem(hwndDlg,IDC_PHONES),lvi.iItem,1,dbv.ptszVal); DBFreeVariant(&dbv); lvi.iItem++; } lvi.iSubItem=0; for(i=0;;i++) { lvi.lParam=i; mir_snprintf(idstr, SIZEOF(idstr), "MyPhone%d",i); if(DBGetContactSettingTString(hContact,"UserInfo",idstr,&dbv)) break; lvi.pszText=idstr2; mir_sntprintf(idstr2, SIZEOF(idstr2), TranslateT("Custom %d"),i+1); ListView_InsertItem(GetDlgItem(hwndDlg,IDC_PHONES),&lvi); if(lstrlen(dbv.ptszVal)>4 && !lstrcmp(dbv.ptszVal+lstrlen(dbv.ptszVal)-4,_T(" SMS"))) { ListView_SetItemText(GetDlgItem(hwndDlg,IDC_PHONES),lvi.iItem,2,_T("y")); dbv.ptszVal[lstrlen(dbv.ptszVal)-4]='\0'; } ListView_SetItemText(GetDlgItem(hwndDlg,IDC_PHONES),lvi.iItem,1,dbv.ptszVal); DBFreeVariant(&dbv); lvi.iItem++; } lvi.mask=LVIF_PARAM; lvi.lParam=(LPARAM)(-2); ListView_InsertItem(GetDlgItem(hwndDlg,IDC_PHONES),&lvi); } break; } case WM_NOTIFY: switch (((LPNMHDR)lParam)->idFrom) { case 0: switch (((LPNMHDR)lParam)->code) { case PSN_INFOCHANGED: SendMessage(hwndDlg,M_REMAKELISTS,0,0); break; } break; case IDC_EMAILS: case IDC_PHONES: switch (((LPNMHDR)lParam)->code) { case NM_CUSTOMDRAW: { NMLVCUSTOMDRAW *nm=(NMLVCUSTOMDRAW*)lParam; switch(nm->nmcd.dwDrawStage) { case CDDS_PREPAINT: case CDDS_ITEMPREPAINT: SetWindowLongPtr(hwndDlg,DWLP_MSGRESULT,CDRF_NOTIFYSUBITEMDRAW); return TRUE; case CDDS_SUBITEM|CDDS_ITEMPREPAINT: { RECT rc; ListView_GetSubItemRect(nm->nmcd.hdr.hwndFrom,nm->nmcd.dwItemSpec,nm->iSubItem,LVIR_LABEL,&rc); if(nm->iSubItem==1 && nm->nmcd.hdr.idFrom==IDC_EMAILS) { HFONT hoFont; TCHAR szText[256] = {0}; ListView_GetItemText(nm->nmcd.hdr.hwndFrom,nm->nmcd.dwItemSpec,nm->iSubItem,szText,SIZEOF(szText)); hoFont=(HFONT)SelectObject(nm->nmcd.hdc,hEmailFont); SetTextColor(nm->nmcd.hdc,RGB(0,0,255)); DrawText(nm->nmcd.hdc,szText,-1,&rc,DT_END_ELLIPSIS|DT_LEFT|DT_NOPREFIX|DT_SINGLELINE|DT_TOP); SelectObject(nm->nmcd.hdc,hoFont); SetWindowLongPtr(hwndDlg,DWLP_MSGRESULT,CDRF_SKIPDEFAULT); return TRUE; } HICON hIcon = NULL; if(nm->nmcd.lItemlParam==(LPARAM)(-2) && nm->iSubItem-3==(nm->nmcd.hdr.idFrom==IDC_PHONES)) hIcon = LoadSkinIcon( SKINICON_OTHER_ADDCONTACT ); else if(nm->iSubItem>1 && nm->nmcd.lItemlParam!=(LPARAM)(-1) && nm->nmcd.lItemlParam!=(LPARAM)(-2)) { static int iconResources[3]={SKINICON_OTHER_RENAME,SKINICON_OTHER_DELETE}; if(nm->iSubItem==2 && nm->nmcd.hdr.idFrom==IDC_PHONES) { TCHAR szText[2]; ListView_GetItemText(nm->nmcd.hdr.hwndFrom,nm->nmcd.dwItemSpec,nm->iSubItem,szText,SIZEOF(szText)); if(szText[0]) hIcon = LoadSkinIcon( SKINICON_OTHER_SMS ); } else hIcon = LoadSkinIcon( iconResources[nm->iSubItem-3+(nm->nmcd.hdr.idFrom==IDC_EMAILS)] ); } else break; DrawIconEx(nm->nmcd.hdc,(rc.left+rc.right-GetSystemMetrics(SM_CXSMICON))/2,(rc.top+rc.bottom-GetSystemMetrics(SM_CYSMICON))/2,hIcon,GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,NULL,DI_NORMAL); IconLib_ReleaseIcon(hIcon, 0); SetWindowLongPtr(hwndDlg,DWLP_MSGRESULT,CDRF_SKIPDEFAULT); return TRUE; } } break; } case NM_CLICK: { NMLISTVIEW *nm=(NMLISTVIEW*)lParam; LVITEM lvi; TCHAR szEmail[256]; HANDLE hContact=(HANDLE)GetWindowLongPtr(hwndDlg,GWLP_USERDATA); char *szIdTemplate=nm->hdr.idFrom==IDC_PHONES?"MyPhone%d":"Mye-mail%d"; LVHITTESTINFO hti; if(IsOverEmail(hwndDlg,szEmail,SIZEOF(szEmail))) { TCHAR szExec[264]; mir_sntprintf(szExec, SIZEOF(szExec), _T("mailto:%s"), szEmail); ShellExecute(hwndDlg,_T("open"),szExec,NULL,NULL,SW_SHOW); break; } if(nm->iSubItem<2) break; hti.pt.x=(short)LOWORD(GetMessagePos()); hti.pt.y=(short)HIWORD(GetMessagePos()); ScreenToClient(nm->hdr.hwndFrom,&hti.pt); if(ListView_SubItemHitTest(nm->hdr.hwndFrom,&hti)==-1) break; lvi.mask=LVIF_PARAM; lvi.iItem=hti.iItem; lvi.iSubItem=0; ListView_GetItem(nm->hdr.hwndFrom,&lvi); if(lvi.lParam==(LPARAM)(-1)) break; if(lvi.lParam==(LPARAM)(-2)) { if(hti.iSubItem-3==(nm->hdr.idFrom==IDC_PHONES)) { //add char szNewData[256]="",idstr[33]; int i; DBVARIANT dbv; if(IDOK!=DialogBoxParam(hMirandaInst,MAKEINTRESOURCE(nm->hdr.idFrom==IDC_PHONES?IDD_ADDPHONE:IDD_ADDEMAIL),hwndDlg,nm->hdr.idFrom==IDC_PHONES?EditUserPhoneDlgProc:EditUserEmailDlgProc,(LPARAM)szNewData)) break; for(i=0;;i++) { mir_snprintf(idstr, SIZEOF(idstr), szIdTemplate,i); if(DBGetContactSettingString(hContact,"UserInfo",idstr,&dbv)) break; DBFreeVariant(&dbv); } DBWriteContactSettingString(hContact,"UserInfo",idstr,szNewData); SendMessage(hwndDlg,M_REMAKELISTS,0,0); } } else { if(hti.iSubItem-3==(nm->hdr.idFrom==IDC_PHONES)) { //delete int i; char idstr[33]; DBVARIANT dbv; for(i=lvi.lParam;;i++) { mir_snprintf(idstr, SIZEOF(idstr), szIdTemplate,i+1); if(DBGetContactSettingString(hContact,"UserInfo",idstr,&dbv)) break; mir_snprintf(idstr, SIZEOF(idstr), szIdTemplate,i); DBWriteContactSettingString(hContact,"UserInfo",idstr,dbv.pszVal); DBFreeVariant(&dbv); } mir_snprintf(idstr, SIZEOF(idstr), szIdTemplate,i); DBDeleteContactSetting(hContact,"UserInfo",idstr); SendMessage(hwndDlg,M_REMAKELISTS,0,0); } else if(hti.iSubItem-2==(nm->hdr.idFrom==IDC_PHONES)) { //edit char szText[256],idstr[33]; DBVARIANT dbv; mir_snprintf(idstr, SIZEOF(idstr), szIdTemplate,lvi.lParam); if(DBGetContactSettingString(hContact,"UserInfo",idstr,&dbv)) break; lstrcpynA(szText,dbv.pszVal,SIZEOF(szText)); DBFreeVariant(&dbv); if(IDOK!=DialogBoxParam(hMirandaInst,MAKEINTRESOURCE(nm->hdr.idFrom==IDC_PHONES?IDD_ADDPHONE:IDD_ADDEMAIL),hwndDlg,nm->hdr.idFrom==IDC_PHONES?EditUserPhoneDlgProc:EditUserEmailDlgProc,(LPARAM)szText)) break; DBWriteContactSettingString(hContact,"UserInfo",idstr,szText); SendMessage(hwndDlg,M_REMAKELISTS,0,0); } } break; } } break; } break; case WM_SETCURSOR: if(LOWORD(lParam)!=HTCLIENT) break; if(GetForegroundWindow()==GetParent(hwndDlg)) { POINT pt; GetCursorPos(&pt); ScreenToClient(hwndDlg,&pt); // SetFocus(ChildWindowFromPoint(hwndDlg,pt)); //ugly hack because listviews ignore their first click } if(IsOverEmail(hwndDlg,NULL,0)) { SetCursor(hHandCursor); SetWindowLongPtr(hwndDlg,DWLP_MSGRESULT,TRUE); return TRUE; } break; case WM_COMMAND: switch(LOWORD(wParam)) { case IDCANCEL: SendMessage(GetParent(hwndDlg),msg,wParam,lParam); break; } break; } return FALSE; }
void InitTimeZones(void) { REG_TZI_FORMAT tzi; HKEY hKey; const TCHAR *tszKey = IsWinVerNT() ? _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones") : _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Time Zones"); /* * use GetDynamicTimeZoneInformation() on Vista+ - this will return a structure with * the registry key name, so finding our own time zone later will be MUCH easier for * localized systems or systems with a MUI pack installed */ if (IsWinVerVistaPlus()) pfnGetDynamicTimeZoneInformation = (pfnGetDynamicTimeZoneInformation_t)GetProcAddress(GetModuleHandle(_T("kernel32")), "GetDynamicTimeZoneInformation"); if (IsWinVer2000Plus()) { pfnSHLoadIndirectString = (pfnSHLoadIndirectString_t)GetProcAddress(GetModuleHandle(_T("shlwapi")), "SHLoadIndirectString"); pfnGetSystemDefaultUILanguage = (pfnGetSystemDefaultUILanguage_t)GetProcAddress(GetModuleHandle(_T("kernel32")), "GetSystemDefaultUILanguage"); pfnGetUserDefaultUILanguage = (pfnGetUserDefaultUILanguage_t)GetProcAddress(GetModuleHandle(_T("kernel32")), "GetUserDefaultUILanguage"); muiInstalled = pfnSHLoadIndirectString && pfnGetSystemDefaultUILanguage() != pfnGetUserDefaultUILanguage(); } pfnSendMessageW = (pfnSendMessageW_t)GetProcAddress(GetModuleHandle(_T("user32")), "SendMessageW"); if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, tszKey, 0, KEY_ENUMERATE_SUB_KEYS, &hKey)) { DWORD dwIndex = 0; HKEY hSubKey; TCHAR tszName[MIM_TZ_NAMELEN]; DWORD dwSize = SIZEOF(tszName); while (ERROR_NO_MORE_ITEMS != RegEnumKeyEx(hKey, dwIndex++, tszName, &dwSize, NULL, NULL, 0, NULL)) { if (ERROR_SUCCESS == RegOpenKeyEx(hKey, tszName, 0, KEY_QUERY_VALUE, &hSubKey)) { dwSize = sizeof(tszName); DWORD dwLength = sizeof(tzi); if (ERROR_SUCCESS != RegQueryValueEx(hSubKey, _T("TZI"), NULL, NULL, (unsigned char *)&tzi, &dwLength)) continue; MIM_TIMEZONE *tz = new MIM_TIMEZONE; tz->tzi.Bias = tzi.Bias; tz->tzi.StandardDate = tzi.StandardDate; tz->tzi.StandardBias = tzi.StandardBias; tz->tzi.DaylightDate = tzi.DaylightDate; tz->tzi.DaylightBias = tzi.DaylightBias; _tcscpy(tz->tszName, tszName); tz->hash = hashstr(tszName); tz->offset = INT_MIN; GetLocalizedString(hSubKey, _T("Display"), tz->szDisplay, SIZEOF(tz->szDisplay)); GetLocalizedString(hSubKey, _T("Std"), tz->tzi.StandardName, SIZEOF(tz->tzi.StandardName)); GetLocalizedString(hSubKey, _T("Dlt"), tz->tzi.DaylightName, SIZEOF(tz->tzi.DaylightName)); g_timezones.insert(tz); g_timezonesBias.insert(tz); RegCloseKey(hSubKey); } dwSize = SIZEOF(tszName); } RegCloseKey(hKey); } RecalculateTime(); CreateServiceFunction(MS_SYSTEM_GET_TMI, GetTimeApi); CreateServiceFunction(MS_DB_TIME_TIMESTAMPTOLOCAL, TimestampToLocal); CreateServiceFunction(MS_DB_TIME_TIMESTAMPTOSTRINGT, TimestampToStringT); #ifdef _UNICODE CreateServiceFunction(MS_DB_TIME_TIMESTAMPTOSTRING, TimestampToStringA); #else CreateServiceFunction(MS_DB_TIME_TIMESTAMPTOSTRING, TimestampToStringT); #endif tmi.cbSize = sizeof(tmi); GetTimeApi(0, (LPARAM)&tmi); }