📄 helpers.c
字号:
/******************************************************************************
*
*
* Notepad2
*
* Helpers.c
* General helper functions
* Parts taken from SciTE, (c) Neil Hodgson, http://www.scintilla.org
* MinimizeToTray (c) 2000 Matthew Ellis
*
* See Readme.txt for more information about this source code.
* Please send me your comments to this work.
*
* See License.txt for details about distribution and modification.
*
* (c) Florian Balmer 1996-2008
* florian.balmer@gmail.com
* http://www.flos-freeware.ch
*
*
******************************************************************************/
#include <windows.h>
#include <shlobj.h>
#include <shlwapi.h>
#include <commctrl.h>
#include <stdio.h>
#include <string.h>
#include "helpers.h"
#include "resource.h"
//=============================================================================
//
// Manipulation of cached ini file sections
//
int IniSectionGetString(
LPCSTR lpCachedIniSection,
LPCSTR lpName,
LPCSTR lpDefault,
LPSTR lpReturnedString,
int cchReturnedString)
{
char *p = (char *)lpCachedIniSection;
char tch[256];
int ich;
if (p) {
lstrcpy(tch,lpName);
lstrcat(tch,"=");
ich = lstrlen(tch);
while (*p) {
if (StrCmpNI(p,tch,ich) == 0) {
lstrcpyn(lpReturnedString,p + ich,cchReturnedString);
return(lstrlen(lpReturnedString));
}
else
p = StrEnd(p) + 1;
}
}
lstrcpyn(lpReturnedString,lpDefault,cchReturnedString);
return(lstrlen(lpReturnedString));
}
int IniSectionGetInt(
LPCSTR lpCachedIniSection,
LPCSTR lpName,
int iDefault)
{
char *p = (char *)lpCachedIniSection;
char tch[256];
int ich;
int i;
if (p) {
lstrcpy(tch,lpName);
lstrcat(tch,"=");
ich = lstrlen(tch);
while (*p) {
if (StrCmpNI(p,tch,ich) == 0) {
if (sscanf(p + ich,"%i",&i) == 1)
return(i);
else
return(iDefault);
}
else
p = StrEnd(p) + 1;
}
}
return(iDefault);
}
BOOL IniSectionSetString(LPSTR lpCachedIniSection,LPCSTR lpName,LPCSTR lpString)
{
char tch[256];
char *p = lpCachedIniSection;
if (p) {
while (*p) {
p = StrEnd(p) + 1;
}
wsprintf(tch,"%s=%s",lpName,lpString);
lstrcpy(p,tch);
p = StrEnd(p) + 1;
*p = 0;
return(TRUE);
}
return(FALSE);
}
//=============================================================================
//
// BeginWaitCursor()
//
void BeginWaitCursor()
{
DestroyCursor(
SetCursor(
LoadCursor(NULL,IDC_WAIT)));
}
//=============================================================================
//
// EndWaitCursor()
//
void EndWaitCursor()
{
DestroyCursor(
SetCursor(
LoadCursor(NULL,IDC_ARROW)));
}
//=============================================================================
//
// KeepWindowsAlive()
//
/*void KeepWindowsAlive()
{
MSG msg;
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}*/
//=============================================================================
//
// IsWindows2korLater()
//
BOOL IsWindows2korLater()
{
static BOOL bIsWindows2korLater;
static BOOL bCachedResult;
if (bCachedResult)
return(bIsWindows2korLater);
else {
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
bIsWindows2korLater =
(osvi.dwMajorVersion >= 5);
bCachedResult = TRUE;
return(bIsWindows2korLater);
}
}
//=============================================================================
//
// IsWindowsXPorLater()
//
//BOOL IsWindowsXPorLater()
//{
// static BOOL bIsWindowsXPorLater;
// static BOOL bCachedResult;
// if (bCachedResult)
// return(bIsWindowsXPorLater);
// else {
// OSVERSIONINFO osvi;
// osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
// GetVersionEx(&osvi);
// bIsWindowsXPorLater =
// ((osvi.dwMajorVersion > 5) ||
// ((osvi.dwMajorVersion == 5) && (osvi.dwMinorVersion >= 1)));
// bCachedResult = TRUE;
// return(bIsWindowsXPorLater);
// }
//}
//=============================================================================
//
// PrivateIsAppThemed()
//
extern HMODULE hModUxTheme;
BOOL PrivateIsAppThemed()
{
static FARPROC pfnIsAppThemed;
BOOL bIsAppThemed = FALSE;
if (hModUxTheme) {
if (!pfnIsAppThemed)
pfnIsAppThemed = GetProcAddress(hModUxTheme,"IsAppThemed");
if (pfnIsAppThemed)
bIsAppThemed = pfnIsAppThemed();
}
return bIsAppThemed;
}
//=============================================================================
//
// SetWindowTitle()
//
BOOL bFreezeAppTitle = FALSE;
BOOL SetWindowTitle(HWND hwnd,UINT uIDAppName,UINT uIDUntitled,
LPCSTR lpszFile,int iFormat,BOOL bModified,
UINT uIDReadOnly,BOOL bReadOnly)
{
char szUntitled[128],szAppName[128],szReadOnly[32],szTitle[512];
static const char *pszSep = " - ";
static const char *pszMod = "* ";
if (bFreezeAppTitle)
return FALSE;
if (!GetString(uIDAppName,szAppName,COUNTOF(szAppName)) ||
!GetString(uIDUntitled,szUntitled,COUNTOF(szUntitled)))
return FALSE;
if (bModified)
lstrcpy(szTitle,pszMod);
else
lstrcpy(szTitle,"");
if (lstrlen(lpszFile))
{
if (iFormat < 2 && !PathIsRoot(lpszFile))
{
SHFILEINFO shfi;
if (SHGetFileInfo2(lpszFile,0,&shfi,sizeof(SHFILEINFO),SHGFI_DISPLAYNAME))
lstrcat(szTitle,shfi.szDisplayName);
else
lstrcat(szTitle,PathFindFileName(lpszFile));
if (iFormat == 1) {
char tchPath[MAX_PATH];
StrCpyN(tchPath,lpszFile,COUNTOF(tchPath));
PathRemoveFileSpec(tchPath);
StrCat(szTitle," [");
StrCat(szTitle,tchPath);
StrCat(szTitle,"]");
}
}
else
lstrcat(szTitle,lpszFile);
}
else
lstrcat(szTitle,szUntitled);
if (bReadOnly && GetString(uIDReadOnly,szReadOnly,COUNTOF(szReadOnly)))
{
lstrcat(szTitle," ");
lstrcat(szTitle,szReadOnly);
}
lstrcat(szTitle,pszSep);
lstrcat(szTitle,szAppName);
return SetWindowText(hwnd,szTitle);
}
//=============================================================================
//
// SetWindowTransparentMode()
//
void SetWindowTransparentMode(HWND hwnd,BOOL bTransparentMode)
{
FARPROC fp;
int iAlphaPercent;
BYTE bAlpha;
if (bTransparentMode) {
if (fp = GetProcAddress(GetModuleHandle("User32"),"SetLayeredWindowAttributes")) {
SetWindowLong(hwnd,GWL_EXSTYLE,
GetWindowLong(hwnd,GWL_EXSTYLE) | /*WS_EX_LAYERED*/0x00080000);
// get opacity level from registry
iAlphaPercent = IniGetInt("Settings2","OpacityLevel",75);
if (iAlphaPercent < 0 || iAlphaPercent > 100)
iAlphaPercent = 75;
bAlpha = iAlphaPercent * 255 / 100;
fp(hwnd,0,bAlpha,/*LWA_ALPHA*/0x00000002);
}
}
else
SetWindowLong(hwnd,GWL_EXSTYLE,
GetWindowLong(hwnd,GWL_EXSTYLE) & ~/*WS_EX_LAYERED*/0x00080000);
}
//=============================================================================
//
// CenterDlgInParent()
//
void CenterDlgInParent(HWND hDlg)
{
RECT rcDlg;
HWND hParent;
RECT rcParent;
MONITORINFO mi;
HMONITOR hMonitor;
int xMin, yMin, xMax, yMax, x, y;
GetWindowRect(hDlg,&rcDlg);
hParent = GetParent(hDlg);
GetWindowRect(hParent,&rcParent);
hMonitor = MonitorFromRect(&rcParent,MONITOR_DEFAULTTONEAREST);
mi.cbSize = sizeof(mi);
GetMonitorInfo(hMonitor,&mi);
xMin = mi.rcWork.left;
yMin = mi.rcWork.top;
xMax = (mi.rcWork.right) - (rcDlg.right - rcDlg.left);
yMax = (mi.rcWork.bottom) - (rcDlg.bottom - rcDlg.top);
if ((rcParent.right - rcParent.left) - (rcDlg.right - rcDlg.left) > 20)
x = rcParent.left + (((rcParent.right - rcParent.left) - (rcDlg.right - rcDlg.left)) / 2);
else
x = rcParent.left + 70;
if ((rcParent.bottom - rcParent.top) - (rcDlg.bottom - rcDlg.top) > 20)
y = rcParent.top + (((rcParent.bottom - rcParent.top) - (rcDlg.bottom - rcDlg.top)) / 2);
else
y = rcParent.top + 60;
SetWindowPos(hDlg,NULL,max(xMin,min(xMax,x)),max(yMin,min(yMax,y)),0,0,SWP_NOZORDER|SWP_NOSIZE);
}
//=============================================================================
//
// MakeBitmapButton()
//
void MakeBitmapButton(HWND hwnd,int nCtlId,HINSTANCE hInstance,UINT uBmpId)
{
HWND hwndCtl = GetDlgItem(hwnd,nCtlId);
BITMAP bmp;
struct { HIMAGELIST himl; RECT margin; UINT uAlign; } bi;
HBITMAP hBmp = LoadImage(hInstance,MAKEINTRESOURCE(uBmpId),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
GetObject(hBmp,sizeof(BITMAP),&bmp);
bi.himl = ImageList_Create(bmp.bmWidth,bmp.bmHeight,ILC_COLOR32|ILC_MASK,1,0);
ImageList_AddMasked(bi.himl,hBmp,CLR_DEFAULT);
DeleteObject(hBmp);
SetRect(&bi.margin,0,0,0,0);
bi.uAlign = 4/*BUTTON_IMAGELIST_ALIGN_CENTER*/;
SendMessage(hwndCtl,0x1600+0x0002/*BCM_FIRST+BCM_SETIMAGELIST*/,0,(LPARAM)&bi);
}
//=============================================================================
//
// StatusSetText()
//
BOOL StatusSetText(HWND hwnd,UINT nPart,LPCSTR lpszText)
{
UINT uFlags = (nPart == 255) ? nPart|SBT_NOBORDERS : nPart;
return SendMessage(hwnd,SB_SETTEXT,uFlags,(LPARAM)lpszText);
}
//=============================================================================
//
// SendWMSize()
//
LRESULT SendWMSize(HWND hwnd)
{
RECT rc; GetClientRect(hwnd,&rc);
return(SendMessage(hwnd,WM_SIZE,SIZE_RESTORED,
MAKELPARAM(rc.right,rc.bottom)));
}
//=============================================================================
//
// StatusSetTextID()
//
BOOL StatusSetTextID(HWND hwnd,UINT nPart,UINT uID)
{
char szText[256];
UINT uFlags = (nPart == 255) ? nPart|SBT_NOBORDERS : nPart;
if (!uID)
{
SendMessage(hwnd,SB_SETTEXT,uFlags,0);
return TRUE;
}
if (!GetString(uID,szText,256))
return FALSE;
return SendMessage(hwnd,SB_SETTEXT,uFlags,(LPARAM)szText);
}
//=============================================================================
//
// StatusCalcPaneWidth()
//
int StatusCalcPaneWidth(HWND hwnd,LPCSTR lpsz)
{
SIZE size;
HDC hdc = GetDC(hwnd);
HFONT hfont = (HFONT)SendMessage(hwnd,WM_GETFONT,0,0);
HFONT hfold = SelectObject(hdc,hfont);
int mmode = SetMapMode(hdc,MM_TEXT);
GetTextExtentPoint32(hdc,lpsz,lstrlen(lpsz),&size);
SetMapMode(hdc,mmode);
SelectObject(hdc,hfold);
ReleaseDC(hwnd,hdc);
return(size.cx + 9);
}
//=============================================================================
//
// Toolbar_Get/SetButtons()
//
int Toolbar_GetButtons(HWND hwnd,int cmdBase,LPSTR lpszButtons,int cchButtons)
{
char tchButtons[512];
char tchItem[32];
int i,c;
TBBUTTON tbb;
lstrcpy(tchButtons,"");
c = min(50,SendMessage(hwnd,TB_BUTTONCOUNT,0,0));
for (i = 0; i < c; i++) {
SendMessage(hwnd,TB_GETBUTTON,(WPARAM)i,(LPARAM)&tbb);
wsprintf(tchItem,"%i ",
(tbb.idCommand==0)?0:tbb.idCommand-cmdBase+1);
lstrcat(tchButtons,tchItem);
}
TrimString(tchButtons);
lstrcpyn(lpszButtons,tchButtons,cchButtons);
return(c);
}
int Toolbar_SetButtons(HWND hwnd,int cmdBase,LPCSTR lpszButtons,LPCTBBUTTON ptbb,int ctbb)
{
char tchButtons[512];
char *p;
int i,c;
int iCmd;
ZeroMemory(tchButtons,COUNTOF(tchButtons)/sizeof(tchButtons[1]));
lstrcpyn(tchButtons,lpszButtons,COUNTOF(tchButtons)-2);
c = SendMessage(hwnd,TB_BUTTONCOUNT,0,0);
for (i = 0; i < c; i++)
SendMessage(hwnd,TB_DELETEBUTTON,0,0);
for (i = 0; i < COUNTOF(tchButtons); i++)
if (tchButtons[i] == ' ') tchButtons[i] = 0;
p = tchButtons;
while (*p) {
if (sscanf(p,"%i",&iCmd) == 1) {
iCmd = (iCmd==0)?0:iCmd+cmdBase-1;
for (i = 0; i < ctbb; i++) {
if (ptbb[i].idCommand == iCmd) {
SendMessage(hwnd,TB_ADDBUTTONS,(WPARAM)1,(LPARAM)&ptbb[i]);
break;
}
}
}
p = StrEnd(p)+1;
}
return(SendMessage(hwnd,TB_BUTTONCOUNT,0,0));
}
//=============================================================================
//
// IsCmdEnabled()
//
BOOL IsCmdEnabled(HWND hwnd,UINT uId)
{
HMENU hmenu;
UINT ustate;
hmenu = GetMenu(hwnd);
SendMessage(hwnd,WM_INITMENU,(WPARAM)hmenu,0);
ustate = GetMenuState(hmenu,uId,MF_BYCOMMAND);
if (ustate == 0xFFFFFFFF)
return TRUE;
else
return (!(ustate & (MF_GRAYED|MF_DISABLED)));
}
//=============================================================================
//
// FormatString()
//
int FormatString(LPSTR lpOutput,int nOutput,UINT uIdFormat,...)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -