📄 dialogs.c
字号:
InvalidateRect(GetDlgItem(hwnd,IDC_FAVORITESDIR),NULL,TRUE);
GetWindowRect(GetDlgItem(hwnd,IDC_GETFAVORITESDIR),&rc);
MapWindowPoints(NULL,hwnd,(LPPOINT)&rc,2);
SetWindowPos(GetDlgItem(hwnd,IDC_GETFAVORITESDIR),NULL,rc.left,rc.top+dyClient,0,0,SWP_NOZORDER|SWP_NOSIZE);
InvalidateRect(GetDlgItem(hwnd,IDC_GETFAVORITESDIR),NULL,TRUE);
GetWindowRect(GetDlgItem(hwnd,IDC_FAVORITESDESCR),&rc);
MapWindowPoints(NULL,hwnd,(LPPOINT)&rc,2);
SetWindowPos(GetDlgItem(hwnd,IDC_FAVORITESDESCR),NULL,rc.left,rc.top+dyClient,0,0,SWP_NOZORDER|SWP_NOSIZE);
InvalidateRect(GetDlgItem(hwnd,IDC_FAVORITESDESCR),NULL,TRUE);
}
return TRUE;
case WM_GETMINMAXINFO:
{
LPMINMAXINFO lpmmi = (LPMINMAXINFO)lParam;
lpmmi->ptMinTrackSize.x = mmiPtMinX;
lpmmi->ptMinTrackSize.y = mmiPtMaxY;
//lpmmi->ptMaxTrackSize.y = mmiPtMaxY;
}
return TRUE;
case WM_NOTIFY:
{
LPNMHDR pnmh = (LPNMHDR)lParam;
if (pnmh->idFrom == IDC_FAVORITESDIR)
{
switch(pnmh->code)
{
case LVN_GETDISPINFO:
DirList_GetDispInfo(GetDlgItem(hwnd,IDC_OPENWITHDIR),lParam,flagNoFadeHidden);
break;
case LVN_DELETEITEM:
DirList_DeleteItem(GetDlgItem(hwnd,IDC_FAVORITESDIR),lParam);
break;
case LVN_ITEMCHANGED: {
NM_LISTVIEW *pnmlv = (NM_LISTVIEW*)lParam;
EnableWindow(GetDlgItem(hwnd,IDOK),(pnmlv->uNewState & LVIS_SELECTED));
}
break;
case NM_DBLCLK:
if (ListView_GetSelectedCount(GetDlgItem(hwnd,IDC_FAVORITESDIR)))
SendMessage(hwnd,WM_COMMAND,MAKELONG(IDOK,1),0);
break;
}
}
}
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_GETFAVORITESDIR:
{
if (GetDirectory(hwnd,IDS_FAVORITES,tchFavoritesDir,tchFavoritesDir,TRUE))
{
lstrcpy(tchFavoritesDirBuf,tchFavoritesDir);
DirList_Fill(GetDlgItem(hwnd,IDC_FAVORITESDIR),tchFavoritesDir,DL_ALLOBJECTS,NULL,FALSE,flagNoFadeHidden,DS_NAME,FALSE);
DirList_StartIconThread(GetDlgItem(hwnd,IDC_FAVORITESDIR));
ListView_EnsureVisible(GetDlgItem(hwnd,IDC_FAVORITESDIR),0,FALSE);
ListView_SetItemState(GetDlgItem(hwnd,IDC_FAVORITESDIR),0,LVIS_FOCUSED,LVIS_FOCUSED);
}
PostMessage(hwnd,WM_NEXTDLGCTL,(WPARAM)(GetDlgItem(hwnd,IDC_FAVORITESDIR)),1);
}
break;
case IDOK: {
LPDLITEM lpdli = (LPDLITEM)GetWindowLong(hwnd,DWL_USER);
lpdli->mask = DLI_FILENAME | DLI_TYPE;
lpdli->ntype = DLE_NONE;
DirList_GetItem(GetDlgItem(hwnd,IDC_FAVORITESDIR),(-1),lpdli);
if (lpdli->ntype != DLE_NONE)
EndDialog(hwnd,IDOK);
else
MessageBeep(0);
}
break;
case IDCANCEL:
EndDialog(hwnd,IDCANCEL);
break;
}
return TRUE;
}
return FALSE;
}
//=============================================================================
//
// FavoritesDlg()
//
BOOL FavoritesDlg(HWND hwnd,LPSTR lpstrFile)
{
DLITEM dliFavorite;
dliFavorite.mask = DLI_FILENAME;
if (IDOK == DialogBoxParam(g_hInstance,MAKEINTRESOURCE(IDD_FAVORITES),
hwnd,FavoritesDlgProc,(LPARAM)&dliFavorite))
{
lstrcpyn(lpstrFile,dliFavorite.szFileName,MAX_PATH);
return(TRUE);
}
return(FALSE);
}
//=============================================================================
//
// AddToFavDlgProc()
//
// Controls: 100 Edit
//
BOOL CALLBACK AddToFavDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
{
switch(umsg)
{
char *pszName;
case WM_INITDIALOG:
pszName = (LPSTR)lParam;
SetWindowLong(hwnd,DWL_USER,(LONG)pszName);
SendDlgItemMessage(hwnd,100,EM_LIMITTEXT,MAX_PATH-1,0);
SetDlgItemText(hwnd,100,pszName);
CenterDlgInParent(hwnd);
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case 100:
EnableWindow(GetDlgItem(hwnd,IDOK),
GetWindowTextLength(GetDlgItem(hwnd,100)));
break;
case IDOK:
pszName = (LPSTR)GetWindowLong(hwnd,DWL_USER);
GetDlgItemText(hwnd,100,pszName,
MAX_PATH-1);
EndDialog(hwnd,IDOK);
break;
case IDCANCEL:
EndDialog(hwnd,IDCANCEL);
break;
}
return TRUE;
}
return FALSE;
}
//=============================================================================
//
// AddToFavDlg()
//
BOOL AddToFavDlg(HWND hwnd,LPCSTR lpszName,LPCSTR lpszTarget)
{
int iResult;
char pszName[MAX_PATH];
lstrcpy(pszName,lpszName);
iResult = DialogBoxParam(
g_hInstance,
MAKEINTRESOURCE(IDD_ADDTOFAV),
hwnd,
AddToFavDlgProc,(LPARAM)pszName);
if (iResult == IDOK)
{
if (!PathCreateFavLnk(pszName,lpszTarget,tchFavoritesDir)) {
MsgBox(MBWARN,IDS_FAV_FAILURE);
return FALSE;
}
else {
MsgBox(MBINFO,IDS_FAV_SUCCESS);
return TRUE;
}
}
else
return FALSE;
}
//=============================================================================
//
// FileMRUDlgProc()
//
//
extern LPMRULIST pFileMRU;
extern BOOL bSaveRecentFiles;
extern int cxFileMRUDlg;
extern int cyFileMRUDlg;
extern int flagNoFadeHidden;
typedef struct tagIconThreadInfo
{
HWND hwnd; // HWND of ListView Control
HANDLE hExitThread; // Flag is set when Icon Thread should terminate
HANDLE hTerminatedThread; // Flag is set when Icon Thread has terminated
} ICONTHREADINFO, *LPICONTHREADINFO;
DWORD WINAPI FileMRUIconThread(LPVOID lpParam) {
HWND hwnd;
LPICONTHREADINFO lpit;
LV_ITEM lvi;
char tch[MAX_PATH];
SHFILEINFO shfi;
DWORD dwFlags = SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_ATTRIBUTES | SHGFI_ATTR_SPECIFIED;
DWORD dwAttr = 0;
int iItem = 0;
int iMaxItem;
lpit = (LPICONTHREADINFO)lpParam;
ResetEvent(lpit->hTerminatedThread);
hwnd = lpit->hwnd;
iMaxItem = ListView_GetItemCount(hwnd);
CoInitialize(NULL);
ZeroMemory(&lvi,sizeof(LV_ITEM));
while (iItem < iMaxItem && WaitForSingleObject(lpit->hExitThread,0) != WAIT_OBJECT_0) {
lvi.mask = LVIF_TEXT;
lvi.pszText = tch;
lvi.cchTextMax = COUNTOF(tch);
lvi.iItem = iItem;
if (ListView_GetItem(hwnd,&lvi)) {
if (!PathFileExists(tch)) {
dwFlags |= SHGFI_USEFILEATTRIBUTES;
dwAttr = FILE_ATTRIBUTE_NORMAL;
shfi.dwAttributes = 0;
SHGetFileInfo(PathFindFileName(tch),dwAttr,&shfi,sizeof(SHFILEINFO),dwFlags);
}
else {
shfi.dwAttributes = SFGAO_LINK | SFGAO_SHARE;
SHGetFileInfo(tch,dwAttr,&shfi,sizeof(SHFILEINFO),dwFlags);
}
lvi.mask = LVIF_IMAGE;
lvi.iImage = shfi.iIcon;
lvi.stateMask = 0;
lvi.state = 0;
if (shfi.dwAttributes & SFGAO_LINK) {
lvi.mask |= LVIF_STATE;
lvi.stateMask |= LVIS_OVERLAYMASK;
lvi.state |= INDEXTOOVERLAYMASK(2);
}
if (shfi.dwAttributes & SFGAO_SHARE) {
lvi.mask |= LVIF_STATE;
lvi.stateMask |= LVIS_OVERLAYMASK;
lvi.state |= INDEXTOOVERLAYMASK(1);
}
dwAttr = GetFileAttributes(tch);
if (!flagNoFadeHidden &&
dwAttr != INVALID_FILE_ATTRIBUTES &&
dwAttr & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)) {
lvi.mask |= LVIF_STATE;
lvi.stateMask |= LVIS_CUT;
lvi.state |= LVIS_CUT;
}
lvi.iSubItem = 0;
ListView_SetItem(hwnd,&lvi);
}
iItem++;
}
CoUninitialize();
SetEvent(lpit->hTerminatedThread);
ExitThread(0);
return(0);
}
BOOL CALLBACK FileMRUDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam)
{
static int cxClient;
static int cyClient;
static int mmiPtMaxY;
static int mmiPtMinX;
switch(umsg)
{
case WM_INITDIALOG:
{
RECT rc;
char tch[MAX_PATH];
int cGrip;
SHFILEINFO shfi;
LVCOLUMN lvc = { LVCF_FMT|LVCF_TEXT, LVCFMT_LEFT, 0, "", -1, 0, 0, 0 };
LPICONTHREADINFO lpit = (LPVOID)GlobalAlloc(GPTR,sizeof(ICONTHREADINFO));
SetProp(hwnd,"it",(HANDLE)lpit);
lpit->hwnd = GetDlgItem(hwnd,IDC_FILEMRU);
lpit->hExitThread = CreateEvent(NULL,TRUE,FALSE,NULL);
lpit->hTerminatedThread = CreateEvent(NULL,TRUE,TRUE,NULL);
SetWindowLong(hwnd,DWL_USER,lParam);
GetClientRect(hwnd,&rc);
cxClient = rc.right - rc.left;
cyClient = rc.bottom - rc.top;
GetWindowRect(hwnd,&rc);
mmiPtMaxY = rc.bottom-rc.top;
mmiPtMinX = rc.right-rc.left;
if (cxFileMRUDlg < (rc.right-rc.left))
cxFileMRUDlg = rc.right-rc.left;
if (cyFileMRUDlg < (rc.bottom-rc.top))
cyFileMRUDlg = rc.bottom-rc.top;
SetWindowPos(hwnd,NULL,0,0,cxFileMRUDlg,cyFileMRUDlg,SWP_NOZORDER|SWP_NOMOVE);
SetWindowLong(hwnd,GWL_STYLE,GetWindowLong(hwnd,GWL_STYLE)|WS_THICKFRAME);
SetWindowPos(hwnd,NULL,0,0,0,0,SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED);
GetMenuString(GetSystemMenu(GetParent(hwnd),FALSE),SC_SIZE,tch,COUNTOF(tch),MF_BYCOMMAND);
InsertMenu(GetSystemMenu(hwnd,FALSE),SC_CLOSE,MF_BYCOMMAND|MF_STRING|MF_ENABLED,SC_SIZE,tch);
InsertMenu(GetSystemMenu(hwnd,FALSE),SC_CLOSE,MF_BYCOMMAND|MF_SEPARATOR,0,NULL);
SetWindowLong(GetDlgItem(hwnd,IDC_RESIZEGRIP),GWL_STYLE,
GetWindowLong(GetDlgItem(hwnd,IDC_RESIZEGRIP),GWL_STYLE)|SBS_SIZEGRIP|WS_CLIPSIBLINGS);
cGrip = GetSystemMetrics(SM_CXHTHUMB);
SetWindowPos(GetDlgItem(hwnd,IDC_RESIZEGRIP),NULL,cxClient-cGrip,
cyClient-cGrip,cGrip,cGrip,SWP_NOZORDER);
ListView_SetImageList(GetDlgItem(hwnd,IDC_FILEMRU),
(HIMAGELIST)SHGetFileInfo("C:\\",0,&shfi,sizeof(SHFILEINFO),SHGFI_SMALLICON | SHGFI_SYSICONINDEX),
LVSIL_SMALL);
ListView_SetImageList(GetDlgItem(hwnd,IDC_FILEMRU),
(HIMAGELIST)SHGetFileInfo("C:\\",0,&shfi,sizeof(SHFILEINFO),SHGFI_LARGEICON | SHGFI_SYSICONINDEX),
LVSIL_NORMAL);
ListView_SetExtendedListViewStyle(GetDlgItem(hwnd,IDC_FILEMRU),/*LVS_EX_FULLROWSELECT|*//*LVS_EX_DOUBLEBUFFER*/0x00010000|LVS_EX_LABELTIP);
ListView_InsertColumn(GetDlgItem(hwnd,IDC_FILEMRU),0,&lvc);
// Update view
SendMessage(hwnd,WM_COMMAND,MAKELONG(0x00A0,1),0);
if (bSaveRecentFiles)
CheckDlgButton(hwnd,IDC_SAVEMRU,BST_CHECKED);
CenterDlgInParent(hwnd);
}
return TRUE;
case WM_DESTROY:
{
RECT rc;
LPICONTHREADINFO lpit = (LPVOID)GetProp(hwnd,"it");
SetEvent(lpit->hExitThread);
while (WaitForSingleObject(lpit->hTerminatedThread,0) != WAIT_OBJECT_0) {
MSG msg;
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
CloseHandle(lpit->hExitThread);
CloseHandle(lpit->hTerminatedThread);
RemoveProp(hwnd,"it");
GlobalFree(lpit);
GetWindowRect(hwnd,&rc);
cxFileMRUDlg = rc.right-rc.left;
cyFileMRUDlg = rc.bottom-rc.top;
bSaveRecentFiles = (IsDlgButtonChecked(hwnd,IDC_SAVEMRU)) ? 1 : 0;
}
return FALSE;
case WM_SIZE:
{
RECT rc;
int dxClient = LOWORD(lParam) - cxClient;
int dyClient = HIWORD(lParam) - cyClient;
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
GetWindowRect(GetDlgItem(hwnd,IDC_RESIZEGRIP),&rc);
MapWindowPoints(NULL,hwnd,(LPPOINT)&rc,2);
SetWindowPos(GetDlgItem(hwnd,IDC_RESIZEGRIP),NULL,rc.left+dxClient,rc.top+dyClient,0,0,SWP_NOZORDER|SWP_NOSIZE);
InvalidateRect(GetDlgItem(hwnd,IDC_RESIZEGRIP),NULL,TRUE);
GetWindowRect(GetDlgItem(hwnd,IDOK),&rc);
MapWindowPoints(NULL,hwnd,(LPPOINT)&rc,2);
SetWindowPos(GetDlgItem(hwnd,IDOK),NULL,rc.left+dxClient,rc.top+dyClient,0,0,SWP_NOZORDER|SWP_NOSIZE);
InvalidateRect(GetDlgItem(hwnd,IDOK),NULL,TRUE);
GetWindowRect(GetDlgItem(hwnd,IDCANCEL),&rc);
MapWindowPoints(NULL,hwnd,(LPPOINT)&rc,2);
SetWindowPos(GetDlgItem(hwnd,IDCANCEL),NULL,rc.left+dxClient,rc.top+dyClient,0,0,SWP_NOZORDER|SWP_NOSIZE);
InvalidateRect(GetDlgItem(hwnd,IDCANCEL),NULL,TRUE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -