📄 rebar.c
字号:
lpBand->rcBand.left = x + xsep;
/* compute new width */
if ((lpBand->hwndChild && extra) && !(lpBand->fStyle & RBBS_FIXEDSIZE)) {
/* set to the "current" band size less the header */
fudge = lpBand->ccx;
last_adjusted = i;
if ((lpBand->fMask & RBBIM_SIZE) && (lpBand->cx > 0) &&
(fudge > curwidth)) {
TRACE("adjusting band %d by %d, fudge=%d, curwidth=%d, extra=%d\n",
i, fudge-curwidth, fudge, curwidth, extra);
if ((fudge - curwidth) > extra)
fudge = curwidth + extra;
extra -= (fudge - curwidth);
curwidth = fudge;
}
else {
TRACE("adjusting band %d by %d, fudge=%d, curwidth=%d\n",
i, extra, fudge, curwidth);
curwidth += extra;
extra = 0;
}
}
/* set new right/bottom point */
if (infoPtr->dwStyle & CCS_VERT)
lpBand->rcBand.bottom = lpBand->rcBand.top + curwidth;
else
lpBand->rcBand.right = lpBand->rcBand.left + curwidth;
TRACE("Phase 1 band %d, (%d,%d)-(%d,%d), orig x=%d, xsep=%d\n",
i, lpBand->rcBand.left, lpBand->rcBand.top,
lpBand->rcBand.right, lpBand->rcBand.bottom, x, xsep);
x = rcBrb(lpBand);
}
if ((x >= maxx) || (last_adjusted != -1)) {
if (x > maxx) {
ERR("Phase 1 failed, x=%d, maxx=%d, start=%u, end=%u\n",
x, maxx, rowstart, rowend);
}
/* done, so spread extra space */
if (x < maxx) {
fudge = maxx - x;
TRACE("Need to spread %d on last adjusted band %d\n",
fudge, last_adjusted);
for (i=(INT)last_adjusted; i<=(INT)rowend; i++) {
lpBand = &infoPtr->bands[i];
if (HIDDENBAND(lpBand)) continue;
/* set right/bottom point */
if (i != last_adjusted) {
if (infoPtr->dwStyle & CCS_VERT)
lpBand->rcBand.top += fudge;
else
lpBand->rcBand.left += fudge;
}
/* set left/bottom point */
if (infoPtr->dwStyle & CCS_VERT)
lpBand->rcBand.bottom += fudge;
else
lpBand->rcBand.right += fudge;
}
}
TRACE("Phase 1 succeeded, used x=%d\n", x);
REBAR_FixVert (infoPtr, rowstart, rowend, mcy);
return;
}
/* ******************* Phase 2 ************************ */
/* Alg: */
/* Find first visible band, put all */
/* extra space there. */
/* */
/* ****************************************************** */
x = 0;
for (i=(INT)rowstart; i<=(INT)rowend; i++) {
lpBand = &infoPtr->bands[i];
if (HIDDENBAND(lpBand)) continue;
xsep = (x == 0) ? 0 : SEP_WIDTH;
curwidth = rcBw(lpBand);
/* set new left/top point */
if (infoPtr->dwStyle & CCS_VERT)
lpBand->rcBand.top = x + xsep;
else
lpBand->rcBand.left = x + xsep;
/* compute new width */
if (extra) {
curwidth += extra;
extra = 0;
}
/* set new right/bottom point */
if (infoPtr->dwStyle & CCS_VERT)
lpBand->rcBand.bottom = lpBand->rcBand.top + curwidth;
else
lpBand->rcBand.right = lpBand->rcBand.left + curwidth;
TRACE("Phase 2 band %d, (%d,%d)-(%d,%d), orig x=%d, xsep=%d\n",
i, lpBand->rcBand.left, lpBand->rcBand.top,
lpBand->rcBand.right, lpBand->rcBand.bottom, x, xsep);
x = rcBrb(lpBand);
}
if (x >= maxx) {
if (x > maxx) {
ERR("Phase 2 failed, x=%d, maxx=%d, start=%u, end=%u\n",
x, maxx, rowstart, rowend);
}
/* done, so spread extra space */
TRACE("Phase 2 succeeded, used x=%d\n", x);
REBAR_FixVert (infoPtr, rowstart, rowend, mcy);
return;
}
/* ******************* Phase 3 ************************ */
/* at this point everything is back to ->cxHeader values */
/* and should not have gotten here. */
/* ****************************************************** */
lpBand = &infoPtr->bands[rowstart];
ERR("Serious problem adjusting row %d, start band %d, end band %d\n",
lpBand->iRow, rowstart, rowend);
REBAR_DumpBand (infoPtr);
return;
}
static void
REBAR_CalcHorzBand (REBAR_INFO *infoPtr, UINT rstart, UINT rend, BOOL notify)
/* Function: this routine initializes all the rectangles in */
/* each band in a row to fit in the adjusted rcBand rect. */
/* *** Supports only Horizontal bars. *** */
{
REBAR_BAND *lpBand;
UINT i, xoff, yoff;
HWND parenthwnd;
RECT oldChild, work;
/* MS seems to use GetDlgCtrlID() for above GetWindowLong call */
parenthwnd = GetParent (infoPtr->hwndSelf);
for(i=rstart; i<rend; i++){
lpBand = &infoPtr->bands[i];
if (HIDDENBAND(lpBand)) {
SetRect (&lpBand->rcChild,
lpBand->rcBand.right, lpBand->rcBand.top,
lpBand->rcBand.right, lpBand->rcBand.bottom);
continue;
}
oldChild = lpBand->rcChild;
/* set initial gripper rectangle */
SetRect (&lpBand->rcGripper, lpBand->rcBand.left, lpBand->rcBand.top,
lpBand->rcBand.left, lpBand->rcBand.bottom);
/* calculate gripper rectangle */
if ( lpBand->fStatus & HAS_GRIPPER) {
lpBand->fDraw |= DRAW_GRIPPER;
lpBand->rcGripper.left += REBAR_PRE_GRIPPER;
lpBand->rcGripper.right = lpBand->rcGripper.left + GRIPPER_WIDTH;
lpBand->rcGripper.top += 2;
lpBand->rcGripper.bottom -= 2;
SetRect (&lpBand->rcCapImage,
lpBand->rcGripper.right+REBAR_ALWAYS_SPACE, lpBand->rcBand.top,
lpBand->rcGripper.right+REBAR_ALWAYS_SPACE, lpBand->rcBand.bottom);
}
else { /* no gripper will be drawn */
xoff = 0;
if (lpBand->fStatus & (HAS_IMAGE | HAS_TEXT))
/* if no gripper but either image or text, then leave space */
xoff = REBAR_ALWAYS_SPACE;
SetRect (&lpBand->rcCapImage,
lpBand->rcBand.left+xoff, lpBand->rcBand.top,
lpBand->rcBand.left+xoff, lpBand->rcBand.bottom);
}
/* image is visible */
if (lpBand->fStatus & HAS_IMAGE) {
lpBand->fDraw |= DRAW_IMAGE;
lpBand->rcCapImage.right += infoPtr->imageSize.cx;
lpBand->rcCapImage.bottom = lpBand->rcCapImage.top + infoPtr->imageSize.cy;
/* set initial caption text rectangle */
SetRect (&lpBand->rcCapText,
lpBand->rcCapImage.right+REBAR_POST_IMAGE, lpBand->rcBand.top+1,
lpBand->rcBand.left+lpBand->cxHeader, lpBand->rcBand.bottom-1);
/* update band height
if (lpBand->uMinHeight < infoPtr->imageSize.cy + 2) {
lpBand->uMinHeight = infoPtr->imageSize.cy + 2;
lpBand->rcBand.bottom = lpBand->rcBand.top + lpBand->uMinHeight;
} */
}
else {
/* set initial caption text rectangle */
SetRect (&lpBand->rcCapText, lpBand->rcCapImage.right, lpBand->rcBand.top+1,
lpBand->rcBand.left+lpBand->cxHeader, lpBand->rcBand.bottom-1);
}
/* text is visible */
if ((lpBand->fStatus & HAS_TEXT) && !(lpBand->fStyle & RBBS_HIDETITLE)) {
lpBand->fDraw |= DRAW_TEXT;
lpBand->rcCapText.right = max(lpBand->rcCapText.left,
lpBand->rcCapText.right-REBAR_POST_TEXT);
}
/* set initial child window rectangle if there is a child */
if (lpBand->fMask & RBBIM_CHILD) {
xoff = lpBand->offChild.cx;
yoff = lpBand->offChild.cy;
SetRect (&lpBand->rcChild,
lpBand->rcBand.left+lpBand->cxHeader, lpBand->rcBand.top+yoff,
lpBand->rcBand.right-xoff, lpBand->rcBand.bottom-yoff);
if ((lpBand->fStyle & RBBS_USECHEVRON) && (lpBand->rcChild.right - lpBand->rcChild.left < lpBand->cxIdeal))
{
lpBand->rcChild.right -= CHEVRON_WIDTH;
SetRect(&lpBand->rcChevron, lpBand->rcChild.right,
lpBand->rcChild.top, lpBand->rcChild.right + CHEVRON_WIDTH,
lpBand->rcChild.bottom);
}
}
else {
SetRect (&lpBand->rcChild,
lpBand->rcBand.left+lpBand->cxHeader, lpBand->rcBand.top,
lpBand->rcBand.right, lpBand->rcBand.bottom);
}
/* flag if notify required and invalidate rectangle */
if (notify &&
((oldChild.right-oldChild.left != lpBand->rcChild.right-lpBand->rcChild.left) ||
(oldChild.bottom-oldChild.top != lpBand->rcChild.bottom-lpBand->rcChild.top))) {
TRACE("Child rectangle changed for band %u\n", i);
TRACE(" from (%d,%d)-(%d,%d) to (%d,%d)-(%d,%d)\n",
oldChild.left, oldChild.top,
oldChild.right, oldChild.bottom,
lpBand->rcChild.left, lpBand->rcChild.top,
lpBand->rcChild.right, lpBand->rcChild.bottom);
}
if (lpBand->fDraw & NTF_INVALIDATE) {
TRACE("invalidating (%d,%d)-(%d,%d)\n",
lpBand->rcBand.left,
lpBand->rcBand.top,
lpBand->rcBand.right + ((lpBand->fDraw & DRAW_RIGHTSEP) ? SEP_WIDTH_SIZE : 0),
lpBand->rcBand.bottom + ((lpBand->fDraw & DRAW_BOTTOMSEP) ? SEP_WIDTH_SIZE : 0));
lpBand->fDraw &= ~NTF_INVALIDATE;
work = lpBand->rcBand;
if (lpBand->fDraw & DRAW_RIGHTSEP) work.right += SEP_WIDTH_SIZE;
if (lpBand->fDraw & DRAW_BOTTOMSEP) work.bottom += SEP_WIDTH_SIZE;
InvalidateRect(infoPtr->hwndSelf, &work, TRUE);
}
}
}
static VOID
REBAR_CalcVertBand (REBAR_INFO *infoPtr, UINT rstart, UINT rend, BOOL notify)
/* Function: this routine initializes all the rectangles in */
/* each band in a row to fit in the adjusted rcBand rect. */
/* *** Supports only Vertical bars. *** */
{
REBAR_BAND *lpBand;
UINT i, xoff, yoff;
HWND parenthwnd;
RECT oldChild, work;
/* MS seems to use GetDlgCtrlID() for above GetWindowLong call */
parenthwnd = GetParent (infoPtr->hwndSelf);
for(i=rstart; i<rend; i++){
lpBand = &infoPtr->bands[i];
if (HIDDENBAND(lpBand)) continue;
oldChild = lpBand->rcChild;
/* set initial gripper rectangle */
SetRect (&lpBand->rcGripper, lpBand->rcBand.left, lpBand->rcBand.top,
lpBand->rcBand.right, lpBand->rcBand.top);
/* calculate gripper rectangle */
if (lpBand->fStatus & HAS_GRIPPER) {
lpBand->fDraw |= DRAW_GRIPPER;
if (infoPtr->dwStyle & RBS_VERTICALGRIPPER) {
/* vertical gripper */
lpBand->rcGripper.left += 3;
lpBand->rcGripper.right = lpBand->rcGripper.left + GRIPPER_WIDTH;
lpBand->rcGripper.top += REBAR_PRE_GRIPPER;
lpBand->rcGripper.bottom = lpBand->rcGripper.top + GRIPPER_HEIGHT;
/* initialize Caption image rectangle */
SetRect (&lpBand->rcCapImage, lpBand->rcBand.left,
lpBand->rcGripper.bottom + REBAR_ALWAYS_SPACE,
lpBand->rcBand.right,
lpBand->rcGripper.bottom + REBAR_ALWAYS_SPACE);
}
else {
/* horizontal gripper */
lpBand->rcGripper.left += 2;
lpBand->rcGripper.right -= 2;
lpBand->rcGripper.top += REBAR_PRE_GRIPPER;
lpBand->rcGripper.bottom = lpBand->rcGripper.top + GRIPPER_WIDTH;
/* initialize Caption image rectangle */
SetRect (&lpBand->rcCapImage, lpBand->rcBand.left,
lpBand->rcGripper.bottom + REBAR_ALWAYS_SPACE,
lpBand->rcBand.right,
lpBand->rcGripper.bottom + REBAR_ALWAYS_SPACE);
}
}
else { /* no gripper will be drawn */
xoff = 0;
if (lpBand->fStatus & (HAS_IMAGE | HAS_TEXT))
/* if no gripper but either image or text, then leave space */
xoff = REBAR_ALWAYS_SPACE;
/* initialize Caption image rectangle */
SetRect (&lpBand->rcCapImage,
lpBand->rcBand.left, lpBand->rcBand.top+xoff,
lpBand->rcBand.right, lpBand->rcBand.top+xoff);
}
/* image is visible */
if (lpBand->fStatus & HAS_IMAGE) {
lpBand->fDraw |= DRAW_IMAGE;
lpBand->rcCapImage.right = lpBand->rcCapImage.left + infoPtr->imageSize.cx;
lpBand->rcCapImage.bottom += infoPtr->imageSize.cy;
/* set initial caption text rectangle */
SetRect (&lpBand->rcCapText,
lpBand->rcBand.left, lpBand->rcCapImage.bottom+REBAR_POST_IMAGE,
lpBand->rcBand.right, lpBand->rcBand.top+lpBand->cxHeader);
/* update band height *
if (lpBand->uMinHeight < infoPtr->imageSize.cx + 2) {
lpBand->uMinHeight = infoPtr->imageSize.cx + 2;
lpBand->rcBand.right = lpBand->rcBand.left + lpBand->uMinHeight;
} */
}
else {
/* set initial caption text rectangle */
SetRect (&lpBand->rcCapText,
lpBand->rcBand.left, lpBand->rcCapImage.bottom,
lpBand->rcBand.right, lpBand->rcBand.top+lpBand->cxHeader);
}
/* text is visible */
if ((lpBand->fStatus & HAS_TEXT) && !(lpBand->fStyle & RBBS_HIDETITLE)) {
lpBand->fDraw |= DRAW_TEXT;
lpBand->rcCapText.bottom = max(lpBand->rcCapText.top,
lpBand->rcCapText.bottom);
}
/* set initial child window rectangle if there is a child */
if (lpBand->fMask & RBBIM_CHILD) {
yoff = lpBand->offChild.cx;
xoff = lpBand->offChild.cy;
SetRect (&lpBand->rcChild,
lpBand->rcBand.left+xoff, lpBand->rcBand.top+lpBand->cxHeader,
lpBand->rcBand.right-xoff, lpBand->rcBand.bottom-yoff);
}
else {
SetRect (&lpBand->rcChild,
lpBand->rcBand.left, lpBand->rcBand.top+lpBand->cxHeader,
lpBand->rcBand.right, lpBand->rcBand.bottom);
}
/* flag if notify required and invalidate rectangle */
if (notify &&
((oldChild.right-oldChild.left != lpBand->rcChild.right-lpBand->rcChild.left) ||
(oldChild.bottom-oldChild.top != lpBand->rcChild.bottom-lpBand->rcChild.top))) {
TRACE("Child rectangle changed for band %u\n", i);
TRACE(" from (%d,%d)-(%d,%d) to (%d,%d)-(%d,%d)\n",
oldChild.left, oldChild.top,
oldChild.right, oldChild.bottom,
lpBand->rcChild.left, lpBand->rcChild.top,
lpBand->rcChild.right, lpBand->rcChild.bottom);
}
if (lpBand->fDraw & NTF_INVALIDATE) {
TRACE("invalidating (%d,%d)-(%d,%d)\n",
lpBand->rcBand.left,
lpBand->rcBand.top,
lpBand->rcBand.right + ((lpBand->fDraw & DRAW_BOTTOMSEP) ? SEP_WIDTH_SIZE : 0),
lpBand->rcBand.bottom + ((lpBand->fDraw & DRAW_RIGHTSEP) ? SEP_WIDTH_SIZE : 0));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -