📄 dialogs.c
字号:
/******************************************************************************
*
*
* Notepad2
*
* Dialogs.c
* Notepad2 dialog boxes implementation
*
* 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 <commctrl.h>
#include <shlobj.h>
#include <shellapi.h>
#include <shlwapi.h>
#include <commdlg.h>
#include <string.h>
#include "notepad2.h"
#include "scintilla.h"
#include "edit.h"
#include "helpers.h"
#include "dlapi.h"
#include "dialogs.h"
#include "resource.h"
extern HWND hwndMain;
extern HWND hwndEdit;
extern HINSTANCE g_hInstance;
extern LPMALLOC g_lpMalloc;
extern BOOL bSkipUnicodeDetection;
extern BOOL bFixLineEndings;
//=============================================================================
//
// MsgBox()
//
int MsgBox(int iType,UINT uIdMsg,...)
{
char szText [256*2];
char szBuf [256*2];
char szTitle[64];
int iIcon = 0;
HWND hwnd;
if (!GetString(uIdMsg,szBuf,COUNTOF(szBuf)))
return(0);
wvsprintf(szText,szBuf,(LPVOID)(&uIdMsg + 1));
GetString(IDS_APPTITLE,szTitle,COUNTOF(szTitle));
switch (iType) {
case MBINFO: iIcon = MB_ICONEXCLAMATION; break;
case MBWARN: iIcon = MB_ICONEXCLAMATION; break;
case MBYESNO: iIcon = MB_ICONEXCLAMATION | MB_YESNO; break;
case MBYESNOCANCEL: iIcon = MB_ICONEXCLAMATION | MB_YESNOCANCEL; break;
case MBYESNOWARN: iIcon = MB_ICONEXCLAMATION | MB_YESNO; break;
case MBOKCANCEL: iIcon = MB_ICONEXCLAMATION | MB_OKCANCEL; break;
}
if (!(hwnd = GetFocus()))
hwnd = hwndMain;
return MessageBoxEx(hwnd,
szText,szTitle,
MB_SETFOREGROUND | iIcon,
MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT));
}
//=============================================================================
//
// DisplayCmdLineHelp()
//
void DisplayCmdLineHelp()
{
MSGBOXPARAMS mbp;
char szTitle[32];
char szText[1024];
GetString(IDS_APPTITLE,szTitle,COUNTOF(szTitle));
GetString(IDS_CMDLINEHELP,szText,COUNTOF(szText));
mbp.cbSize = sizeof(MSGBOXPARAMS);
mbp.hwndOwner = NULL;
mbp.hInstance = g_hInstance;
mbp.lpszText = szText;
mbp.lpszCaption = szTitle;
mbp.dwStyle = MB_OK | MB_USERICON | MB_SETFOREGROUND;
mbp.lpszIcon = MAKEINTRESOURCE(IDR_MAINWND);
mbp.dwContextHelpId = 0;
mbp.lpfnMsgBoxCallback = NULL;
mbp.dwLanguageId = MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL);
MessageBoxIndirect(&mbp);
}
//=============================================================================
//
// BFFCallBack()
//
int CALLBACK BFFCallBack(HWND hwnd,UINT umsg,LPARAM lParam,LPARAM lpData)
{
if (umsg == BFFM_INITIALIZED)
SendMessage(hwnd,BFFM_SETSELECTION,TRUE,lpData);
return(0);
lParam;
}
//=============================================================================
//
// GetDirectory()
//
BOOL GetDirectory(HWND hwndParent,int iTitle,LPSTR pszFolder,LPCSTR pszBase,BOOL bNewDialogStyle)
{
BROWSEINFO bi;
LPITEMIDLIST pidl;
//LPMALLOC lpMalloc;
char szTitle[256];
char szBase[MAX_PATH];
BOOL fOk = FALSE;
lstrcpy(szTitle,"");
GetString(iTitle,szTitle,COUNTOF(szTitle));
if (!pszBase || !*pszBase)
GetCurrentDirectory(MAX_PATH,szBase);
else
lstrcpy(szBase,pszBase);
bi.hwndOwner = hwndParent;
bi.pidlRoot = NULL;
bi.pszDisplayName = pszFolder;
bi.lpszTitle = szTitle;
bi.ulFlags = BIF_RETURNONLYFSDIRS;
if (bNewDialogStyle)
bi.ulFlags |= BIF_NEWDIALOGSTYLE;
bi.lpfn = &BFFCallBack;
bi.lParam = (LPARAM)szBase;
bi.iImage = 0;
//if (SHGetMalloc(&lpMalloc) != NOERROR)
// return FALSE;
pidl = SHBrowseForFolder(&bi);
if (pidl)
{
SHGetPathFromIDList(pidl,pszFolder);
g_lpMalloc->lpVtbl->Free(g_lpMalloc,pidl);
fOk = TRUE;
}
//lpMalloc->lpVtbl->Release(lpMalloc);
return fOk;
}
//=============================================================================
//
// AboutDlgProc()
//
static const DWORD dwVerMajor = 2;
static const DWORD dwVerMinor = 1;
static const DWORD dwBuildNumber = 19;
BOOL CALLBACK AboutDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
{
static HFONT hFontTitle;
static BOOL hover_email;
static BOOL capture_email;
static BOOL hover_webpage;
static BOOL capture_webpage;
static HFONT hFontNormal;
static HFONT hFontHover;
static HCURSOR hCursorNormal;
static HCURSOR hCursorHover;
switch(umsg)
{
case WM_INITDIALOG:
{
char szVersion[64];
LOGFONT lf;
wsprintf(szVersion,"Notepad2 %u.%u.%0.2u",dwVerMajor,dwVerMinor,dwBuildNumber);
SetDlgItemText(hwnd,IDC_VERSION,szVersion);
if (hFontTitle == NULL) {
if (NULL == (hFontTitle = (HFONT)SendDlgItemMessage(hwnd,IDC_VERSION,WM_GETFONT,0,0)))
hFontTitle = GetStockObject(DEFAULT_GUI_FONT);
GetObject(hFontTitle,sizeof(LOGFONT),&lf);
lf.lfWeight = FW_BOLD;
hFontTitle = CreateFontIndirect(&lf);
}
hover_email = FALSE;
capture_email = FALSE;
hover_webpage = FALSE;
capture_webpage = FALSE;
// Font setup
if (NULL == (hFontHover = (HFONT)SendDlgItemMessage(hwnd,IDC_EMAIL,WM_GETFONT,0,0)))
hFontHover = GetStockObject(DEFAULT_GUI_FONT);
GetObject(hFontHover,sizeof(LOGFONT),&lf);
lf.lfUnderline = TRUE;
hFontNormal = CreateFontIndirect(&lf);
// Cursor setup
hCursorNormal = LoadCursor(NULL,MAKEINTRESOURCE(IDC_ARROW));
if (!(hCursorHover = LoadCursor(NULL,MAKEINTRESOURCE(IDC_HAND))))
hCursorHover = LoadCursor(g_hInstance,MAKEINTRESOURCE(IDC_HOVER));
CenterDlgInParent(hwnd);
}
return TRUE;
case WM_NCACTIVATE:
if (!(BOOL)wParam) { // we're not active, clear hover states
hover_email = FALSE;
capture_email = FALSE;
hover_webpage = FALSE;
capture_webpage = FALSE;
InvalidateRect(GetDlgItem(hwnd,IDC_EMAIL),NULL,FALSE);
InvalidateRect(GetDlgItem(hwnd,IDC_WEBPAGE),NULL,FALSE);
}
return FALSE;
case WM_CTLCOLORSTATIC:
{
DWORD dwId = GetWindowLong((HWND)lParam,GWL_ID);
HDC hdc = (HDC)wParam;
if (dwId == IDC_VERSION) {
SetBkMode(hdc,TRANSPARENT);
SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
SelectObject(hdc,hFontTitle);
return(LONG)GetSysColorBrush(COLOR_BTNFACE);
}
if (dwId == IDC_EMAIL || dwId == IDC_WEBPAGE) {
SetBkMode(hdc,TRANSPARENT);
if (GetSysColorBrush(26/*COLOR_HOTLIGHT*/))
SetTextColor(hdc,GetSysColor(26/*COLOR_HOTLIGHT*/));
else
SetTextColor(hdc,RGB(0,0,255));
if (dwId == IDC_EMAIL)
SelectObject(hdc,hover_email?hFontHover:hFontNormal);
else
SelectObject(hdc,hover_webpage?hFontHover:hFontNormal);
return(LONG)GetSysColorBrush(COLOR_BTNFACE);
}
}
break;
case WM_MOUSEMOVE:
{
POINT pt = { LOWORD(lParam), HIWORD(lParam) };
HWND hwndHover = ChildWindowFromPoint(hwnd,pt);
DWORD dwId = GetWindowLong(hwndHover,GWL_ID);
if (GetActiveWindow() == hwnd) {
if (wParam & MK_LBUTTON && !capture_email && !capture_webpage) {
;
}
else if (hover_email != (dwId == IDC_EMAIL) && !capture_webpage) {
hover_email = !hover_email;
InvalidateRect(GetDlgItem(hwnd,IDC_EMAIL),NULL,FALSE);
}
else if (hover_webpage != (dwId == IDC_WEBPAGE) && !capture_email) {
hover_webpage = !hover_webpage;
InvalidateRect(GetDlgItem(hwnd,IDC_WEBPAGE),NULL,FALSE);
}
SetCursor((hover_email || hover_webpage)?hCursorHover:hCursorNormal);
}
}
break;
case WM_LBUTTONDOWN:
{
POINT pt = { LOWORD(lParam), HIWORD(lParam) };
HWND hwndHover = ChildWindowFromPoint(hwnd,pt);
DWORD dwId = GetWindowLong(hwndHover,GWL_ID);
if (dwId == IDC_EMAIL) {
GetCapture();
hover_email = TRUE;
capture_email = TRUE;
InvalidateRect(GetDlgItem(hwnd,IDC_EMAIL),NULL,FALSE);
}
else if (dwId == IDC_WEBPAGE) {
GetCapture();
hover_webpage = TRUE;
capture_webpage = TRUE;
InvalidateRect(GetDlgItem(hwnd,IDC_WEBPAGE),NULL,FALSE);
}
SetCursor((hover_email || hover_webpage)?hCursorHover:hCursorNormal);
}
break;
case WM_LBUTTONUP:
{
POINT pt = { LOWORD(lParam), HIWORD(lParam) };
HWND hwndHover = ChildWindowFromPoint(hwnd,pt);
DWORD dwId = GetWindowLong(hwndHover,GWL_ID);
if (capture_email || capture_webpage) {
ReleaseCapture();
if (dwId == IDC_EMAIL && capture_email) {
ShellExecute(hwnd,"open","mailto:florian.balmer@gmail.com",NULL,NULL,SW_SHOWNORMAL);
}
else if (dwId == IDC_WEBPAGE && capture_webpage) {
ShellExecute(hwnd,"open","http://www.flos-freeware.ch",NULL,NULL,SW_SHOWNORMAL);
}
capture_email = FALSE;
capture_webpage = FALSE;
}
SetCursor((hover_email || hover_webpage)?hCursorHover:hCursorNormal);
}
break;
case WM_CANCELMODE:
if (capture_email || capture_webpage) {
ReleaseCapture();
hover_email = FALSE;
capture_email = FALSE;
hover_webpage = FALSE;
capture_webpage = FALSE;
SetCursor(hCursorNormal);
}
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
case IDCANCEL:
EndDialog(hwnd,IDOK);
break;
}
return TRUE;
}
return FALSE;
}
//=============================================================================
//
// RunDlgProc()
//
BOOL CALLBACK RunDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
{
switch(umsg)
{
case WM_INITDIALOG:
{
MakeBitmapButton(hwnd,IDC_SEARCHEXE,g_hInstance,IDB_OPEN);
SendDlgItemMessage(hwnd,IDC_COMMANDLINE,EM_LIMITTEXT,MAX_PATH - 1,0);
SetDlgItemText(hwnd,IDC_COMMANDLINE,(LPCSTR)lParam);
SHAutoComplete(GetDlgItem(hwnd,IDC_COMMANDLINE),SHACF_FILESYSTEM);
CenterDlgInParent(hwnd);
}
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_SEARCHEXE:
{
char szArgs[MAX_PATH];
char szArg2[MAX_PATH];
char szFile[MAX_PATH * 2];
char szFilter[256];
OPENFILENAME ofn;
ZeroMemory(&ofn,sizeof(OPENFILENAME));
GetDlgItemText(hwnd,IDC_COMMANDLINE,szArgs,COUNTOF(szArgs));
ExpandEnvironmentStringsEx(szArgs,COUNTOF(szArgs));
ExtractFirstArgument(szArgs,szFile,szArg2);
GetString(IDS_FILTER_EXE,szFilter,COUNTOF(szFilter));
PrepareFilterStr(szFilter);
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.lpstrFilter = szFilter;
ofn.lpstrFile = szFile;
ofn.nMaxFile = COUNTOF(szFile);
ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_NOCHANGEDIR | /*OFN_DONTADDTORECENT*/0x02000000
| OFN_PATHMUSTEXIST | OFN_SHAREAWARE | OFN_NODEREFERENCELINKS;
if (GetOpenFileName(&ofn)) {
PathQuoteSpaces(szFile);
if (lstrlen(szArg2))
{
lstrcat(szFile," ");
lstrcat(szFile,szArg2);
}
SetDlgItemText(hwnd,IDC_COMMANDLINE,szFile);
}
PostMessage(hwnd,WM_NEXTDLGCTL,1,0);
}
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -