📄 propsheet.c
字号:
TRACE("\n");
if (!psInfo) return;
/*
* Set the dirty flag of this page.
*/
for (i = 0; i < psInfo->nPages; i++)
{
if (psInfo->proppage[i].hwndPage == hwndDirtyPage)
psInfo->proppage[i].isDirty = TRUE;
}
/*
* Enable the Apply button.
*/
if (psInfo->hasApply)
{
HWND hwndApplyBtn = GetDlgItem(hwndDlg, IDC_APPLY_BUTTON);
EnableWindow(hwndApplyBtn, TRUE);
}
}
/******************************************************************************
* PROPSHEET_UnChanged
*/
static void PROPSHEET_UnChanged(HWND hwndDlg, HWND hwndCleanPage)
{
int i;
BOOL noPageDirty = TRUE;
HWND hwndApplyBtn = GetDlgItem(hwndDlg, IDC_APPLY_BUTTON);
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwndDlg,
PropSheetInfoStr);
TRACE("\n");
if ( !psInfo ) return;
for (i = 0; i < psInfo->nPages; i++)
{
/* set the specified page as clean */
if (psInfo->proppage[i].hwndPage == hwndCleanPage)
psInfo->proppage[i].isDirty = FALSE;
/* look to see if there's any dirty pages */
if (psInfo->proppage[i].isDirty)
noPageDirty = FALSE;
}
/*
* Disable Apply button.
*/
if (noPageDirty)
EnableWindow(hwndApplyBtn, FALSE);
}
/******************************************************************************
* PROPSHEET_PressButton
*/
static void PROPSHEET_PressButton(HWND hwndDlg, int buttonID)
{
TRACE("buttonID %d\n", buttonID);
switch (buttonID)
{
case PSBTN_APPLYNOW:
PROPSHEET_DoCommand(hwndDlg, IDC_APPLY_BUTTON);
break;
case PSBTN_BACK:
PROPSHEET_Back(hwndDlg);
break;
case PSBTN_CANCEL:
PROPSHEET_DoCommand(hwndDlg, IDCANCEL);
break;
case PSBTN_FINISH:
PROPSHEET_Finish(hwndDlg);
break;
case PSBTN_HELP:
PROPSHEET_DoCommand(hwndDlg, IDHELP);
break;
case PSBTN_NEXT:
PROPSHEET_Next(hwndDlg);
break;
case PSBTN_OK:
PROPSHEET_DoCommand(hwndDlg, IDOK);
break;
default:
FIXME("Invalid button index %d\n", buttonID);
}
}
/*************************************************************************
* BOOL PROPSHEET_CanSetCurSel [Internal]
*
* Test whether the current page can be changed by sending a PSN_KILLACTIVE
*
* PARAMS
* hwndDlg [I] handle to a Dialog hWnd
*
* RETURNS
* TRUE if Current Selection can change
*
* NOTES
*/
static BOOL PROPSHEET_CanSetCurSel(HWND hwndDlg)
{
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwndDlg,
PropSheetInfoStr);
HWND hwndPage;
PSHNOTIFY psn;
BOOL res = FALSE;
TRACE("active_page %d\n", psInfo->active_page);
if (!psInfo)
{
res = FALSE;
goto end;
}
if (psInfo->active_page < 0)
{
res = TRUE;
goto end;
}
/*
* Notify the current page.
*/
hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
psn.hdr.code = PSN_KILLACTIVE;
psn.hdr.hwndFrom = hwndDlg;
psn.hdr.idFrom = 0;
psn.lParam = 0;
res = !SendMessageW(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
end:
TRACE("<-- %d\n", res);
return res;
}
/******************************************************************************
* PROPSHEET_SetCurSel
*/
static BOOL PROPSHEET_SetCurSel(HWND hwndDlg,
int index,
int skipdir,
HPROPSHEETPAGE hpage
)
{
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwndDlg, PropSheetInfoStr);
HWND hwndHelp = GetDlgItem(hwndDlg, IDHELP);
HWND hwndTabControl = GetDlgItem(hwndDlg, IDC_TABCONTROL);
TRACE("index %d, skipdir %d, hpage %p\n", index, skipdir, hpage);
/* hpage takes precedence over index */
if (hpage != NULL)
index = PROPSHEET_GetPageIndex(hpage, psInfo);
if (index < 0 || index >= psInfo->nPages)
{
TRACE("Could not find page to select!\n");
return FALSE;
}
while (1) {
int result;
PSHNOTIFY psn;
RECT rc;
LPCPROPSHEETPAGEW ppshpage = (LPCPROPSHEETPAGEW)psInfo->proppage[index].hpage;
if (hwndTabControl)
SendMessageW(hwndTabControl, TCM_SETCURSEL, index, 0);
psn.hdr.code = PSN_SETACTIVE;
psn.hdr.hwndFrom = hwndDlg;
psn.hdr.idFrom = 0;
psn.lParam = 0;
if (!psInfo->proppage[index].hwndPage) {
PROPSHEET_CreatePage(hwndDlg, index, psInfo, ppshpage);
}
/* Resize the property sheet page to the fit in the Tab control
* (for regular property sheets) or to fit in the client area (for
* wizards).
* NOTE: The resizing happens every time the page is selected and
* not only when it's created (some applications depend on it). */
PROPSHEET_GetPageRect(psInfo, hwndDlg, &rc, ppshpage);
TRACE("setting page %p, rc (%d,%d)-(%d,%d) w=%d, h=%d\n",
psInfo->proppage[index].hwndPage, rc.left, rc.top, rc.right, rc.bottom,
rc.right - rc.left, rc.bottom - rc.top);
SetWindowPos(psInfo->proppage[index].hwndPage, HWND_TOP,
rc.left, rc.top,
rc.right - rc.left, rc.bottom - rc.top, 0);
result = SendMessageW(psInfo->proppage[index].hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
if (!result)
break;
if (result == -1) {
index+=skipdir;
if (index < 0) {
index = 0;
WARN("Tried to skip before first property sheet page!\n");
break;
}
if (index >= psInfo->nPages) {
WARN("Tried to skip after last property sheet page!\n");
index = psInfo->nPages-1;
break;
}
}
else if (result != 0)
{
int old_index = index;
index = PROPSHEET_FindPageByResId(psInfo, result);
if(index >= psInfo->nPages) {
index = old_index;
WARN("Tried to skip to nonexistant page by res id\n");
break;
}
continue;
}
}
/* Invalidate the header area */
if ( (psInfo->ppshheader.dwFlags & (PSH_WIZARD97_OLD | PSH_WIZARD97_NEW)) &&
(psInfo->ppshheader.dwFlags & PSH_HEADER) )
{
HWND hwndLineHeader = GetDlgItem(hwndDlg, IDC_SUNKEN_LINEHEADER);
RECT r;
GetClientRect(hwndLineHeader, &r);
MapWindowPoints(hwndLineHeader, hwndDlg, (LPPOINT) &r, 2);
SetRect(&r, 0, 0, r.right + 1, r.top - 1);
InvalidateRect(hwndDlg, &r, TRUE);
}
/*
* Display the new page.
*/
PROPSHEET_ShowPage(hwndDlg, index, psInfo);
if (psInfo->proppage[index].hasHelp)
EnableWindow(hwndHelp, TRUE);
else
EnableWindow(hwndHelp, FALSE);
return TRUE;
}
/******************************************************************************
* PROPSHEET_SetCurSelId
*
* Selects the page, specified by resource id.
*/
static void PROPSHEET_SetCurSelId(HWND hwndDlg, int id)
{
int idx;
PropSheetInfo* psInfo =
(PropSheetInfo*) GetPropW(hwndDlg, PropSheetInfoStr);
idx = PROPSHEET_FindPageByResId(psInfo, id);
if (idx < psInfo->nPages )
{
if (PROPSHEET_CanSetCurSel(hwndDlg) != FALSE)
PROPSHEET_SetCurSel(hwndDlg, idx, 1, 0);
}
}
/******************************************************************************
* PROPSHEET_SetTitleA
*/
static void PROPSHEET_SetTitleA(HWND hwndDlg, DWORD dwStyle, LPCSTR lpszText)
{
if(HIWORD(lpszText))
{
WCHAR szTitle[256];
MultiByteToWideChar(CP_ACP, 0, lpszText, -1,
szTitle, sizeof(szTitle)/sizeof(WCHAR));
PROPSHEET_SetTitleW(hwndDlg, dwStyle, szTitle);
}
else
{
PROPSHEET_SetTitleW(hwndDlg, dwStyle, (LPCWSTR)lpszText);
}
}
/******************************************************************************
* PROPSHEET_SetTitleW
*/
static void PROPSHEET_SetTitleW(HWND hwndDlg, DWORD dwStyle, LPCWSTR lpszText)
{
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwndDlg, PropSheetInfoStr);
WCHAR szTitle[256];
TRACE("'%s' (style %08x)\n", debugstr_w(lpszText), dwStyle);
if (HIWORD(lpszText) == 0) {
if (!LoadStringW(psInfo->ppshheader.hInstance,
LOWORD(lpszText), szTitle, sizeof(szTitle)-sizeof(WCHAR)))
return;
lpszText = szTitle;
}
if (dwStyle & PSH_PROPTITLE)
{
WCHAR* dest;
int lentitle = strlenW(lpszText);
int lenprop = strlenW(psInfo->strPropertiesFor);
dest = Alloc( (lentitle + lenprop + 1)*sizeof (WCHAR));
wsprintfW(dest, psInfo->strPropertiesFor, lpszText);
SetWindowTextW(hwndDlg, dest);
Free(dest);
}
else
SetWindowTextW(hwndDlg, lpszText);
}
/******************************************************************************
* PROPSHEET_SetFinishTextA
*/
static void PROPSHEET_SetFinishTextA(HWND hwndDlg, LPCSTR lpszText)
{
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwndDlg, PropSheetInfoStr);
HWND hwndButton = GetDlgItem(hwndDlg, IDC_FINISH_BUTTON);
TRACE("'%s'\n", lpszText);
/* Set text, show and enable the Finish button */
SetWindowTextA(hwndButton, lpszText);
ShowWindow(hwndButton, SW_SHOW);
EnableWindow(hwndButton, TRUE);
/* Make it default pushbutton */
SendMessageW(hwndDlg, DM_SETDEFID, IDC_FINISH_BUTTON, 0);
/* Hide Back button */
hwndButton = GetDlgItem(hwndDlg, IDC_BACK_BUTTON);
ShowWindow(hwndButton, SW_HIDE);
if (!psInfo->hasFinish)
{
/* Hide Next button */
hwndButton = GetDlgItem(hwndDlg, IDC_NEXT_BUTTON);
ShowWindow(hwndButton, SW_HIDE);
}
}
/******************************************************************************
* PROPSHEET_SetFinishTextW
*/
static void PROPSHEET_SetFinishTextW(HWND hwndDlg, LPCWSTR lpszText)
{
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwndDlg, PropSheetInfoStr);
HWND hwndButton = GetDlgItem(hwndDlg, IDC_FINISH_BUTTON);
TRACE("'%s'\n", debugstr_w(lpszText));
/* Set text, show and enable the Finish button */
SetWindowTextW(hwndButton, lpszText);
ShowWindow(hwndButton, SW_SHOW);
EnableWindow(hwndButton, TRUE);
/* Make it default pushbutton */
SendMessageW(hwndDlg, DM_SETDEFID, IDC_FINISH_BUTTON, 0);
/* Hide Back button */
hwndButton = GetDlgItem(hwndDlg, IDC_BACK_BUTTON);
ShowWindow(hwndButton, SW_HIDE);
if (!psInfo->hasFinish)
{
/* Hide Next button */
hwndButton = GetDlgItem(hwndDlg, IDC_NEXT_BUTTON);
ShowWindow(hwndButton, SW_HIDE);
}
}
/******************************************************************************
* PROPSHEET_QuerySiblings
*/
static LRESULT PROPSHEET_QuerySiblings(HWND hwndDlg,
WPARAM wParam, LPARAM lParam)
{
int i = 0;
HWND hwndPage;
LRESULT msgResult = 0;
PropSheetInfo* psInfo = (PropSheetInfo*) GetPropW(hwndDlg, PropSheetInfoStr);
while ((i < psInfo->nPages) && (msgResult == 0))
{
hwndPage = psInfo->proppage[i].hwndPage;
msgResult = SendMessageW(hwndPage, PSM_QUERYSIBLINGS, wParam, lParam);
i++;
}
return msgResult;
}
/******************************************************************************
* PROPSHEET_AddPage
*/
static BOOL PROPSHEET_AddPage(HWND hwndDlg,
HPROPSHEETPAGE hpage)
{
PropPageInfo * ppi;
PropSheetInfo * psInfo = (PropSheetInfo*) GetPropW(hwndDlg,
PropSheetInfoStr);
HWND hwndTabControl = GetDlgItem(hwndDlg, IDC_TABCONTROL);
TCITEMW item;
LPCPROPSHEETPAGEW ppsp = (LPCPROPSHEETPAGEW)hpage;
TRACE("hpage %p\n", hpage);
/*
* Allocate and fill in a new PropPageInfo entry.
*/
ppi = (PropPageInfo*) ReAlloc(psInfo->proppage,
sizeof(PropPageInfo) *
(psInfo->nPages + 1));
if (!ppi)
return FALSE;
psInfo->proppage = ppi;
if (!PROPSHEET_CollectPageInfo(ppsp, psInfo, psInfo->nPages))
return FALSE;
psInfo->proppage[psInfo->nPages].hpage = hpage;
if (ppsp->dwFlags & PSP_PREMATURE)
{
/* Create the page but don't show it */
PROPSHEET_CreatePage(hwndDlg, psInfo->nPages, psInfo, ppsp);
}
/*
* Add a new tab to the tab control.
*/
item.mask = TCIF_TEXT;
item.pszText = (LPWSTR) psInfo->proppage[psInfo->nPages].pszText;
item.cchTextMax = MAX_TABTEXT_LENGTH;
if (psInfo->hImageList)
{
SendMessageW(hwndTabControl, TCM_SETIMAGELIST, 0, (LPARAM)psInfo->hImageList);
}
if ( psInfo->proppage[psInfo->nPages].hasIcon )
{
item.mask |= TCIF_IMAGE;
item.iImage = psInfo->nPages;
}
SendMessageW(hwndTabControl, TCM_INSERTITEMW, psInfo->nPages + 1,
(LPARAM)&item);
psInfo->nPages++;
/* If it is the only page - show it */
if(psInfo->nPages == 1)
PROPSHEET_SetCurSel(hwndDlg, 0, 1, 0);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -