|
|
/*++
Copyright (c) 1990-1995 Microsoft Corporation
Module Name:
proppage.c
Abstract:
This module contains user page procs
Author:
18-Aug-1995 Fri 18:57:12 created -by- Daniel Chou (danielc)
[Environment:]
NT Windows - Common Printer Driver UI DLL.
[Notes:]
Revision History:
--*/
#include "precomp.h"
#pragma hdrstop
#define DBG_CPSUIFILENAME DbgPropPage
#define DBG_PROPPAGEPROC 0x00000001
#define DBG_INITP1 0x00000002
#define DBGITEM_INITP1 0x00000004
#define DBGITEM_UP1 0x00000008
#define DBG_HMII 0x00000010
#define DBG_AII 0x00000020
#define DBG_QSORT 0x00000040
#define DBG_SETFOCUS 0x00000080
#define DBG_STATES 0x00000100
#define DBG_ADVPUSH 0x00000200
DEFINE_DBGVAR(0);
extern HINSTANCE hInstDLL; extern STDPAGEINFO StdPageInfo[]; extern BYTE StdTVOT[];
#define MAX_ITEM_CTRLS 12
const BYTE cTVOTCtrls[] = { 8, 10, 9, 9, 9, 6, 6, 8, 6, 6, 0 };
#define IIF_3STATES_1 OTINTF_STATES_1
#define IIF_3STATES_2 OTINTF_STATES_2
#define IIF_3STATES_3 OTINTF_STATES_3
#define IIF_3STATES_HIDE OTINTF_STATES_HIDE_MASK
#define IIF_STDPAGE_3STATES OTINTF_STDPAGE_3STATES
#define IIF_ITEM_HIDE 0x10
#define IIF_EXT_HIDE 0x20
typedef struct _ITEMINFO { POPTITEM pItem; BYTE Flags; BYTE Type; WORD BegCtrlID; WORD CtrlBits; SHORT xExtMove; WORD yExt; WORD yMoveUp; WORD Extra; RECT rc; RECT rcCtrls; } ITEMINFO, *PITEMINFO;
typedef struct _ITEMINFOHEADER { HWND hDlg; PTVWND pTVWnd; WORD cItem; WORD cMaxItem; ITEMINFO ItemInfo[1]; } ITEMINFOHEADER, *PITEMINFOHEADER;
#define OUTRANGE_LEFT 0x7FFFFFFFL
#define INIT_ADDRECT(rc) ((rc).left = OUTRANGE_LEFT)
#define HAS_ADDRECT(rc) ((rc).left != OUTRANGE_LEFT)
typedef struct _HSINFO { HWND hCtrl; LONG x; LONG y; } HSINFO, *PHSINFO;
INT __cdecl ItemInfoCompare( const void *pItemInfo1, const void *pItemInfo2 ) { return((INT)(((PITEMINFO)pItemInfo1)->rc.top) - (INT)(((PITEMINFO)pItemInfo2)->rc.top)); }
UINT AddRect( RECT *prc1, RECT *prc2 )
/*++
Routine Description:
This function add the *prc1 to *prc2, if any of the prc1 corners are outside of prc2
Arguments:
Return Value:
UINT, count of *prc1 corners which is at outside of *prc2 corners, other word is the *prc2 corners which added to the *prc2 corner that is.
Author:
16-Sep-1995 Sat 23:06:53 created -by- Daniel Chou (danielc)
Revision History:
--*/
{ UINT cAdded = 0;
if (prc2->left == OUTRANGE_LEFT) {
*prc2 = *prc1; return(0);
} else {
CPSUIASSERT(0, "AddRect: invalid rc.left=%d", (prc2->left >= 0) && (prc2->top >= 0) && (prc2->right >= prc2->left) && (prc2->bottom >= prc2->top), LongToPtr(prc2->left)); }
if (prc2->left > prc1->left) {
prc2->left = prc1->left; ++cAdded; }
if (prc2->top > prc1->top) {
prc2->top = prc1->top; ++cAdded; }
if (prc2->right < prc1->right) {
prc2->right = prc1->right; ++cAdded; }
if (prc2->bottom < prc1->bottom) {
prc2->bottom = prc1->bottom; ++cAdded; }
return(cAdded); }
UINT HideStates( HWND hDlg, PITEMINFO pII, RECT *prcVisibleNoStates )
/*++
Routine Description:
Arguments:
Return Value:
Author:
22-Aug-1995 Tue 16:58:37 created -by- Daniel Chou (danielc)
Revision History:
--*/
{ PHSINFO pHSInfo; HSINFO HSInfo[6]; UINT HideBits; UINT Mask; UINT CtrlID = (UINT)(pII->BegCtrlID + 2); RECT rcStates; RECT rcMax[3]; UINT yRemoved = 0; SIZEL szlHide; SIZEL szlSpace; INT cStates; INT cHide; INT i; INT j; BOOL DoXDir;
szlSpace.cx = szlSpace.cy = szlHide.cx = szlHide.cy = 0; cStates = (UINT)((pII->Type == TVOT_2STATES) ? 2 : 3); HideBits = (UINT)(pII->Flags & IIF_3STATES_HIDE);
CPSUIDBG(DBG_STATES, ("\ncStates=%ld, HideBits=%02lx", cStates, HideBits));
INIT_ADDRECT(rcStates);
for (i = 0, cHide = 0, Mask = HideBits, pHSInfo = HSInfo; i < cStates; i++, Mask >>= 1) {
INIT_ADDRECT(rcMax[i]);
for (j = 0; j < 2; j++, pHSInfo++) {
RECT rc;
if (pHSInfo->hCtrl = CtrlIDrcWnd(hDlg, CtrlID++, &rc)) {
CPSUIDBG(DBG_STATES, ("MoveStates: States=(%d:%d), ID=%d, Hide=%d", i, j, CtrlID - 1, (Mask & 0x01) ? 1 : 0));
if (Mask & 0x01) {
CPSUIDBG(DBG_STATES, ("Hide the State %d", i)); }
pHSInfo->x = rc.left; pHSInfo->y = rc.top;
AddRect(&rc, &rcMax[i]);
CPSUIDBG(DBG_STATES, ("i=%ld, j=%ld, rc=(%ld, %ld)-(%ld, %ld)=%ldx%ld", i, j, rc.left, rc.top, rc.right, rc.bottom, rc.right - rc.left, rc.bottom - rc.top)); } }
if (HAS_ADDRECT(rcMax[i])) {
CPSUIRECT(0, "rcMax", &rcMax[i], i, 0);
if (i) {
if (rcMax[i].top > rcMax[i - 1].bottom) {
yRemoved++; }
szlSpace.cx += (rcMax[i].left - rcMax[i - 1].right); szlSpace.cy += (rcMax[i].top - rcMax[i - 1].bottom); }
AddRect(&rcMax[i], &rcStates);
if (Mask & 0x01) {
CPSUIDBG(DBG_STATES, ("Hide i=%ld, szlHide.cy=%ld", i, szlHide.cy));
if (i) {
szlHide.cy += (rcMax[i].top - rcMax[i - 1].bottom); }
szlHide.cx += rcMax[i].right - rcMax[i].left; szlHide.cy += rcMax[i].bottom - rcMax[i].top;
if (++cHide == cStates) {
CPSUIASSERT(0, "Error: HideStates(HIDE EVERY THING)=%d", cHide < cStates, UIntToPtr(cHide)); return(0); } } } }
CPSUIDBG(DBG_STATES, ("rcStates=(%ld, %ld)-(%ld, %ld)=%ldx%ld", rcStates.left, rcStates.top, rcStates.right, rcStates.bottom, rcStates.right - rcStates.left, rcStates.bottom - rcStates.top)); CPSUIDBG(DBG_STATES, ("szlHide=%ldx%ld, szlSpace=%ldx%ld, yReMoved=%ld", szlHide.cx, szlHide.cy, szlSpace.cx, szlSpace.cy, yRemoved));
if (yRemoved) {
szlSpace.cy /= yRemoved;
//
// If we arrange top/down and we do not intersect with the visible
// bits then we can remove the y space
//
if ((rcStates.top >= prcVisibleNoStates->bottom) || (rcStates.bottom <= prcVisibleNoStates->top)) {
//
// We can remove the Y line now
//
rcStates.bottom -= (yRemoved = szlHide.cy); szlHide.cy = 0;
CPSUIDBG(DBG_STATES, ("HideStates: OK to remove Y, yRemoved=%ld", yRemoved));
} else {
yRemoved = 0;
//
// Do not remove Y spaces, just arrange it
//
CPSUIINT(("---- STATES: CANNOT remove Y space, Re-Arrange it ---")); }
DoXDir = FALSE; szlHide.cx = szlHide.cy = 0; szlSpace.cx = 0;
} else {
DoXDir = TRUE; szlHide.cy = szlSpace.cy = 0; }
switch (cStates - cHide) {
case 1:
//
// Only one state left, just center it
//
if (DoXDir) {
szlHide.cx = ((szlSpace.cx + szlHide.cx) / 2); }
break;
case 2:
if (DoXDir) {
szlHide.cx = ((szlHide.cx + 1) / 3); szlSpace.cx += szlHide.cx; }
break; }
rcStates.left += szlHide.cx; rcStates.top += szlHide.cy;
CPSUIDBG(DBG_STATES, ("State1=(%ld, %ld): szlHide=%ld x %ld, szlSpace=%ld x %ld, DoXDir=%ld", rcStates.left, rcStates.top, szlHide.cx, szlHide.cy, szlSpace.cx, szlSpace.cy, DoXDir));
for (i = 0, Mask = HideBits, pHSInfo = HSInfo; i < cStates; i++, Mask >>= 1) {
if (Mask & 0x01) {
pHSInfo += 2;
} else {
for (j = 0; j < 2; j++, pHSInfo++) {
if (pHSInfo->hCtrl) {
szlHide.cx = pHSInfo->x - rcMax[i].left; szlHide.cy = pHSInfo->y - rcMax[i].top;
CPSUIDBG(DBG_STATES, ("HideStates: MOVE(%d:%d) from (%ld, %ld) to (%ld, %ld)", i, j, pHSInfo->x, pHSInfo->y, rcStates.left + szlHide.cx, rcStates.top + szlHide.cy));
SetWindowPos(pHSInfo->hCtrl, NULL, rcStates.left + szlHide.cx, rcStates.top + szlHide.cy, 0, 0, SWP_NOSIZE | SWP_NOZORDER); } }
if (DoXDir) {
rcStates.left += (szlSpace.cx + rcMax[i].right - rcMax[i].left);
} else {
rcStates.top += (szlSpace.cy + rcMax[i].bottom - rcMax[i].top); } } }
return(yRemoved); }
VOID AddItemInfo( PITEMINFOHEADER pIIHdr, POPTITEM pItem )
/*++
Routine Description:
Arguments:
Return Value:
Author:
09-Sep-1995 Sat 17:27:01 created -by- Daniel Chou (danielc)
Revision History:
--*/
{ HWND hDlg; WORD Mask; WORD HideBits; WORD ExtBits; WORD NonStatesBits; UINT CurCtrlID; UINT cCtrls; UINT cStates; RECT rcVisible; RECT rcVisibleNoStates; RECT rcExt; RECT rcGrpBox; ITEMINFO II;
if (pItem) {
POPTTYPE pOptType;
II.Flags = (pItem->Flags & OPTIF_ITEM_HIDE) ? IIF_ITEM_HIDE : 0;
if ((pItem->Flags & OPTIF_EXT_HIDE) || (!pItem->pExtChkBox)) {
II.Flags |= IIF_EXT_HIDE; }
if (pOptType = pItem->pOptType) {
II.BegCtrlID = (WORD)pOptType->BegCtrlID;
if (((II.Type = pOptType->Type) == TVOT_2STATES) || (II.Type == TVOT_3STATES)) {
II.Flags |= (_OT_FLAGS(pOptType) & (IIF_3STATES_HIDE | IIF_STDPAGE_3STATES)); }
} else {
II.Type = TVOT_NONE; II.BegCtrlID = 0; }
} else {
//
// Some Flags/Type/BegCtrlID and of the stuff already set in here
//
II = pIIHdr->ItemInfo[pIIHdr->cItem]; }
if (II.Flags & IIF_STDPAGE_3STATES) {
II.Type = TVOT_3STATES; }
CurCtrlID = II.BegCtrlID; cCtrls = (UINT)cTVOTCtrls[II.Type]; II.pItem = pItem; II.CtrlBits = 0; II.xExtMove = 0; II.yExt = 0; II.yMoveUp = 0; hDlg = pIIHdr->hDlg;
INIT_ADDRECT(II.rc); INIT_ADDRECT(rcExt); INIT_ADDRECT(rcVisible); INIT_ADDRECT(rcGrpBox); INIT_ADDRECT(rcVisibleNoStates);
HideBits = 0;
if ((II.Flags & IIF_3STATES_HIDE) && (!(II.Flags & IIF_ITEM_HIDE))) {
if (II.Flags & IIF_3STATES_1) {
HideBits |= 0x0c; }
if (II.Flags & IIF_3STATES_2) {
HideBits |= 0x30; }
if (II.Flags & IIF_3STATES_3) {
HideBits |= 0xc0; }
NonStatesBits = 0xff03;
} else {
NonStatesBits = 0; }
if (II.Flags & IIF_EXT_HIDE) {
ExtBits = (WORD)(3 << (cCtrls - 2)); HideBits |= ExtBits;
} else {
ExtBits = 0; }
CPSUIINT((" !! HideBits=%04lx, NonStateBits=%04lx, ExtBits=%04lx", HideBits, NonStatesBits, ExtBits));
Mask = 0x0001;
while (cCtrls--) {
HWND hCtrl; RECT rc;
//
// We only count this ctrl's rectangle if it is vaild and visible
//
if (hCtrl = CtrlIDrcWnd(hDlg, CurCtrlID, &rc)) {
CPSUIRECT(0, "AddItemInfo", &rc, cCtrls, CurCtrlID);
if (Mask == 0x0001) {
rcGrpBox = rc;
} else {
if (HideBits & Mask) {
ShowWindow(hCtrl, SW_HIDE); EnableWindow(hCtrl, FALSE);
} else {
AddRect(&rc, &rcVisible);
if (Mask & NonStatesBits) {
AddRect(&rc, &rcVisibleNoStates); } }
if (ExtBits & Mask) {
AddRect(&rc, &rcExt); }
AddRect(&rc, &II.rc); }
II.CtrlBits |= Mask; }
Mask <<= 1; CurCtrlID++; }
II.rcCtrls = II.rc;
CPSUIRECT(0, " rcGrpBox", &rcGrpBox, 0, 0); CPSUIRECT(0, " rcCtrls", &II.rcCtrls, 0, 0); CPSUIRECT(0, " rcExt", &rcExt, 0, 0); CPSUIRECT(0, "rcVisiable", &rcVisible, 0, 0);
if (II.CtrlBits & 0x0001) {
UINT cAdded;
if ((cAdded = AddRect(&rcGrpBox, &II.rc)) != 4) {
CPSUIINT(("AddRect(&rcGrp, &II.rc)=%d", cAdded)); CPSUIOPTITEM(DBG_AII, pIIHdr->pTVWnd, "GroupBox too small", 1, pItem); } }
if (HAS_ADDRECT(rcVisible)) {
if ((II.Flags & IIF_3STATES_HIDE) && (!(II.Flags & IIF_ITEM_HIDE))) {
if (!HAS_ADDRECT(rcVisibleNoStates)) {
rcVisibleNoStates.left = rcVisibleNoStates.top = 999999; rcVisibleNoStates.right = rcVisibleNoStates.bottom = -999999; }
CPSUIRECT(0, "rcVisiableNoStates", &rcVisibleNoStates, 0, 0);
II.yExt += (WORD)HideStates(hDlg, &II, &rcVisibleNoStates); }
if (HAS_ADDRECT(rcExt)) {
//
// We need to move all other controls and shrink the group
// box if necessary
//
if (II.CtrlBits & 0x0001) {
if (rcExt.left > rcVisible.right) {
//
// The extended are at right of the ctrls, move to right
//
II.xExtMove = (SHORT)(rcExt.left - rcVisible.right);
} else if (rcExt.right < rcVisible.left) {
//
// The extended are at left of the ctrls, move to left
//
II.xExtMove = (SHORT)(rcVisible.left - rcVisible.right); }
//
// distribute the move size on each side of the control
//
II.xExtMove /= 2; }
if (rcExt.bottom > rcVisible.bottom) {
//
// The extended are at bottom of the ctrls, remove overlay
//
II.yExt += (WORD)(rcExt.bottom - rcVisible.bottom); }
if (rcExt.top < rcVisible.top) {
//
// The extended are at top of the ctrls, remove that overlay
//
II.yExt += (WORD)(rcVisible.top - rcExt.top); }
CPSUIINT(("!! Hide Extended(%d): xMove=%ld, yExt=%ld", II.BegCtrlID, (LONG)II.xExtMove, (LONG)II.yExt)); }
} else {
II.Flags |= (IIF_ITEM_HIDE | IIF_EXT_HIDE); }
if (pIIHdr->cItem >= pIIHdr->cMaxItem) {
CPSUIERR(("AddItemInfo: Too many Items, Max=%ld", pIIHdr->cMaxItem));
} else {
pIIHdr->ItemInfo[pIIHdr->cItem++] = II; } }
VOID HideMoveII( HWND hDlg, PITEMINFO pII )
/*++
Routine Description:
Arguments:
Return Value:
Author:
11-Sep-1995 Mon 12:56:06 created -by- Daniel Chou (danielc)
Revision History:
--*/
{ ITEMINFO II = *pII; BOOL GrpBox = TRUE;
if ((!(II.Flags & IIF_ITEM_HIDE)) && (II.xExtMove == 0) && (II.yExt == 0) && (II.yMoveUp == 0)) {
return; } CPSUIINT(("\n%hs Item: Flags=%04x, CtrlBits=%04lx, xExt=%d, yExt=%d, yMoveUp=%d", (II.Flags & IIF_ITEM_HIDE) ? "HIDE" : "MOVE", II.Flags, II.CtrlBits, II.xExtMove, II.yExt, II.yMoveUp)); CPSUIRECT(DBG_HMII, "II.rcCtrls", &II.rcCtrls, II.BegCtrlID, 0); CPSUIRECT(DBG_HMII, " II.rc", &II.rc, II.BegCtrlID, 0); CPSUIOPTITEM(DBG_HMII, GET_PTVWND(hDlg), "HideMoveII", 1, II.pItem);
while (II.CtrlBits) {
HWND hCtrl;
if ((II.CtrlBits & 0x0001) && (hCtrl = GetDlgItem(hDlg, II.BegCtrlID))) {
RECT rc;
if (II.Flags & IIF_ITEM_HIDE) {
ShowWindow(hCtrl, SW_HIDE); EnableWindow(hCtrl, FALSE);
CPSUIINT((" HIDE Ctrls ID=%d", II.BegCtrlID)); } else {
hCtrlrcWnd(hDlg, hCtrl, &rc);
if (GrpBox) {
if ((II.yExt) || (II.yMoveUp)) {
CPSUIINT(("Move GrpBox ID=%5d, Y: %ld -> %ld, cy: %ld -> %ld", II.BegCtrlID, rc.top, rc.top - II.yMoveUp, rc.bottom - rc.top, rc.bottom - rc.top - (LONG)II.yExt));
SetWindowPos(hCtrl, NULL, rc.left, rc.top - II.yMoveUp, rc.right - rc.left, rc.bottom - rc.top - (LONG)II.yExt, SWP_NOZORDER); }
} else if ((II.xExtMove) || (II.yMoveUp)) {
//
// We only need to move xExtMove if it is not group box
// and also do the yMoveUp
//
CPSUIINT((" Move Ctrls ID=%5d, (%ld, %d) -> (%ld, %ld)", II.BegCtrlID, rc.left, rc.top, rc.left + (LONG)II.xExtMove, rc.top - (LONG)II.yMoveUp));
SetWindowPos(hCtrl, NULL, rc.left + (LONG)II.xExtMove, rc.top - (LONG)II.yMoveUp, 0, 0, SWP_NOSIZE | SWP_NOZORDER); } } }
GrpBox = FALSE; II.CtrlBits >>= 1; II.BegCtrlID++; } }
VOID HideMoveType( HWND hDlg, UINT BegCtrlID, UINT Type )
/*++
Routine Description:
Arguments:
Return Value:
Author:
19-Sep-1995 Tue 21:01:55 created -by- Daniel Chou (danielc)
Revision History:
--*/
{ ITEMINFO II; UINT cCtrls;
cCtrls = (UINT)cTVOTCtrls[Type]; II.Flags = IIF_ITEM_HIDE | IIF_EXT_HIDE; II.BegCtrlID = (WORD)BegCtrlID; II.CtrlBits = (WORD)(0xFFFF >> (16 - cCtrls));
HideMoveII(hDlg, &II); }
INT HideMovePropPage( PITEMINFOHEADER pIIHdr )
/*++
Routine Description:
Arguments:
Return Value:
Author:
11-Sep-1995 Mon 01:25:53 created -by- Daniel Chou (danielc)
Revision History:
--*/
{ HWND hDlg; PITEMINFO pII; PITEMINFO pIIEnd; UINT yMoveUp; UINT yLastTop; UINT cItem;
//
// firstable, sort all the item based on the rc.top of each item
//
qsort(pII = pIIHdr->ItemInfo, cItem = (UINT)pIIHdr->cItem, sizeof(ITEMINFO), ItemInfoCompare);
pIIEnd = pII + cItem; yMoveUp = 0; yLastTop = (UINT)pII->rc.top; hDlg = pIIHdr->hDlg;
CPSUIDBGBLK({
UINT i = cItem; PITEMINFO pIITmp = pII;
CPSUIDBG(DBG_QSORT, ("qsort: cItem = %d", cItem));
while (i--) {
CPSUIRECT(DBG_QSORT, "QSort", &pIITmp->rc, pIITmp->BegCtrlID, 0);
CPSUIOPTITEM(DBG_QSORT, pIIHdr->pTVWnd, "Sorted Item RECT", 1, pIITmp->pItem); pIITmp++; } })
while (pII < pIIEnd) {
PITEMINFO pIIBeg; PITEMINFO pIIBegSave; RECT rcBeg; UINT cHide; UINT cII; UINT cyCurHide; UINT yBegExt; UINT yGrpBoxShrink; UINT yGrpHideMoveUp; INT GrpBox;
//
// Do the group item first assume we do not need to hide the group
// box, and skip the space between group box and first control, The
// first group's top is the first control's top
//
pIIBegSave = pIIBeg = pII; rcBeg = pIIBeg->rc; cHide = 0; GrpBox = 1;
//
// yLastTop < 0 means the last group is totally hide and it need to
// delete the space between last group end and this group begin
//
if (yLastTop == (UINT)0xFFFF) {
yLastTop = 0;
} else {
yLastTop = (UINT)(rcBeg.top - yLastTop); }
yGrpBoxShrink = 0; yMoveUp += yLastTop; yGrpHideMoveUp = (UINT)(yMoveUp + (rcBeg.bottom - rcBeg.top)); yLastTop = rcBeg.top;
do {
CPSUIINT(("Item: yLastTop=%ld, yGrpBoxShrink=%d, yMoveUp=%d", yLastTop, yGrpBoxShrink, yMoveUp));
if (pII->rc.bottom > rcBeg.bottom) {
CPSUIOPTITEM(DBG_HMII, pIIHdr->pTVWnd, "Item Ctrls Overlay", 1, pII->pItem);
CPSUIASSERT(0, "Item ctrls overlay", pII->rc.bottom <= rcBeg.bottom, LongToPtr(pII->rc.bottom)); }
if (pII->Flags & IIF_ITEM_HIDE) {
cyCurHide = (UINT)(pII->rc.top - yLastTop); ++cHide;
} else {
cyCurHide = pII->yExt; pII->yMoveUp = (WORD)yMoveUp; }
yGrpBoxShrink += cyCurHide; yMoveUp += cyCurHide; yLastTop = (GrpBox-- > 0) ? pII->rcCtrls.top : pII->rc.top;
} while ((++pII < pIIEnd) && (pII->rc.top < rcBeg.bottom));
CPSUIINT(("FINAL: yLastTop=%ld, yGrpBoxShrink=%d, yMoveUp=%d", yLastTop, yGrpBoxShrink, yMoveUp));
//
// Now check if we have same hide item
//
if (cHide == (cII = (UINT)(pII - pIIBeg))) {
//
// Hide them all and add in the extra yMoveUp for the the space
// between group box and the first control which we reduced out
// front.
//
yMoveUp = yGrpHideMoveUp; yLastTop = rcBeg.bottom;
CPSUIINT(("Hide ALL items = %d, yMoveUp Change to %ld", cHide, yMoveUp));
while (cHide--) {
HideMoveII(hDlg, pIIBegSave++); }
} else {
CPSUIINT(("!! Grpup Items cII=%d !!", cII));
//
// We need to enable the group box and shrink it too
//
if (pIIBeg->Flags & IIF_ITEM_HIDE) {
pIIBeg->yExt += (WORD)yGrpBoxShrink; pIIBeg->Flags &= ~IIF_ITEM_HIDE; pIIBeg->CtrlBits &= 0x01;
} else {
pIIBeg->yExt = (WORD)yGrpBoxShrink; }
while (cII--) {
HideMoveII(hDlg, pIIBegSave++); }
yLastTop = 0xFFFF; } }
return(yMoveUp); }
LONG UpdatePropPageItem( HWND hDlg, PTVWND pTVWnd, POPTITEM pItem, BOOL DoInit )
/*++
Routine Description:
Arguments:
Return Value:
Author:
31-Aug-1995 Thu 23:53:44 created -by- Daniel Chou (danielc)
Revision History:
--*/
{ HWND hCtrl; POPTTYPE pOptType; POPTPARAM pOptParam; LONG Sel; UINT Type; UINT BegCtrlID; UINT SetCurSelID; UINT cSetIcon; UINT ExtID; UINT UDArrowHelpID = 0; LONG Result = 1; WORD InitItemIdx; WORD InitFlags; BYTE CtrlData = 0; BOOL CanUpdate;
InitItemIdx = (WORD)(pItem - pTVWnd->ComPropSheetUI.pOptItem); pOptType = pItem->pOptType; pOptParam = pOptType->pOptParam; BegCtrlID = (UINT)pOptType->BegCtrlID; Sel = pItem->Sel; Type = (UINT)pOptType->Type;
//
// If we have push button, and it said we always can call it then update
// is true
//
if ((Type == TVOT_PUSHBUTTON) && (pOptType->Flags & OTS_PUSH_ENABLE_ALWAYS)) {
CanUpdate = TRUE;
} else {
CanUpdate = (BOOL)(pTVWnd->Flags & TWF_CAN_UPDATE); }
if ((pItem->Flags & OPTIF_DISABLED) || (!CanUpdate)) {
InitFlags = 0;
} else {
InitFlags = INITCF_ENABLE; }
if (DoInit) {
InitFlags |= (INITCF_INIT | INITCF_SETCTRLDATA);
for (cSetIcon = 0; cSetIcon < (UINT)cTVOTCtrls[Type]; cSetIcon++) {
if (hCtrl = GetDlgItem(hDlg, BegCtrlID++)) {
//
// This prevent to overwrite GWLP_USERDATA for the WNDPROC
// saved for the hEdit
//
SETCTRLDATA(hCtrl, CTRLS_PROPPAGE_STATIC, (BYTE)cSetIcon);
CPSUIINT(("SETCTRLDATA: %ld, hCtrl=%08lx, USER_DATA=%p", BegCtrlID - 1, hCtrl, GetWindowLongPtr(hCtrl, GWLP_USERDATA))); } }
BegCtrlID = (UINT)pOptType->BegCtrlID; }
//
// We always set at least one icon
//
cSetIcon = 1; ExtID = (UINT)(BegCtrlID + cTVOTCtrls[Type] - 2);
INIT_EXTENDED(pTVWnd, hDlg, pItem, ExtID, ExtID, ExtID + 1, InitItemIdx, InitFlags);
if (pOptType->Flags & OPTTF_TYPE_DISABLED) {
InitFlags &= ~INITCF_ENABLE; }
switch(Type) {
case TVOT_3STATES: case TVOT_2STATES:
//
// If this internal flag is set then this is a standard page which
// always has a 3 states contrl ID but the caller's POPTTYPE only
// presendt as TVOT_2STATES
//
if (_OT_FLAGS(pOptType) & OTINTF_STDPAGE_3STATES) {
ExtID = (UINT)(BegCtrlID + cTVOTCtrls[TVOT_3STATES] - 2); }
InitStates(pTVWnd, hDlg, pItem, pOptType, BegCtrlID + 2, InitItemIdx, (LONG)Sel, InitFlags);
if (InitFlags & INITCF_INIT) {
cSetIcon = pOptType->Count; CtrlData = 0;
} else {
CtrlData = (BYTE)Sel; pOptParam += Sel; BegCtrlID += (Sel << 1); }
InitFlags |= INITCF_ICON_NOTIFY;
break;
case TVOT_UDARROW:
if ((Result = InitUDArrow(pTVWnd, hDlg, pItem, pOptParam, BegCtrlID + 6, BegCtrlID + 2, BegCtrlID + 4, UDArrowHelpID = BegCtrlID + 5, InitItemIdx, Sel, InitFlags)) < 0) {
return(Result); } break;
case TVOT_TRACKBAR: case TVOT_SCROLLBAR:
InitFlags |= INITCF_ADDSELPOSTFIX; hCtrl = GetDlgItem(hDlg, BegCtrlID + 2);
if (Type == TVOT_TRACKBAR) {
hCtrl = GetWindow(hCtrl, GW_HWNDNEXT); }
InitTBSB(pTVWnd, hDlg, pItem, hCtrl, pOptType, BegCtrlID + 6, BegCtrlID + 4, BegCtrlID + 5, InitItemIdx, Sel, InitFlags);
break;
case TVOT_LISTBOX: case TVOT_COMBOBOX:
SetCurSelID = LB_SETCURSEL;
if (Type == TVOT_LISTBOX) {
if (pOptType->Style & OTS_LBCB_PROPPAGE_LBUSECB) {
SetCurSelID = CB_SETCURSEL; }
} else if (!(pOptType->Style & OTS_LBCB_PROPPAGE_CBUSELB)) {
SetCurSelID = CB_SETCURSEL; }
//
// Always need to set this new state icon
//
if ((DWORD)pItem->Sel >= (DWORD)pOptType->Count) {
pOptParam = &pTVWnd->OptParamNone;
} else {
pOptParam += (DWORD)pItem->Sel; }
if (hCtrl = GetDlgItem(hDlg, BegCtrlID + 2)) {
InvalidateRect(hCtrl, NULL, FALSE); }
InitLBCB(pTVWnd, hDlg, pItem, BegCtrlID + 2, SetCurSelID, pOptType, InitItemIdx, Sel, InitFlags, (UINT)_OT_ORGLBCBCY(pOptType));
break;
case TVOT_EDITBOX:
InitEditBox(pTVWnd, hDlg, pItem, pOptParam, BegCtrlID + 2, BegCtrlID + 4, BegCtrlID + 5, InitItemIdx, (LPTSTR)(LONG_PTR)Sel, InitFlags); break;
case TVOT_PUSHBUTTON:
InitPushButton(pTVWnd, hDlg, pItem, (WORD)(BegCtrlID + 2), InitItemIdx, InitFlags); break;
case TVOT_CHKBOX:
InitFlags |= INITCF_ICON_NOTIFY;
InitChkBox(pTVWnd, hDlg, pItem, BegCtrlID + 2, pItem->pName, InitItemIdx, (BOOL)Sel, InitFlags);
break;
default:
return(ERR_CPSUI_INVALID_TVOT_TYPE); }
if (InitFlags & (INITCF_INIT | INITCF_ADDSELPOSTFIX)) {
SetDlgPageItemName(hDlg, pTVWnd, pItem, InitFlags, UDArrowHelpID); }
if (cSetIcon) {
UINT i;
for (i = 0, BegCtrlID += 3; i < cSetIcon; i++, pOptParam++, CtrlData++, BegCtrlID += 2) {
if (hCtrl = GetDlgItem(hDlg, BegCtrlID)) {
WORD IconMode = 0;
if ((pItem->Flags & OPTIF_OVERLAY_WARNING_ICON) || (pOptParam->Flags & OPTPF_OVERLAY_WARNING_ICON)) {
IconMode |= MIM_WARNING_OVERLAY; }
if ((pItem->Flags & (OPTIF_OVERLAY_STOP_ICON | OPTIF_HIDE)) || (pOptParam->Flags & OPTPF_OVERLAY_STOP_ICON)) {
IconMode |= MIM_STOP_OVERLAY; }
if ((pItem->Flags & (OPTIF_OVERLAY_NO_ICON)) || (pOptParam->Flags & OPTPF_OVERLAY_NO_ICON)) {
IconMode |= MIM_NO_OVERLAY; }
SetIcon(_OI_HINST(pItem), hCtrl, GET_ICONID(pOptParam, OPTPF_ICONID_AS_HICON), MK_INTICONID(IDI_CPSUI_GENERIC_ITEM, IconMode), 32);
if (InitFlags & INITCF_INIT) {
HCTRL_SETCTRLDATA(hCtrl, CTRLS_PROPPAGE_ICON, CtrlData); }
if (InitFlags & INITCF_ICON_NOTIFY) {
DWORD dw = (DWORD)GetWindowLongPtr(hCtrl, GWL_STYLE);
if (pOptParam->Flags & (OPTPF_DISABLED | OPTPF_HIDE)) {
dw &= ~SS_NOTIFY;
} else {
dw |= SS_NOTIFY; }
SetWindowLongPtr(hCtrl, GWL_STYLE, (LONG)dw); } } } }
return(Result); }
LONG InitPropPage( HWND hDlg, PMYDLGPAGE pCurMyDP )
/*++
Routine Description:
Arguments:
Return Value:
Author:
14-Jun-1995 Wed 15:30:28 created -by- Daniel Chou (danielc)
Revision History:
--*/
{ PITEMINFOHEADER pIIHdr = NULL; PSTDPAGEINFO pSPI; PTVWND pTVWnd; POPTITEM pItem; POPTITEM pLastItem; LONG Result; WORD StdPageHide[DMPUB_LAST]; BYTE CurPageIdx; UINT i; UINT BegCtrlID; UINT Type; UINT cStdPageHide = 0; UINT cStatesHide = 0; UINT cItem; UINT cHide;
pTVWnd = (PTVWND)pCurMyDP->pTVWnd; CurPageIdx = pCurMyDP->PageIdx; pItem = pTVWnd->ComPropSheetUI.pOptItem; pLastItem = pTVWnd->pLastItem; cItem = (UINT)pCurMyDP->cItem; cHide = (UINT)pCurMyDP->cHide;
if ((CurPageIdx == pTVWnd->StdPageIdx1) || (CurPageIdx == pTVWnd->StdPageIdx2)) {
//
// Check if any our standard pages' controls are not present in the
// pOptItem
//
for (i = 0, pSPI = StdPageInfo; i < DMPUB_LAST; i++, pSPI++) {
POPTITEM pDMPubItem; POPTTYPE pOptType; WORD Idx;
if ((pSPI->StdPageID == CurPageIdx) && (pSPI->BegCtrlID)) {
if ((Idx = pTVWnd->DMPubIdx[i]) == 0xFFFF) {
++cStdPageHide;
} else {
pDMPubItem = pItem + Idx; pOptType = pDMPubItem->pOptType;
switch (pOptType->Type) {
case TVOT_2STATES: case TVOT_3STATES:
if (_OT_FLAGS(pOptType) & OTINTF_STATES_HIDE_MASK) {
++cStatesHide; }
break;
default:
break; } } } } }
CPSUIDBG(DBG_INITP1, ("InitPropPage: PageIdx=%d, cItem=%d, cHide=%d, cStdPageHide=% (%d)", CurPageIdx, cItem, cHide, cStdPageHide, cStatesHide));
if ((cHide += cStdPageHide) || (cStatesHide)) {
//
// Some item in this page may have to hide
//
i = (UINT)(((cItem + cStdPageHide + cStatesHide) * sizeof(ITEMINFO)) + sizeof(ITEMINFOHEADER));
CPSUIINT(("Total ItemInfo allocated=%d, cb=%d", cItem+cStdPageHide, i));
if (pIIHdr = LocalAlloc(LPTR, i)) {
pIIHdr->hDlg = hDlg; pIIHdr->pTVWnd = pTVWnd; pIIHdr->cItem = 0; pIIHdr->cMaxItem = (WORD)(cItem + cStdPageHide);
//
// Stop redraw everything
//
SendMessage(hDlg, WM_SETREDRAW, (WPARAM)FALSE, 0L);
} else {
CPSUIERR(("LocalAlloc(pIIHdr(%u)) failed, cannot move items", i)); } }
while (pItem <= pLastItem) {
BYTE CurLevel = pItem->Level;
if (pItem->DlgPageIdx != CurPageIdx) {
SKIP_CHILDREN(pItem, pLastItem, CurLevel); continue; }
do {
POPTTYPE pOptType;
if (pOptType = pItem->pOptType) {
DWORD cySize;
--cItem;
BegCtrlID = (UINT)pOptType->BegCtrlID; Type = (UINT)pOptType->Type;
if (pItem->Flags & OPTIF_ITEM_HIDE) {
--cHide;
if (!pIIHdr) {
HideMoveType(hDlg, BegCtrlID, Type); }
} else {
CPSUIOPTITEM(DBGITEM_INITP1, pTVWnd, "InitP1", 2, pItem);
//
// Checking anything need to done for the internal item
//
switch (Type) {
case TVOT_LISTBOX:
cySize = ReCreateLBCB(hDlg, BegCtrlID + 2, !(BOOL)(pOptType->Style & OTS_LBCB_PROPPAGE_LBUSECB));
_OT_ORGLBCBCY(pOptType) = HIWORD(cySize);
break;
case TVOT_COMBOBOX:
cySize = ReCreateLBCB(hDlg, BegCtrlID + 2, (BOOL)(pOptType->Style & OTS_LBCB_PROPPAGE_CBUSELB));
_OT_ORGLBCBCY(pOptType) = HIWORD(cySize);
break;
case TVOT_TRACKBAR:
if (!CreateTrackBar(hDlg, BegCtrlID + 2)) {
if (pIIHdr) {
LocalFree((HLOCAL)pIIHdr); }
return(ERR_CPSUI_CREATE_TRACKBAR_FAILED); }
break;
case TVOT_UDARROW:
if (!CreateUDArrow(hDlg, BegCtrlID + 2, BegCtrlID + 6, (LONG)pOptType->pOptParam[1].IconID, (LONG)pOptType->pOptParam[1].lParam, (LONG)pItem->Sel)) {
if (pIIHdr) {
LocalFree((HLOCAL)pIIHdr); }
return(ERR_CPSUI_CREATE_UDARROW_FAILED); }
break; }
if ((Result = UpdatePropPageItem(hDlg, pTVWnd, pItem, TRUE)) < 0) {
if (pIIHdr) {
LocalFree((HLOCAL)pIIHdr); }
return(Result); } }
if (pIIHdr) {
//
// Add the item info header
//
AddItemInfo(pIIHdr, pItem); } }
} WHILE_SKIP_CHILDREN(pItem, pLastItem, CurLevel); }
CPSUIASSERT(0, "Error: mismatch visable items=%d", cItem == 0, UIntToPtr(cItem));
if (cStdPageHide) {
PITEMINFO pII;
if (pIIHdr) {
pII = &(pIIHdr->ItemInfo[pIIHdr->cItem]);
CPSUIINT(("cItem in ItemInfoHdr=%d", (UINT)pIIHdr->cItem)); }
for (i = 0, pSPI = StdPageInfo; i < DMPUB_LAST; i++, pSPI++) {
if ((BegCtrlID = (UINT)pSPI->BegCtrlID) && (pSPI->StdPageID == CurPageIdx) && (pTVWnd->DMPubIdx[i] == 0xFFFF)) {
Type = (UINT)StdTVOT[pSPI->iStdTVOT + pSPI->cStdTVOT - 1];
if (pIIHdr) {
CPSUIINT(("Add Extra DMPUB ID=%d, BegCtrID=%d ITEMINFO", i, BegCtrlID));
pII->Flags = IIF_ITEM_HIDE | IIF_EXT_HIDE ; pII->Type = (BYTE)Type; pII->BegCtrlID = (WORD)BegCtrlID;
AddItemInfo(pIIHdr, NULL); pII++;
} else {
HideMoveType(hDlg, BegCtrlID, Type); }
--cHide; } } }
if ((cStdPageHide) || (cStatesHide)) {
//
// Now hide/move all page's item
//
if (pIIHdr) {
HideMovePropPage(pIIHdr); }
SendMessage(hDlg, WM_SETREDRAW, (WPARAM)TRUE, 0L); InvalidateRect(hDlg, NULL, FALSE); }
if (pIIHdr) {
LocalFree((HLOCAL)pIIHdr); }
CPSUIASSERT(0, "Error: mismatch hide items=%d", cHide == 0, UIntToPtr(cHide));
return(pCurMyDP->cItem); }
LONG UpdatePropPage( HWND hDlg, PMYDLGPAGE pCurMyDP )
/*++
Routine Description:
Arguments:
Return Value:
Author:
08-Aug-1995 Tue 15:37:16 created -by- Daniel Chou (danielc)
Revision History:
--*/
{ INT cUpdated = 0;
if (pCurMyDP->Flags & (MYDPF_CHANGED | MYDPF_REINIT)) {
PTVWND pTVWnd; POPTITEM pItem; UINT cItem; BYTE CurPageIdx; BOOL ReInit;
pTVWnd = (PTVWND)pCurMyDP->pTVWnd; CurPageIdx = (BYTE)pCurMyDP->PageIdx; pItem = pTVWnd->ComPropSheetUI.pOptItem; cItem = (UINT)pTVWnd->ComPropSheetUI.cOptItem; ReInit = (BOOL)(pCurMyDP->Flags & MYDPF_REINIT);
CPSUIDBG(DBGITEM_UP1, ("UpdatePropPage Flags (OPTIDX_INT_CHANGED)"));
while (cItem--) {
if ((pItem->pOptType) && (pItem->DlgPageIdx == CurPageIdx) && (pItem->Flags & OPTIF_INT_CHANGED)) {
CPSUIOPTITEM(DBGITEM_UP1, pTVWnd, "UpdatePage1", 1, pItem);
UpdatePropPageItem(hDlg, pTVWnd, pItem, ReInit);
pItem->Flags &= ~OPTIF_INT_CHANGED; ++cUpdated; }
pItem++; }
pCurMyDP->Flags &= ~(MYDPF_CHANGED | MYDPF_REINIT); }
return((LONG)cUpdated); }
LONG CountPropPageItems( PTVWND pTVWnd, BYTE CurPageIdx )
/*++
Routine Description:
Arguments:
Return Value:
Author:
22-Aug-1995 Tue 14:34:01 created -by- Daniel Chou (danielc)
Revision History:
--*/
{ PMYDLGPAGE pCurMyDP; POPTITEM pItem; POPTITEM pLastItem; BOOL IsTVPage; UINT cHideItems = 0; UINT cPageItems = 0;
if (CurPageIdx >= pTVWnd->cMyDlgPage) {
return(0); }
pItem = pTVWnd->ComPropSheetUI.pOptItem; pLastItem = pTVWnd->pLastItem;
if (pTVWnd->Flags & TWF_HAS_ADVANCED_PUSH) {
IsTVPage = FALSE;
} else {
IsTVPage = (BOOL)(pTVWnd->TVPageIdx == CurPageIdx); }
while (pItem <= pLastItem) {
if (IsTVPage) {
++cPageItems;
if (pItem->Flags & OPTIF_ITEM_HIDE) {
++cHideItems; }
} else if (pItem->DlgPageIdx == CurPageIdx) {
cPageItems++;
if (pItem->Flags & OPTIF_ITEM_HIDE) {
++cHideItems; } }
pItem++; }
pCurMyDP = pTVWnd->pMyDlgPage + CurPageIdx; pCurMyDP->cItem = (WORD)cPageItems; pCurMyDP->cHide = (WORD)cHideItems;
CPSUIINT(("PageIdx=%ld, cItem=%ld, cHide=%ld", CurPageIdx, cPageItems, cHideItems));
return((LONG)(cPageItems - cHideItems)); }
BOOL CALLBACK ChildWndCleanUp( HWND hWnd, LPARAM lParam ) { UNREFERENCED_PARAMETER(lParam);
if ((SendMessage(hWnd, WM_GETDLGCODE, 0, 0) & DLGC_STATIC) && ((GetWindowLongPtr(hWnd, GWL_STYLE) & SS_TYPEMASK) == SS_ICON)) {
HICON hIcon;
if (hIcon = (HICON)SendMessage(hWnd, STM_SETICON, 0, 0L)) {
DestroyIcon(hIcon); }
CPSUIINT(("ChildWndCleanUp: Static ID=%u, Icon=%08lx", GetDlgCtrlID(hWnd), hIcon)); }
return(TRUE); }
BOOL CALLBACK FixIconChildTo32x32( HWND hWnd, LPARAM lParam ) { HWND hDlg = (HWND)lParam;
if ((SendMessage(hWnd, WM_GETDLGCODE, 0, 0) & DLGC_STATIC) && ((GetWindowLongPtr(hWnd, GWL_STYLE) & SS_TYPEMASK) == SS_ICON)) {
RECT rc;
hCtrlrcWnd(hDlg, hWnd, &rc);
if (((rc.right - rc.left) != 32) || ((rc.bottom - rc.top) != 32)) {
CPSUIINT(("FixIcon32x32: Icon ID=%u, size=%ld x %ld, fix to 32x32", GetDlgCtrlID(hWnd), rc.right - rc.left, rc.bottom - rc.top));
SetWindowPos(hWnd, NULL, 0, 0, 32, 32, SWP_NOMOVE | SWP_NOZORDER); } }
return(TRUE); }
VOID MoveAdvancedPush( HWND hDlg, UINT EnlargeCtrlID, UINT CenterCtrlID )
/*++
Routine Description:
Arguments:
Return Value:
Author:
25-Aug-1998 Tue 10:30:55 created -by- Daniel Chou (danielc)
Revision History:
--*/
{ HWND hTabCtrl; HWND hCtrl; RECT rcAdvPush; RECT rcDlg; POINTL ptl;
if ((hTabCtrl = PropSheet_GetTabControl(GetParent(hDlg))) && (hCtrl = GetDlgItem(hDlg, ADVANCED_PUSH))) {
GetWindowRect(hDlg, &rcDlg);
CPSUIDBG(DBG_ADVPUSH, ("Prop Page Rect (before adjust)=(%ld, %ld) - (%ld, %ld)", rcDlg.left, rcDlg.top, rcDlg.right, rcDlg.bottom));
TabCtrl_AdjustRect(hTabCtrl, FALSE, &rcDlg);
CPSUIDBG(DBG_ADVPUSH, ("Prop Page Rect (after adjust)=(%ld, %ld) - (%ld, %ld)", rcDlg.left, rcDlg.top, rcDlg.right, rcDlg.bottom));
GetWindowRect(hCtrl, &rcAdvPush);
CPSUIDBG(DBG_ADVPUSH, ("Advanced Btn Rect=(%ld, %ld) - (%ld, %ld)", rcAdvPush.left, rcAdvPush.top, rcAdvPush.right, rcAdvPush.bottom));
ptl.y = rcDlg.bottom - (rcAdvPush.bottom - rcAdvPush.top);
CPSUIDBG(DBG_ADVPUSH, ("AdvPush cy=%ld, Move Y from %ld to %ld", rcAdvPush.bottom - rcAdvPush.top, rcAdvPush.top, ptl.y));
MapWindowPoints(NULL, hDlg, (LPPOINT)&rcAdvPush, 2); ScreenToClient(hDlg, (LPPOINT)&ptl); ptl.x = rcAdvPush.left;
CPSUIDBG(DBG_ADVPUSH, ("New Push left/top in CLIENT top=%ld, Add=%ld", ptl.y, ptl.y - rcAdvPush.top));
if (rcAdvPush.top != ptl.y) {
CPSUIDBG(DBG_ADVPUSH, ("Advance Push top change from %ld to %ld", rcAdvPush.top, ptl.y));
SetWindowPos(hCtrl, NULL, ptl.x, ptl.y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
ptl.y -= rcAdvPush.top;
if (hCtrl = CtrlIDrcWnd(hDlg, EnlargeCtrlID, &rcDlg)) {
SetWindowPos(hCtrl, NULL, 0, 0, rcDlg.right - rcDlg.left, rcDlg.bottom - rcDlg.top + ptl.y, SWP_NOMOVE | SWP_NOZORDER); }
if (hCtrl = CtrlIDrcWnd(hDlg, CenterCtrlID, &rcDlg)) {
SetWindowPos(hCtrl, NULL, rcDlg.left, rcDlg.top + (ptl.y / 2), 0, 0, SWP_NOSIZE | SWP_NOZORDER); } } } }
INT_PTR CALLBACK PropPageProc( HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam )
/*++
Routine Description:
Arguments:
Return Value:
Author:
28-Aug-1995 Mon 16:13:10 created -by- Daniel Chou (danielc)
Revision History:
--*/
{ #define pNMHdr ((NMHDR *)lParam)
HWND hWndFocus; HWND hCtrl; PMYDLGPAGE pCurMyDP; PTVWND pTVWnd; POPTITEM pItem; LONG MResult; PLAYOUTBMP pData; PCPSUIPAGE pPage;
if (Msg == WM_INITDIALOG) {
CPSUIINT(("PropPage WM_INITDIALOG: hDlg=%08lx, pPSP=%08lx", hDlg, lParam));
pCurMyDP = (PMYDLGPAGE)(((LPPROPSHEETPAGE)lParam)->lParam); pTVWnd = (PTVWND)pCurMyDP->pTVWnd; pCurMyDP->pPSPInfo = PPSPINFO_FROM_WM_INITDIALOG_LPARAM(lParam);
if (!ADD_PMYDLGPAGE(hDlg, pCurMyDP)) {
return(FALSE); }
CreateImageList(hDlg, pTVWnd);
if ((MResult = InitPropPage(hDlg, pCurMyDP)) < 0) {
CPSUIERR(("InitProPage()=%ld, FAILED", MResult)); }
SetUniqChildID(hDlg); UpdateCallBackChanges(hDlg, pTVWnd, TRUE); EnumChildWindows(hDlg, FixIconChildTo32x32, (LPARAM)hDlg); SetFocus((HWND)wParam); MResult = TRUE;
((LPPROPSHEETPAGE)lParam)->lParam = pCurMyDP->CPSUIUserData;
if ((pTVWnd->Flags & TWF_HAS_ADVANCED_PUSH) && (hCtrl = GetDlgItem(hDlg, ADVANCED_PUSH))) {
if (CountPropPageItems(pTVWnd, (BYTE)(pTVWnd->cMyDlgPage - 1))) {
WORD InitItemIdx = INTIDX_ADVANCED;
SETCTRLDATA(hCtrl, CTRLS_PUSHBUTTON, 0);
} else {
ShowWindow(hCtrl, SW_HIDE); } } }
if (pCurMyDP = GET_PMYDLGPAGE(hDlg)) {
pTVWnd = (PTVWND)pCurMyDP->pTVWnd;
if (pTVWnd) {
if (pCurMyDP->DlgPage.DlgProc) {
//
// Passed the caller's original CPSUIUserData which is the UserData
// in the COMPROPSHEETUI data structure
//
MResult = (LONG)pCurMyDP->DlgPage.DlgProc(hDlg, Msg, wParam, lParam);
if (MResult) {
return(TRUE); } }
if (Msg == WM_INITDIALOG) {
if ((pCurMyDP->PageIdx != pTVWnd->StdPageIdx1) || (!(hCtrl = GetDlgItem(hDlg, IDD_LAYOUT_PICTURE)))) {
hCtrl = NULL; }
MoveAdvancedPush(hDlg, IDD_LAYOUT_PICTURE_GROUP, IDD_LAYOUT_PICTURE);
if ((hCtrl) && (pData = InitLayoutBmp(hDlg, hCtrl, pTVWnd))) {
SetProp(hCtrl, CPSUIPROP_LAYOUTPUSH, (HANDLE)pData); }
return((BOOL)MResult); }
} else {
return(FALSE); }
} else {
return(FALSE); }
//
// Check if which one got the keyboard focus, if it is not the same as
// the one recored then send out the Focus message
//
if ((pCurMyDP->Flags & MYDPF_PAGE_ACTIVE) && (hWndFocus = GetFocus()) && (hWndFocus != pCurMyDP->hWndFocus) && (pItem = pItemFromhWnd(hDlg, pTVWnd, hWndFocus, -1)) && (pItem != pCurMyDP->pCurItem)) {
pCurMyDP->hWndFocus = hWndFocus; pCurMyDP->pCurItem = pItem;
CPSUIOPTITEM(DBG_SETFOCUS, pTVWnd, "PropPage: Keyboard Focus Changed", 0, pItem);
if ((pItem->Flags & OPTIF_CALLBACK) && (pTVWnd->ComPropSheetUI.pfnCallBack) && (pItem >= pTVWnd->ComPropSheetUI.pOptItem) && (pItem <= pTVWnd->pLastItem)) {
DoCallBack(hDlg, pTVWnd, pItem, pItem->pSel, NULL, NULL, 0, CPSUICB_REASON_OPTITEM_SETFOCUS); } }
switch (Msg) {
case WM_DRAWITEM:
return(DrawLBCBItem(pTVWnd, (LPDRAWITEMSTRUCT)lParam));
case WM_COMMAND:
if ((LOWORD(wParam) == ADVANCED_PUSH) && (pTVWnd->Flags & TWF_HAS_ADVANCED_PUSH) && (HIWORD(wParam) == BN_CLICKED) && (pTVWnd->hCPSUIPage) && (pPage = HANDLETABLE_GetCPSUIPage(pTVWnd->hCPSUIPage))) {
pPage->Flags |= CPF_CALL_TV_DIRECT; pTVWnd->Flags |= TWF_TV_BY_PUSH;
AddComPropSheetPage(pPage, pTVWnd->cInitMyDlgPage);
pTVWnd->Flags &= ~TWF_TV_BY_PUSH; pPage->Flags &= ~CPF_CALL_TV_DIRECT;
HANDLETABLE_UnGetCPSUIPage(pPage);
SET_APPLY_BUTTON(pTVWnd, hDlg);
UpdatePropPage(hDlg, pCurMyDP); InvalidateBMP(hDlg, pTVWnd);
break;
} else {
NULL; }
//
// Fall through
//
case WM_HSCROLL:
if (pItem = DlgHScrollCommand(hDlg, pTVWnd, (HWND)lParam, wParam)) {
UpdatePropPageItem(hDlg, pTVWnd, pItem, FALSE); InvalidateBMP(hDlg, pTVWnd); }
break;
case WM_HELP:
wParam = (WPARAM)((LPHELPINFO)lParam)->hItemHandle; lParam = (LPARAM)MAKELONG(((LPHELPINFO)lParam)->MousePos.x, ((LPHELPINFO)lParam)->MousePos.y);
case WM_CONTEXTMENU:
if (lParam == 0xFFFFFFFF) {
RECT rc;
wParam = (WPARAM)GetFocus();
GetWindowRect((HWND)wParam, &rc);
CPSUIINT(("MousePos=0xFFFFFFFF, GetFocus=%08lx, rc=(%ld, %ld)-(%ld, %ld)", (HWND)wParam, rc.left, rc.top, rc.right, rc.bottom));
rc.left += ((rc.right - rc.left) / 2); rc.top += ((rc.bottom - rc.top) / 2); lParam = (LPARAM)MAKELONG(rc.left, rc.top); }
pTVWnd = GET_PTVWND(hDlg);
if (pTVWnd) {
pItem = pItemFromhWnd(hDlg, pTVWnd, (HWND)wParam, (LONG)lParam);
if (Msg == WM_CONTEXTMENU) {
DoContextMenu(pTVWnd, hDlg, pItem, lParam);
} else if (pItem) {
CommonPropSheetUIHelp(hDlg, pTVWnd, hDlg, // (HWND)GetFocus(),
(DWORD)lParam, pItem, HELP_WM_HELP); } }
break;
case WM_NOTIFY:
MResult = 0;
switch (pNMHdr->code) {
case NM_SETFOCUS: case NM_CLICK: case NM_DBLCLK: case NM_RDBLCLK: case NM_RCLICK:
break;
case PSN_APPLY:
if ((pTVWnd->Flags & TWF_CAN_UPDATE) && (pTVWnd->ActiveDlgPage == pCurMyDP->PageIdx)) {
CPSUIDBG(DBG_PROPPAGEPROC, ("\nPropPage: Do PSN_APPLY(%ld), Page: Cur=%u, Active=%u, Flags=%04lx, CALLBACK", (pTVWnd->Flags & TWF_APPLY_NO_NEWDEF) ? 1 : 0, (UINT)pCurMyDP->PageIdx, (UINT)pTVWnd->ActiveDlgPage, pTVWnd->Flags));
if (DoCallBack(hDlg, pTVWnd, (pTVWnd->Flags & TWF_APPLY_NO_NEWDEF) ? NULL : pTVWnd->ComPropSheetUI.pOptItem, (LPVOID)pCurMyDP->PageIdx, NULL, NULL, 0, CPSUICB_REASON_APPLYNOW) == CPSUICB_ACTION_NO_APPLY_EXIT) {
MResult = PSNRET_INVALID_NOCHANGEPAGE; }
} else {
CPSUIDBG(DBG_PROPPAGEPROC, ("\nPropPage: Ignore PSN_APPLY, Page: Cur=%u, Active=%u, Flags=%04lx, DO NOTHING", (UINT)pCurMyDP->PageIdx, (UINT)pTVWnd->ActiveDlgPage, pTVWnd->Flags)); }
break;
case PSN_RESET:
CPSUIDBG(DBG_PROPPAGEPROC, ("\nPropPage: Got PSN_RESET (Cancel)"));
break;
case PSN_HELP:
CPSUIDBG(DBG_PROPPAGEPROC, ("\nPropPage: Got PSN_HELP (Help)"));
CommonPropSheetUIHelp(hDlg, pTVWnd, GetFocus(), 0, NULL, HELP_CONTENTS); break;
case PSN_SETACTIVE:
CPSUIDBG(DBG_PROPPAGEPROC, ("\nPropPage: Got PSN_SETACTIVE, pTVWnd=%08lx (%ld), Page=%u -> %u\n", pTVWnd, pTVWnd->cMyDlgPage, (UINT)pTVWnd->ActiveDlgPage, (UINT)pCurMyDP->PageIdx));
pCurMyDP->Flags |= MYDPF_PAGE_ACTIVE; pTVWnd->ActiveDlgPage = pCurMyDP->PageIdx;
DoCallBack(hDlg, pTVWnd, pTVWnd->ComPropSheetUI.pOptItem, (LPVOID)pCurMyDP->PageIdx, NULL, NULL, 0, CPSUICB_REASON_SETACTIVE);
UpdatePropPage(hDlg, pCurMyDP); InvalidateBMP(hDlg, pTVWnd);
break;
case PSN_KILLACTIVE:
CPSUIDBG(DBG_PROPPAGEPROC, ("\nPropPage: Got PSN_KILLACTIVE, pTVWnd=%08lx (%ld)", pTVWnd, pTVWnd->cMyDlgPage));
pCurMyDP->Flags &= ~MYDPF_PAGE_ACTIVE;
DoCallBack(hDlg, pTVWnd, pTVWnd->ComPropSheetUI.pOptItem, (LPVOID)pCurMyDP->PageIdx, NULL, NULL, 0, CPSUICB_REASON_KILLACTIVE);
break;
default:
CPSUIDBG(DBG_PROPPAGEPROC, ("*PropPageProc: Unknow WM_NOTIFY=%u", pNMHdr->code));
break; }
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, MResult); return(TRUE); break;
case WM_DESTROY:
CPSUIINT(("PropPage: Get WM_DESTROY Message"));
if ((hCtrl = GetDlgItem(hDlg, IDD_LAYOUT_PICTURE)) && (pData = (PLAYOUTBMP)GetProp(hCtrl, CPSUIPROP_LAYOUTPUSH))) {
FreeLayoutBmp(pData); RemoveProp(hCtrl, CPSUIPROP_LAYOUTPUSH); }
EnumChildWindows(hDlg, ChildWndCleanUp, 0);
DEL_PMYDLGPAGE(hDlg);
break; }
return(FALSE);
#undef pNMHdr
}
PLAYOUTBMP InitLayoutBmp( HWND hDlg, HANDLE hWnd, PTVWND pTVWnd ) /*++
Routine Description:
Loads bitmap resource and initializes array used in displaying layout preview
Arguments:
hDlg - Dialog handle hWnd - Handle to the preview window control pTVWnd - Treeview info
Return Value:
Pointer to LAYOUTBMP containing private settings
Author:
Revision History:
--*/ { PLAYOUTBMP pData;
if (!(pData = LocalAlloc(LMEM_FIXED, sizeof(LAYOUTBMP)))) {
return NULL;
}
if (!(LoadLayoutBmp(hDlg, &pData->Portrait, IDI_CPSUI_LAYOUT_BMP_PORTRAIT)) || !(LoadLayoutBmp(hDlg, &pData->BookletL, IDI_CPSUI_LAYOUT_BMP_BOOKLETL)) || !(LoadLayoutBmp(hDlg, &pData->BookletP, IDI_CPSUI_LAYOUT_BMP_BOOKLETP)) || !(LoadLayoutBmp(hDlg, &pData->ArrowL, IDI_CPSUI_LAYOUT_BMP_ARROWL)) || !(LoadLayoutBmp(hDlg, &pData->ArrowS, IDI_CPSUI_LAYOUT_BMP_ARROWS)) ) {
// something went wrong. cleanup...
FreeLayoutBmp(pData); return NULL; }
pData->hWnd = hWnd;
InitData(pData, pTVWnd);
return pData; }
BOOL LoadLayoutBmp( HWND hDlg, MYBMP * pMyBmpData, DWORD dwBitmapID )
/*++
Routine Description:
Load bitmap resource and get color table information, BITMAPINFOHEADER and offset to bits for bltting later.
Arguments:
Return Value:
Author:
Revision History:
--*/ { HANDLE hResource, hBitmap; LPBYTE lpBitmap; LPBITMAPINFOHEADER lpbmi; DWORD dwClrUsed;
if (!(hResource = FindResource(hInstDLL, MAKEINTRESOURCE(dwBitmapID), RT_BITMAP))){
return FALSE; }
if (!(hBitmap = LoadResource(hInstDLL, hResource))) {
return FALSE;
}
if (!(lpBitmap = LockResource(hBitmap))) {
FreeResource(hBitmap); return FALSE;
}
lpbmi = (LPBITMAPINFOHEADER)lpBitmap;
if (lpbmi->biSize == sizeof(BITMAPINFOHEADER)){
dwClrUsed = lpbmi->biClrUsed;
if (dwClrUsed == 0) {
switch(lpbmi->biBitCount){
case 1: dwClrUsed = 2; break;
case 4: dwClrUsed = 16; break;
case 8: dwClrUsed = 256; break;
default: dwClrUsed = 0; break;
} }
lpBitmap += lpbmi->biSize + (dwClrUsed * sizeof(RGBQUAD));
} else {
FreeResource(hBitmap); return FALSE;
}
pMyBmpData->hBitmap = hBitmap; pMyBmpData->lpbmi = lpbmi; pMyBmpData->lpBits = lpBitmap;
return TRUE; }
VOID DrawLayoutArrowAndText( HDC hDC, PRECT prcIn, PRECT prcOut, PLAYOUTBMP pData )
/*++
Routine Description:
This function draws the arrow and the Side1/Side2 text for the preview pages in duplex mode.
Arguments:
hDC - Screen DC prcIn - Describes the total drawable dimensions for the preview control prcOut - Pointer to RECT that describes the dimensions of the last page drawn pData - Private data, stores the bitmap information
Return Value:
None
--*/ {
LPBITMAPINFOHEADER lpbmi; LPBYTE lpBits; INT left, top, strx1,strx2, stry1, stry2; WCHAR awchBuf[MAX_RES_STR_CHARS]; HBITMAP hbm = NULL; HDC hdcMem = NULL; BOOL bArrowS;
if (pData->DuplexIdx == DUPLEX_SIMPLEX) return;
if ((pData->DuplexIdx == DUPLEX_LONGSIDE && pData->OrientIdx == ORIENT_PORTRAIT) || (pData->DuplexIdx == DUPLEX_SHORTSIDE && pData->OrientIdx != ORIENT_PORTRAIT)) {
if ((pData->NupIdx == NUP_TWOUP || pData->NupIdx == NUP_SIXUP)) bArrowS = TRUE; else bArrowS = FALSE; } else {
if ((pData->NupIdx == NUP_TWOUP || pData->NupIdx == NUP_SIXUP)) bArrowS = FALSE; else bArrowS = TRUE;
}
if (bArrowS) {
lpbmi = pData->ArrowS.lpbmi; lpBits = pData->ArrowS.lpBits; left = prcOut->right + SHADOW_SIZE*2; top = prcOut->top - (lpbmi->biHeight + SHADOW_SIZE)/2; strx1 = strx2 = prcIn->left + (prcIn->right - prcIn->left)/16 ; stry1 = prcIn->top; stry2 = stry1 + ((prcIn->bottom - prcIn->top) + SHADOW_SIZE)/2; } else {
lpbmi = pData->ArrowL.lpbmi; lpBits = pData->ArrowL.lpBits; left = prcIn->left + (prcOut->right - prcOut->left) + SHADOW_SIZE; top = prcOut->top + (prcOut->bottom - prcOut->top) + SHADOW_SIZE*2; strx1 = prcIn->left + (prcIn->right - prcIn->left)/6 - SHADOW_SIZE; stry1 = stry2 = prcIn->top + (prcIn->bottom - prcIn->top)/6 ; strx2 = strx1 + (prcIn->right - prcIn->left)/2;
}
if (!(hbm = CreateCompatibleBitmap(hDC, lpbmi->biWidth, lpbmi->biHeight)) || !(hdcMem = CreateCompatibleDC(hDC)) || !SelectObject(hdcMem, hbm)) { goto DrawArrowAndTextExit;
}
StretchDIBits(hdcMem, 0, 0, lpbmi->biWidth, lpbmi->biHeight, 0, 0, lpbmi->biWidth, lpbmi->biHeight, lpBits, (LPBITMAPINFO)lpbmi, DIB_RGB_COLORS, SRCCOPY );
TransparentBlt(hDC, left, top, lpbmi->biWidth, lpbmi->biHeight, hdcMem, 0, 0, lpbmi->biWidth, lpbmi->biHeight, RGB(255, 0, 255) );
//
// Draw the Text
//
LoadString(hInstDLL, IDS_CPSUI_SIDE1, awchBuf, MAX_RES_STR_CHARS); TextOut(hDC, strx1, stry1, awchBuf, wcslen(awchBuf));
LoadString(hInstDLL, IDS_CPSUI_SIDE2, awchBuf, MAX_RES_STR_CHARS); TextOut(hDC, strx2, stry2, awchBuf, wcslen(awchBuf));
DrawArrowAndTextExit:
if (hbm) DeleteObject(hbm); if (hdcMem) DeleteDC(hdcMem);
}
VOID UpdateLayoutBmp( HDC hDC, PLAYOUTBMP pData )
/*++
Routine Description:
Calls whenever we get a WM_DRAWITEM to draw owner drawn controls.
Arguments:
hDC - Handle to screen DC pData - Private data containing current selections etc.
Return Value:
None
Author:
Revision History:
Note:
PAGE_BOUNDARY_SCALE is 7 since it assumes that the destination control is a square where in portrait mode, the width of the dest window is 5/7 of the square and in landscape mode, the height of the dest window is 5/7 of the square. This is used to simplify the code for both scenarios. We just need to scale based on the orientation selected.
--*/ {
#define PAGE_BOUNDARY_SCALE 7
INT i, j, k, Row, Columm; BOOL bDoBooklet = FALSE; DWORD dwWidth, dwHeight, dwBookletLeft, dwBookletTop, dwOffset; RECT rcControlIn, rcControlOut; LPBITMAPINFOHEADER lpbmi; LPBYTE lpBits; HDC hCompDC; HBITMAP hCompBitmap; PAGEBORDER * pPageBorder; BYTE DuplexIdx;
//
// PageBorder represents the factor for calculating the
// left, top, right, bottom rectangle of the current selected duplex option
//
static PAGEBORDER PageBorderP[] = { { 4, 4, 2, 2 }, { 0, 4, 2, 2 }, { 2, 4, 2, 2 }, { 4, 0, 2, 2 }, { 4, 2, 2, 2 } };
static PAGEBORDER PageBorderL[] = { { 4, 4, 2, 2 }, { 4, 0, 2, 2 }, { 4, 2, 2, 2 }, { 0, 4, 2, 2 }, { 2, 4, 2, 2 } };
//
// Duplex represents the the start and end of rectangles to be drawn for
// the current selected duplex options.
// For example, to draw page border for Long Side duplexinng,
// Start with PageBorder[1] and End with PageBorder[3]
//
static DUPLEX Duplex[MAX_DUPLEX_OPTION] = { { 1, 3 }, // Long Side
{ 3, 5 }, // Short Side
{ 0, 1 } // Simplex
};
//
// Nup[] represents the row and columm for each Nup option
//
static NUP Nup[] = { { 1, 1 }, // 1-up
{ 2, 1 }, // 2-up
{ 2, 2 }, // 4-up
{ 3, 2 }, // 6-up
{ 3, 3 }, // 9-up
{ 4, 4 }, // 16-up
{ 1, 1 } // Booklet
};
GetClientRect(pData->hWnd, &rcControlIn); dwOffset = (rcControlIn.right - rcControlIn.left)/ PAGE_BOUNDARY_SCALE;
if (pData->OrientIdx == ORIENT_PORTRAIT){
if ((pData->NupIdx == NUP_TWOUP || pData->NupIdx == NUP_SIXUP)) { rcControlIn.top += dwOffset; rcControlIn.bottom -= dwOffset; pPageBorder =PageBorderL; } else { rcControlIn.left += dwOffset; rcControlIn.right -= dwOffset; pPageBorder =PageBorderP; }
}else {
if ((pData->NupIdx == NUP_TWOUP || pData->NupIdx == NUP_SIXUP)) { rcControlIn.left += dwOffset; rcControlIn.right -= dwOffset; pPageBorder =PageBorderP; } else { rcControlIn.top += dwOffset; rcControlIn.bottom -= dwOffset; pPageBorder =PageBorderL; }
}
CopyMemory(&rcControlOut, &rcControlIn, sizeof(RECT));
SetStretchBltMode(hDC, BLACKONWHITE);
if (bDoBooklet = (pData->NupIdx == NUP_BOOKLET)) DuplexIdx = DUPLEX_SIMPLEX; else DuplexIdx = pData->DuplexIdx;
for (k= Duplex[DuplexIdx].Start; k < Duplex[DuplexIdx].End; k++) {
DrawBorder(hDC, !bDoBooklet, !bDoBooklet, &rcControlIn, &rcControlOut, &pPageBorder[k] );
if (!bDoBooklet) {
rcControlOut.left += FRAME_BORDER; rcControlOut.right -= FRAME_BORDER; rcControlOut.top += FRAME_BORDER; rcControlOut.bottom -= FRAME_BORDER;
dwWidth = rcControlOut.right - rcControlOut.left; dwHeight = rcControlOut.bottom - rcControlOut.top;
lpBits = pData->Portrait.lpBits; lpbmi = pData->Portrait.lpbmi;
if (pData->OrientIdx == ORIENT_PORTRAIT) {
Row = Nup[pData->NupIdx].row; Columm = Nup[pData->NupIdx].columm;
} else {
Row = Nup[pData->NupIdx].columm; Columm = Nup[pData->NupIdx].row;
}
if ((pData->NupIdx == NUP_TWOUP || pData->NupIdx == NUP_SIXUP)) { i = Row; Row = Columm; Columm = i; }
dwWidth /= Columm; dwHeight /= Row;
} else {
dwBookletLeft = rcControlOut.left; dwBookletTop = rcControlOut.top;
if (pData->OrientIdx == ORIENT_PORTRAIT) {
lpBits = pData->BookletP.lpBits; lpbmi = pData->BookletP.lpbmi; dwWidth = pData->BookletP.lpbmi->biWidth; dwHeight = pData->BookletP.lpbmi->biHeight; rcControlOut.right = rcControlOut.left + dwWidth; rcControlOut.bottom = rcControlOut.top + dwHeight; rcControlOut.top = rcControlOut.top + dwHeight/5;
} else {
lpBits = pData->BookletL.lpBits; lpbmi = pData->BookletL.lpbmi; dwWidth = pData->BookletL.lpbmi->biWidth; dwHeight = pData->BookletL.lpbmi->biHeight; rcControlOut.right = rcControlOut.left + dwWidth; rcControlOut.bottom = rcControlOut.top + dwHeight; rcControlOut.left = rcControlOut.left + dwWidth/5;
} }
hCompDC = CreateCompatibleDC(hDC); hCompBitmap = CreateCompatibleBitmap(hDC, dwWidth, dwHeight);
if (!hCompDC || !hCompBitmap) return;
SelectObject(hCompDC, hCompBitmap);
StretchDIBits(hCompDC, 0, 0, dwWidth, dwHeight, 0, 0, lpbmi->biWidth, lpbmi->biHeight, lpBits, (LPBITMAPINFO)lpbmi, DIB_RGB_COLORS, SRCCOPY );
if (bDoBooklet) {
DrawBorder(hDC, TRUE, FALSE, NULL, &rcControlOut, NULL );
TransparentBlt(hDC, dwBookletLeft, dwBookletTop , dwWidth, dwHeight, hCompDC, 0, 0, dwWidth, dwHeight, RGB(255, 0, 255) );
} else {
for ( i = 0; i < Row; i++) {
for (j = 0; j < Columm; j++) {
BitBlt( hDC, rcControlOut.left + dwWidth*j , rcControlOut.top + dwHeight*i, dwWidth, dwHeight, hCompDC, 0, 0, SRCCOPY ); } } } DeleteObject(hCompBitmap); DeleteDC(hCompDC);
}
if (!bDoBooklet) DrawLayoutArrowAndText(hDC,&rcControlIn, &rcControlOut, pData);
}
VOID FreeLayoutBmp( PLAYOUTBMP pData )
/*++
Routine Description:
Unlock and Free Resources and free memory allocated for pData
Arguments:
Return Value:
Author:
Revision History:
--*/ {
if (pData){ UnlockResource(pData->Portrait.hBitmap); UnlockResource(pData->BookletL.hBitmap); UnlockResource(pData->BookletP.hBitmap); UnlockResource(pData->ArrowL.hBitmap); UnlockResource(pData->ArrowS.hBitmap); FreeResource(pData->Portrait.hBitmap); FreeResource(pData->BookletL.hBitmap); FreeResource(pData->BookletP.hBitmap); FreeResource(pData->ArrowL.hBitmap); FreeResource(pData->ArrowS.hBitmap);
LocalFree(pData); } }
VOID DrawBorder( HDC hDC, BOOL bDrawShadow, BOOL bDrawBorder, PRECT pRectIn, PRECT pRectOut, PAGEBORDER * pPageBorder ) /*++
Routine Description:
Draw the page border for the preview bitmap
Arguments:
Return Value:
Author:
Revision History:
--*/ { HPEN hOldPen, hPen; HBRUSH hBrush; DWORD dwWidth, dwHeight; RECT rcShadow;
hPen = GetStockObject(BLACK_PEN); hBrush = GetStockObject(GRAY_BRUSH); hOldPen = (HPEN) SelectObject(hDC, hPen);
if (pPageBorder) {
dwWidth = pRectIn->right - pRectIn->left ; dwHeight = pRectIn->bottom - pRectIn->top ;
pRectOut->left = pRectIn->left + ADDOFFSET(dwWidth ,pPageBorder->left); pRectOut->top = pRectIn->top + ADDOFFSET(dwHeight,pPageBorder->top); pRectOut->right = pRectOut->left + ADDOFFSET(dwWidth ,pPageBorder->right) ; pRectOut->bottom = pRectOut->top + ADDOFFSET(dwHeight,pPageBorder->bottom); }
if (bDrawBorder) {
InflateRect(pRectOut, -5, -5);
SelectObject ( hDC, hPen); Rectangle( hDC, pRectOut->left, pRectOut->top, pRectOut->right , pRectOut->bottom ); }
if (bDrawShadow) {
rcShadow.left = pRectOut->right; rcShadow.top = pRectOut->top + SHADOW_SIZE; rcShadow.right = pRectOut->right + SHADOW_SIZE; rcShadow.bottom = pRectOut->bottom + SHADOW_SIZE;
FillRect(hDC, &rcShadow, hBrush);
rcShadow.left = pRectOut->left + SHADOW_SIZE; rcShadow.top = pRectOut->bottom; rcShadow.right = pRectOut->right + SHADOW_SIZE; rcShadow.bottom = pRectOut->bottom + SHADOW_SIZE;
FillRect(hDC, &rcShadow, hBrush); }
SelectObject ( hDC, hOldPen);
if (hPen) { DeleteObject ( hPen ); }
if (hBrush) { DeleteObject ( hBrush ); } }
VOID InvalidateBMP( HWND hDlg, PTVWND pTVWnd ) /*++
Routine Description:
Call InvalidateRect to get WM_DRAWITEM to update preview.
Arguments:
Return Value:
Author:
Revision History:
--*/ { HWND hWnd; PLAYOUTBMP pData;
if ((hWnd = GetDlgItem(hDlg, IDD_LAYOUT_PICTURE)) && (pData = (PLAYOUTBMP)GetProp(hWnd, CPSUIPROP_LAYOUTPUSH))) {
UpdateData(pData, pTVWnd); InvalidateRect(hWnd, NULL, TRUE); } }
VOID InitData( PLAYOUTBMP pData, PTVWND pTVWnd ) /*++
Routine Description:
Arguments:
Return Value:
Author:
Revision History:
--*/ { UINT Idx, Count, i; POPTTYPE pOptType; POPTPARAM pOptParam;
POPTITEM pItem = pTVWnd->ComPropSheetUI.pOptItem;
pData->OrientIdx = ORIENT_PORTRAIT; pData->NupIdx = NUP_ONEUP; pData->DuplexIdx = DUPLEX_SIMPLEX;
if (pItem = GET_PITEMDMPUB(pTVWnd, DMPUB_ORIENTATION, Idx)) {
pOptType = pItem->pOptType; pOptParam = pOptType->pOptParam; Count = pOptType->Count;
for ( i = 0; i < Count; i++) {
switch (pOptParam->IconID) {
case IDI_CPSUI_PORTRAIT:
pData->Orientation.PortraitIdx = (BYTE)i; break;
case IDI_CPSUI_LANDSCAPE:
pData->Orientation.LandscapeIdx = (BYTE)i; break;
case IDI_CPSUI_ROT_LAND:
pData->Orientation.RotateIdx = (BYTE)i; break;
} pOptParam++; }
}
if (pItem = GET_PITEMDMPUB(pTVWnd, DMPUB_DUPLEX, Idx)) {
pOptType = pItem->pOptType; pOptParam = pOptType->pOptParam; Count = pOptType->Count;
for ( i = 0; i < Count; i++) {
switch (pOptParam->IconID) {
case IDI_CPSUI_DUPLEX_NONE: case IDI_CPSUI_DUPLEX_NONE_L:
pData->Duplex.SimplexIdx = (BYTE)i; break;
case IDI_CPSUI_DUPLEX_HORZ: case IDI_CPSUI_DUPLEX_HORZ_L:
pData->Duplex.ShortSideIdx = (BYTE)i; break;
case IDI_CPSUI_DUPLEX_VERT: case IDI_CPSUI_DUPLEX_VERT_L:
pData->Duplex.LongSideIdx = (BYTE)i; break; }
pOptParam++;
}
} }
VOID UpdateData( PLAYOUTBMP pData, PTVWND pTVWnd ) /*++
Routine Description:
Arguments:
Return Value:
Author:
Revision History:
--*/ {
POPTITEM pItem = pTVWnd->ComPropSheetUI.pOptItem; UINT Idx;
if (pItem = GET_PITEMDMPUB(pTVWnd, DMPUB_DUPLEX, Idx)) {
if ((BYTE)pItem->Sel == pData->Duplex.SimplexIdx) {
pData->DuplexIdx = DUPLEX_SIMPLEX;
} else if ((BYTE)pItem->Sel == pData->Duplex.LongSideIdx) {
pData->DuplexIdx = DUPLEX_LONGSIDE;
} else if ((BYTE)pItem->Sel == pData->Duplex.ShortSideIdx) {
pData->DuplexIdx = DUPLEX_SHORTSIDE;
}
}
if (pItem = GET_PITEMDMPUB(pTVWnd, DMPUB_ORIENTATION, Idx)) {
if ((BYTE)pItem->Sel == pData->Orientation.PortraitIdx) {
pData->OrientIdx = ORIENT_PORTRAIT;
} else if ((BYTE)pItem->Sel == pData->Orientation.LandscapeIdx) {
pData->OrientIdx = ORIENT_LANDSCAPE;
} else if ((BYTE)pItem->Sel == pData->Orientation.RotateIdx) {
pData->OrientIdx = ORIENT_ROTATED;
}
}
if (pItem = GET_PITEMDMPUB(pTVWnd, DMPUB_NUP, Idx)) {
pData->NupIdx = (BYTE)pItem->Sel;
}
}
|