mainwnd.c
来自「winNT技术操作系统,国外开放的原代码和LIUX一样」· C语言 代码 · 共 1,068 行 · 第 1/3 页
C
1,068 行
/*
* PROJECT: ReactOS Services
* LICENSE: GPL - See COPYING in the top level directory
* FILE: base/system/servman/mainwnd.c
* PURPOSE: Main window message handler
* COPYRIGHT: Copyright 2005 - 2006 Ged Murphy <gedmurphy@gmail.com>
*
*/
#include "precomp.h"
static const TCHAR szMainWndClass[] = TEXT("ServManWndClass");
BOOL bSortAscending = TRUE;
/* Toolbar buttons */
TBBUTTON Buttons [NUM_BUTTONS] =
{ /* iBitmap, idCommand, fsState, fsStyle, bReserved[2], dwData, iString */
{TBICON_PROP, ID_PROP, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0}, /* properties */
{TBICON_REFRESH, ID_REFRESH, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, /* refresh */
{TBICON_EXPORT, ID_EXPORT, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, /* export */
/* Note: First item for a seperator is its width in pixels */
{15, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, /* separator */
{TBICON_CREATE, ID_CREATE, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* create */
{TBICON_DELETE, ID_DELETE, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 }, /* delete */
{15, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, /* separator */
{TBICON_START, ID_START, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 }, /* start */
{TBICON_STOP, ID_STOP, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 }, /* stop */
{TBICON_PAUSE, ID_PAUSE, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 }, /* pause */
{TBICON_RESTART, ID_RESTART, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 }, /* restart */
{15, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, /* separator */
{TBICON_HELP, ID_HELP, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* help */
{TBICON_EXIT, ID_EXIT, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* exit */
};
/* menu hints */
static const MENU_HINT MainMenuHintTable[] = {
/* File Menu */
{ID_EXPORT, IDS_HINT_EXPORT},
{ID_EXIT, IDS_HINT_EXIT},
/* Action Menu */
{ID_CONNECT, IDS_HINT_CONNECT},
{ID_START, IDS_HINT_START},
{ID_STOP, IDS_HINT_STOP},
{ID_PAUSE, IDS_HINT_PAUSE},
{ID_RESUME, IDS_HINT_RESUME},
{ID_RESTART, IDS_HINT_RESTART},
{ID_REFRESH, IDS_HINT_REFRESH},
{ID_EDIT, IDS_HINT_EDIT},
{ID_CREATE, IDS_HINT_CREATE},
{ID_DELETE, IDS_HINT_DELETE},
{ID_PROP, IDS_HINT_PROP},
/* View menu */
{ID_VIEW_LARGE, IDS_HINT_LARGE},
{ID_VIEW_SMALL, IDS_HINT_SMALL},
{ID_VIEW_LIST, IDS_HINT_LIST},
{ID_VIEW_DETAILS, IDS_HINT_DETAILS},
{ID_VIEW_CUST, IDS_HINT_CUST},
/* Help Menu */
{ID_HELP, IDS_HINT_HELP},
{ID_ABOUT, IDS_HINT_ABOUT}
};
/* system menu hints */
static const MENU_HINT SystemMenuHintTable[] = {
{SC_RESTORE, IDS_HINT_SYS_RESTORE},
{SC_MOVE, IDS_HINT_SYS_MOVE},
{SC_SIZE, IDS_HINT_SYS_SIZE},
{SC_MINIMIZE, IDS_HINT_SYS_MINIMIZE},
{SC_MAXIMIZE, IDS_HINT_SYS_MAXIMIZE},
{SC_CLOSE, IDS_HINT_SYS_CLOSE},
};
static BOOL
MainWndMenuHint(PMAIN_WND_INFO Info,
WORD CmdId,
const MENU_HINT *HintArray,
DWORD HintsCount,
UINT DefHintId)
{
BOOL Found = FALSE;
const MENU_HINT *LastHint;
UINT HintId = DefHintId;
LastHint = HintArray + HintsCount;
while (HintArray != LastHint)
{
if (HintArray->CmdId == CmdId)
{
HintId = HintArray->HintId;
Found = TRUE;
break;
}
HintArray++;
}
StatusBarLoadString(Info->hStatus,
SB_SIMPLEID,
hInstance,
HintId);
return Found;
}
static VOID
UpdateMainStatusBar(PMAIN_WND_INFO Info)
{
if (Info->hStatus != NULL)
{
SendMessage(Info->hStatus,
SB_SIMPLE,
(WPARAM)Info->InMenuLoop,
0);
}
}
static VOID
SetListViewStyle(HWND hListView,
DWORD View)
{
DWORD Style = GetWindowLong(hListView, GWL_STYLE);
if ((Style & LVS_TYPEMASK) != View)
{
SetWindowLong(hListView,
GWL_STYLE,
(Style & ~LVS_TYPEMASK) | View);
}
}
VOID SetMenuAndButtonStates(PMAIN_WND_INFO Info)
{
HMENU hMainMenu;
DWORD Flags, State;
/* get handle to menu */
hMainMenu = GetMenu(Info->hMainWnd);
/* set all to greyed */
EnableMenuItem(hMainMenu, ID_START, MF_GRAYED);
EnableMenuItem(hMainMenu, ID_STOP, MF_GRAYED);
EnableMenuItem(hMainMenu, ID_PAUSE, MF_GRAYED);
EnableMenuItem(hMainMenu, ID_RESUME, MF_GRAYED);
EnableMenuItem(hMainMenu, ID_RESTART, MF_GRAYED);
EnableMenuItem(Info->hShortcutMenu, ID_START, MF_GRAYED);
EnableMenuItem(Info->hShortcutMenu, ID_STOP, MF_GRAYED);
EnableMenuItem(Info->hShortcutMenu, ID_PAUSE, MF_GRAYED);
EnableMenuItem(Info->hShortcutMenu, ID_RESUME, MF_GRAYED);
EnableMenuItem(Info->hShortcutMenu, ID_RESTART, MF_GRAYED);
SendMessage(Info->hTool, TB_SETSTATE, ID_START,
(LPARAM)MAKELONG(TBSTATE_INDETERMINATE, 0));
SendMessage(Info->hTool, TB_SETSTATE, ID_STOP,
(LPARAM)MAKELONG(TBSTATE_INDETERMINATE, 0));
SendMessage(Info->hTool, TB_SETSTATE, ID_PAUSE,
(LPARAM)MAKELONG(TBSTATE_INDETERMINATE, 0));
SendMessage(Info->hTool, TB_SETSTATE, ID_RESTART,
(LPARAM)MAKELONG(TBSTATE_INDETERMINATE, 0));
if (Info->SelectedItem != NO_ITEM_SELECTED)
{
/* allow user to delete service */
SendMessage(Info->hTool, TB_SETSTATE, ID_DELETE,
(LPARAM)MAKELONG(TBSTATE_ENABLED, 0));
EnableMenuItem(hMainMenu, ID_DELETE, MF_ENABLED);
EnableMenuItem(Info->hShortcutMenu, ID_DELETE, MF_ENABLED);
Flags = Info->CurrentService->ServiceStatusProcess.dwControlsAccepted;
State = Info->CurrentService->ServiceStatusProcess.dwCurrentState;
if (State == SERVICE_STOPPED)
{
EnableMenuItem(hMainMenu, ID_START, MF_ENABLED);
EnableMenuItem(Info->hShortcutMenu, ID_START, MF_ENABLED);
SendMessage(Info->hTool, TB_SETSTATE, ID_START,
(LPARAM)MAKELONG(TBSTATE_ENABLED, 0));
}
if ( (Flags & SERVICE_ACCEPT_STOP) && (State == SERVICE_RUNNING) )
{
EnableMenuItem(hMainMenu, ID_STOP, MF_ENABLED);
EnableMenuItem(Info->hShortcutMenu, ID_STOP, MF_ENABLED);
SendMessage(Info->hTool, TB_SETSTATE, ID_STOP,
(LPARAM)MAKELONG(TBSTATE_ENABLED, 0));
}
if ( (Flags & SERVICE_ACCEPT_PAUSE_CONTINUE) && (State == SERVICE_RUNNING) )
{
EnableMenuItem(hMainMenu, ID_PAUSE, MF_ENABLED);
EnableMenuItem(Info->hShortcutMenu, ID_PAUSE, MF_ENABLED);
SendMessage(Info->hTool, TB_SETSTATE, ID_PAUSE,
(LPARAM)MAKELONG(TBSTATE_ENABLED, 0));
}
if ( (Flags & SERVICE_ACCEPT_STOP) && (State == SERVICE_RUNNING) )
{
EnableMenuItem(hMainMenu, ID_RESTART, MF_ENABLED);
EnableMenuItem(Info->hShortcutMenu, ID_RESTART, MF_ENABLED);
SendMessage(Info->hTool, TB_SETSTATE, ID_RESTART,
(LPARAM)MAKELONG(TBSTATE_ENABLED, 0));
}
}
else
{
/* disable tools which rely on a selected service */
EnableMenuItem(hMainMenu, ID_PROP, MF_GRAYED);
EnableMenuItem(hMainMenu, ID_DELETE, MF_GRAYED);
EnableMenuItem(Info->hShortcutMenu, ID_PROP, MF_GRAYED);
EnableMenuItem(Info->hShortcutMenu, ID_DELETE, MF_GRAYED);
SendMessage(Info->hTool, TB_SETSTATE, ID_PROP,
(LPARAM)MAKELONG(TBSTATE_INDETERMINATE, 0));
SendMessage(Info->hTool, TB_SETSTATE, ID_DELETE,
(LPARAM)MAKELONG(TBSTATE_INDETERMINATE, 0));
}
}
static INT CALLBACK
CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
ENUM_SERVICE_STATUS_PROCESS *Param1;
ENUM_SERVICE_STATUS_PROCESS *Param2;
// INT iSubItem = (LPARAM)lParamSort;
if (bSortAscending) {
Param1 = (ENUM_SERVICE_STATUS_PROCESS *)lParam1;
Param2 = (ENUM_SERVICE_STATUS_PROCESS *)lParam2;
}
else
{
Param1 = (ENUM_SERVICE_STATUS_PROCESS *)lParam2;
Param2 = (ENUM_SERVICE_STATUS_PROCESS *)lParam1;
}
return _tcsicmp(Param1->lpDisplayName, Param2->lpDisplayName);
}
static BOOL
CreateToolbar(PMAIN_WND_INFO Info)
{
INT NumButtons = sizeof(Buttons) / sizeof(Buttons[0]);
Info->hTool = CreateWindowEx(0,
TOOLBARCLASSNAME,
NULL,
WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS,
0, 0, 0, 0,
Info->hMainWnd,
0,
hInstance,
NULL);
if(Info->hTool != NULL)
{
HIMAGELIST hImageList;
SendMessage(Info->hTool,
TB_SETEXTENDEDSTYLE,
0,
TBSTYLE_EX_HIDECLIPPEDBUTTONS);
SendMessage(Info->hTool,
TB_BUTTONSTRUCTSIZE,
sizeof(Buttons[0]),
0);
hImageList = InitImageList(IDB_PROP,
IDB_EXIT,
16,
16);
if (hImageList == NULL)
return FALSE;
ImageList_Destroy((HIMAGELIST)SendMessage(Info->hTool,
TB_SETIMAGELIST,
0,
(LPARAM)hImageList));
SendMessage(Info->hTool,
TB_ADDBUTTONS,
NumButtons,
(LPARAM)Buttons);
return TRUE;
}
return FALSE;
}
static BOOL
CreateListView(PMAIN_WND_INFO Info)
{
LVCOLUMN lvc = { 0 };
TCHAR szTemp[256];
Info->hListView = CreateWindowEx(0,
WC_LISTVIEW,
NULL,
WS_CHILD | WS_VISIBLE | LVS_REPORT | WS_BORDER |
LBS_NOTIFY | LVS_SORTASCENDING | LBS_NOREDRAW,
0, 0, 0, 0,
Info->hMainWnd,
(HMENU) IDC_SERVLIST,
hInstance,
NULL);
if (Info->hListView == NULL)
{
MessageBox(Info->hMainWnd,
_T("Could not create List View."),
_T("Error"),
MB_OK | MB_ICONERROR);
return FALSE;
}
(void)ListView_SetExtendedListViewStyle(Info->hListView,
LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);/*LVS_EX_GRIDLINES |*/
lvc.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH | LVCF_FMT;
lvc.fmt = LVCFMT_LEFT;
/* Add columns to the list-view */
/* name */
lvc.iSubItem = 0;
lvc.cx = 150;
LoadString(hInstance,
IDS_FIRSTCOLUMN,
szTemp,
sizeof(szTemp) / sizeof(TCHAR));
lvc.pszText = szTemp;
(void)ListView_InsertColumn(Info->hListView,
0,
&lvc);
/* description */
lvc.iSubItem = 1;
lvc.cx = 240;
LoadString(hInstance,
IDS_SECONDCOLUMN,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?