📄 foosys.cpp
字号:
#include "stdafx.h"
#include "..\Include\fooSys.h"
#include "..\Include\fooBit.h"
#include <commdlg.h>
#include <shellapi.h>
//===================================================================
// Get error code's description
PTSTR fooGetErrorString (DWORD dwError)
{
static TCHAR szBuffer[256] ;
BOOL dwResult ;
ZeroMemory (szBuffer, sizeof(TCHAR) * 256) ;
dwResult = FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL,
dwError,
MAKELANGID (LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),
szBuffer, 256, NULL) ;
if (dwResult == 0)
{
// Is it a network-related error ?
HMODULE hDll = LoadLibraryEx (TEXT("netmsg.dll"), NULL, DONT_RESOLVE_DLL_REFERENCES) ;
if (hDll != NULL)
{
FormatMessage (FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_FROM_SYSTEM,
hDll, dwError, MAKELANGID (LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),
szBuffer, 256, NULL) ;
FreeLibrary (hDll) ;
}
}
return szBuffer ;
}
//===================================================================
void fooFormatCommaNumber (DWORD dwNum, TCHAR * szBuffer, int iBufLen)
{
if ((szBuffer != NULL) && (iBufLen > 0))
{
TCHAR num[64] ;
::wsprintf (num, TEXT("%lu"), dwNum) ;
NUMBERFMT nf ;
nf.NumDigits = 0 ;
nf.LeadingZero = FALSE ;
nf.Grouping = 3 ;
nf.lpDecimalSep = TEXT(".") ;
nf.lpThousandSep = TEXT(",") ;
nf.NegativeOrder = 0 ;
::GetNumberFormat (LOCALE_USER_DEFAULT, 0, num, &nf, szBuffer, iBufLen) ;
}
}
//===================================================================
// Open a Control Pad
BOOL fooControlPad (HWND hwnd, DWORD dwType)
{
PTSTR psPad = NULL ;
switch (dwType)
{
case 0 : // 桌面属性
psPad = TEXT("desk.cpl") ;
break ;
case 1 : // Internet属性
psPad = TEXT("Inetcpl.cpl") ;
break ;
case 2 : // 多媒体属性
psPad = TEXT("Mmsys.cpl") ;
break ;
case 3 : // Modem属性
psPad = TEXT("Modem.cpl") ;
break ;
case 4 : // 网络属性
psPad = TEXT("Netcpl.cpl") ;
break ;
case 5 : // 电源管理属性
psPad = TEXT("Powercfg.cpl") ;
break ;
case 6 : // 添加/删除程序属性
psPad = TEXT("Appwiz.cpl") ;
break ;
case 7 : // 鼠标属性
psPad = TEXT("Main.cpl") ;
break ;
case 8 : // 系统属性
psPad = TEXT("Sysdm.cpl") ;
break ;
case 9 : // 日期/时间属性
psPad = TEXT("Timedate.cpl") ;
break ;
case 10 : // 桌面主题
psPad = TEXT("Themes.cpl") ;
break ;
}
if (!psPad) return FALSE ;
ShellExecute (hwnd, TEXT("open"), TEXT("control"), psPad, TEXT(""), SW_SHOWNORMAL);
return TRUE ;
}
//===================================================================
void fooGetLargestDisplayMode (DISPLAYMODE * mode)
{
if (mode == NULL) return ;
DEVMODE devmode ;
::fooInitStruct (mode, false) ;
::fooInitStruct (&devmode, false) ;
devmode.dmSize = sizeof(DEVMODE) ;
DWORD iIndex = 0 ;
while (::EnumDisplaySettings (NULL, iIndex++, &devmode))
if (devmode.dmPelsWidth >= mode->dwWidth)
{
mode->dwBits = devmode.dmBitsPerPel ;
mode->dwWidth = devmode.dmPelsWidth ;
mode->dwHeight = devmode.dmPelsHeight ;
mode->dwFrequency = devmode.dmDisplayFrequency ;
}
return ;
}
//===================================================================
void fooGetCurrentDisplayMode (DISPLAYMODE * mode)
{
if (mode == NULL) return ;
DEVMODE devmode ;
::ZeroMemory (mode, sizeof(*mode)) ;
::ZeroMemory (&devmode, sizeof(devmode)) ;
devmode.dmSize = sizeof(devmode) ;
::EnumDisplaySettingsEx (NULL, ENUM_CURRENT_SETTINGS, &devmode, EDS_RAWMODE) ;
mode->dwBits = devmode.dmBitsPerPel ;
mode->dwWidth = devmode.dmPelsWidth ;
mode->dwHeight = devmode.dmPelsHeight ;
mode->dwFrequency = devmode.dmDisplayFrequency ;
}
//===================================================================
LONG fooSetDisplayMode (DISPLAYMODE mode)
{
DEVMODE dm ;
dm.dmSize = sizeof (dm) ;
dm.dmPelsWidth = mode.dwWidth ;
dm.dmPelsHeight = mode.dwHeight ;
dm.dmBitsPerPel = mode.dwBits ;
dm.dmDisplayFrequency = mode.dwFrequency ;
dm.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY ;
return ChangeDisplaySettings (&dm, CDS_UPDATEREGISTRY);
}
//===================================================================
void fooExpandBox (BOOL fExpand, HWND hDlg, int DefaultBox_ID)
{
RECT rcDefault, rcChild, rcDlg ;
HWND hDefaultBox, hChild ;
hDefaultBox = GetDlgItem (hDlg, DefaultBox_ID) ;
GetWindowRect (hDefaultBox, &rcDefault) ;
hChild = GetTopWindow (hDlg) ; // GetFirstChild
for ( ; hChild != NULL ; hChild = GetWindow(hChild, GW_HWNDNEXT))
{
GetWindowRect (hChild, &rcChild) ;
if (!IntersectRect (&rcDlg, &rcChild, &rcDefault))
EnableWindow (hChild, fExpand) ;
} // Enable/Disable all child windows outside of the default box.
if (!fExpand)
{
GetWindowRect (hDlg, &rcDlg) ;
if (GetWindowLong (hDlg, GWL_USERDATA) == 0)
{
// 第一次运行,缩小
SetWindowLong (hDefaultBox, GWL_USERDATA, MAKELONG(rcDlg.right - rcDlg.left, rcDlg.bottom - rcDlg.top)) ;
ShowWindow (hDefaultBox, SW_HIDE) ;
}
SetWindowPos(hDlg, NULL, 0, 0, rcDefault.right - rcDlg.left, rcDefault.bottom - rcDlg.top,
SWP_NOZORDER | SWP_NOMOVE) ;
::fooGetErrorString (::GetLastError ()) ;
}
else
{
DWORD dwDims = GetWindowLong (hDefaultBox, GWL_USERDATA) ;
SetWindowPos (hDlg, NULL, 0, 0, LOWORD(dwDims), HIWORD(dwDims), SWP_NOZORDER | SWP_NOMOVE) ;
SendMessage (hDlg, DM_REPOSITION, 0, 0) ;
InvalidateRect (hDlg, NULL, TRUE) ;
}
return ;
}
//===================================================================
// Example : szFilter = "Executable Files (*.exe, *.dll)\0*.exe;*.dll\0"
// "All Files (*.*)\0*.*\0\0" ;
BOOL fooShowFileDialog (HWND hWnd, BOOL bOpen, TCHAR * szFullName,
PCTSTR szIniDir, PCTSTR Title, PCTSTR szFilter)
{
OPENFILENAME ofn ;
TCHAR InitDir[MAX_PATH] ;
if (szFullName == NULL)
return FALSE ;
if (szIniDir)
lstrcpy (InitDir, szIniDir) ;
else
::GetCurrentDirectory (MAX_PATH, InitDir) ;
::ZeroMemory (&ofn, sizeof(OPENFILENAME)) ;
szFullName[0] = TEXT('\0') ;
ofn.lStructSize = sizeof (OPENFILENAME) ;
ofn.hwndOwner = hWnd ;
ofn.hInstance = NULL ;
ofn.lpstrFilter = szFilter ? szFilter : TEXT("All Files (*.*)\0*.*\0\0") ;
ofn.lpstrCustomFilter = NULL ;
ofn.nMaxCustFilter = 0 ;
ofn.nFilterIndex = 0 ;
ofn.nMaxFile = MAX_PATH ;
ofn.nMaxFileTitle = MAX_PATH ;
ofn.lpstrInitialDir = InitDir ;
ofn.lpstrTitle = Title ? Title : (bOpen ? TEXT("Open File") : TEXT("Save File")) ;
ofn.lpstrFile = szFullName ;
ofn.nFileExtension = 0 ;
ofn.lpstrDefExt = TEXT("*") ;
ofn.lCustData = 0 ;
ofn.lpfnHook = NULL ;
ofn.lpTemplateName = NULL ;
ofn.Flags = OFN_ENABLESIZING | (bOpen ? 0 : OFN_OVERWRITEPROMPT) ;
return (bOpen ? (::GetOpenFileName (&ofn) != 0) : (::GetSaveFileName (&ofn) != 0)) ;
}
//===================================================================
BOOL fooShowColorDialog (COLORREF * ColorSelect, COLORREF InitColor[16])
{
CHOOSECOLOR cc ;
static COLORREF _crCustomColors[16] = { RGB(192,220,192), RGB(166,202,240), RGB(0,0,0), RGB(255,255,255),
RGB(255,0,0), RGB(0,255,0), RGB(0,0,255), RGB(202,38,79),
RGB(192,220,192), RGB(192,220,192), RGB(192,220,192), RGB(192,220,192),
RGB(192,220,192), RGB(192,220,192), RGB(192,220,192), RGB(192,220,192) } ;
if (ColorSelect == NULL)
return FALSE ;
if (InitColor)
CopyMemory (_crCustomColors, InitColor, 16 * sizeof(COLORREF)) ;
cc.lStructSize = sizeof (CHOOSECOLOR) ;
cc.hwndOwner = NULL ;
cc.hInstance = NULL ;
cc.rgbResult = RGB (166, 202, 240) ;
cc.lpCustColors = _crCustomColors ;
cc.Flags = CC_RGBINIT | CC_FULLOPEN ;
cc.lCustData = 0 ;
cc.lpfnHook = NULL ;
cc.lpTemplateName = NULL ;
if (!::ChooseColor (&cc)) return FALSE ;
if (InitColor)
CopyMemory (InitColor, _crCustomColors, 16 * sizeof(COLORREF)) ;
return TRUE ;
}
//===================================================================
void fooOnChangeDlgSize (HWND hDlg,
RECT rcDest, RECT rcSrc,
UINT nNumCtrl,
UINT nCtrl[],
UINT nMethod[])
{
if ((nCtrl == NULL) || (nMethod == NULL))
return ;
// 所有坐标运算都为Screen坐标
RECT rcCtrl ;
RECT rcCtrlNew ;
BOOL bXLeft, bYUp ; // 偏左?偏上?
::ClientToScreen (hDlg, (POINT *) &rcDest.left) ;
::ClientToScreen (hDlg, (POINT *) &rcDest.right) ;
::ClientToScreen (hDlg, (POINT *) &rcSrc.left) ;
::ClientToScreen (hDlg, (POINT *) &rcSrc.right) ;
for (int i = 0 ; i < (int) nNumCtrl ; i++)
{
::GetWindowRect (::GetDlgItem (hDlg, nCtrl[i]), &rcCtrl) ; // rcCtrl <-- Screen
bXLeft = ( ((rcCtrl.left + rcCtrl.right) / 2) <= ((rcSrc.left + rcSrc.right) / 2) ) ;
bYUp = ( ((rcCtrl.top + rcCtrl.bottom) / 2) <= ((rcSrc.top + rcSrc.bottom) / 2) ) ;
switch (nMethod[i])
{
case DLG_RESIZE_MOVE :
if (bXLeft)
{
rcCtrlNew.right = rcDest.right - (rcSrc.right - rcCtrl.right) * (rcDest.right - rcDest.left) / (rcSrc.right - rcSrc.left) ;
rcCtrlNew.left = rcCtrlNew.right - (rcCtrl.right - rcCtrl.left) ;
}
else
{
rcCtrlNew.left = (rcCtrl.left - rcSrc.left) * (rcDest.right - rcDest.left) / (rcSrc.right - rcSrc.left) + rcDest.left ;
rcCtrlNew.right = rcCtrlNew.left + (rcCtrl.right - rcCtrl.left) ;
}
if (bYUp)
{
rcCtrlNew.bottom = rcDest.bottom - (rcSrc.bottom - rcCtrl.bottom) * (rcDest.bottom - rcDest.top) / (rcSrc.bottom - rcSrc.top) ;
rcCtrlNew.top = rcCtrlNew.bottom - (rcCtrl.bottom - rcCtrl.top) ;
}
else
{
rcCtrlNew.top = rcDest.top + (rcCtrl.top - rcSrc.top) * (rcDest.bottom - rcDest.top) / (rcSrc.bottom - rcSrc.top) ;
rcCtrlNew.bottom = rcCtrlNew.top + (rcCtrl.bottom - rcCtrl.top) ;
}
break ;
case DLG_RESIZE_STRETCH :
rcCtrlNew.right = (rcDest.right - rcDest.left) * (rcCtrl.right - rcSrc.left) / (rcSrc.right - rcSrc.left) + rcDest.left ;
rcCtrlNew.bottom = (rcDest.bottom - rcDest.top) * (rcCtrl.bottom - rcSrc.top) / (rcSrc.bottom - rcSrc.top) + rcDest.top ;
rcCtrlNew.left = (rcDest.right - rcDest.left) * (rcCtrl.left - rcSrc.left) / (rcSrc.right - rcSrc.left) + rcDest.left ;
rcCtrlNew.top = (rcDest.bottom - rcDest.top) * (rcCtrl.top - rcSrc.top) / (rcSrc.bottom - rcSrc.top) + rcDest.top ;
break ;
}
::ScreenToClient (hDlg, (POINT *) &rcCtrlNew.left) ;
::ScreenToClient (hDlg, (POINT *) &rcCtrlNew.right) ;
::MoveWindow (::GetDlgItem (hDlg, nCtrl[i]), rcCtrlNew.left, rcCtrlNew.top, rcCtrlNew.right - rcCtrlNew.left, rcCtrlNew.bottom - rcCtrlNew.top, TRUE) ;
}
}
//===================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -