Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
fc58ef81
Commit
fc58ef81
authored
Nov 09, 2003
by
Robert Shearman
Committed by
Alexandre Julliard
Nov 09, 2003
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added chevron support.
parent
a7c4fa81
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
270 additions
and
72 deletions
+270
-72
rebar.c
dlls/comctl32/rebar.c
+251
-72
commctrl.h
include/commctrl.h
+19
-0
No files found.
dlls/comctl32/rebar.c
View file @
fc58ef81
...
...
@@ -119,7 +119,7 @@
*
* Still to do:
* 2. Following still not handled: RBBS_FIXEDBMP,
*
RBBS_USECHEVRON,
CCS_NORESIZE,
* CCS_NORESIZE,
* CCS_NOMOVEX, CCS_NOMOVEY
* 3. Following are only partially handled:
* RBS_AUTOSIZE, RBBS_VARIABLEHEIGHT
...
...
@@ -136,7 +136,7 @@
* WM_SYSCOLORCHANGE, WM_VKEYTOITEM, WM_WININICHANGE
* 7. The following notifications are not implemented:
* NM_CUSTOMDRAW, NM_RELEASEDCAPTURE
* RB
_CHEVRONPUSHED, RB
N_MINMAX
* RBN_MINMAX
*/
#include <stdarg.h>
...
...
@@ -194,6 +194,7 @@ typedef struct
RECT
rcCapImage
;
/* calculated caption image rectangle */
RECT
rcCapText
;
/* calculated caption text rectangle */
RECT
rcChild
;
/* calculated child rectangle */
RECT
rcChevron
;
/* calculated chevron rectangle */
LPWSTR
lpText
;
HWND
hwndPrevParent
;
...
...
@@ -210,6 +211,8 @@ typedef struct
#define DRAW_TEXT 0x00000004
#define DRAW_RIGHTSEP 0x00000010
#define DRAW_BOTTOMSEP 0x00000020
#define DRAW_CHEVRONHOT 0x00000040
#define DRAW_CHEVRONPUSHED 0x00000080
#define NTF_INVALIDATE 0x01000000
typedef
struct
...
...
@@ -248,9 +251,11 @@ typedef struct
INT
iVersion
;
/* version number */
POINTS
dragStart
;
/* x,y of button down */
POINTS
dragNow
;
/* x,y of this MouseMove */
INT
i
hitBand
;
/* band number of band whose gripper was grabbed
*/
INT
i
OldBand
;
/* last band that had the mouse cursor over it
*/
INT
ihitoffset
;
/* offset of hotspot from gripper.left */
POINT
origin
;
/* left/upper corner of client */
INT
ichevronhotBand
;
/* last band that had a hot chevron */
INT
iGrabbedBand
;
/* band number of band whose gripper was grabbed */
REBAR_ROW
*
rows
;
/* pointer to row indexes */
REBAR_BAND
*
bands
;
/* pointer to the array of rebar bands */
...
...
@@ -293,6 +298,9 @@ typedef struct
/* if present. */
#define GRIPPER_WIDTH 3
/* Width of the chevron button if present */
#define CHEVRON_WIDTH 10
/* Height of divider for Rebar if not disabled (CCS_NODIVIDER) */
/* either top or bottom */
#define REBAR_DIVIDER 2
...
...
@@ -437,10 +445,10 @@ REBAR_DumpBand (REBAR_INFO *iP)
TRACE
(
"hwnd=%p: color=%08lx/%08lx, bands=%u, rows=%u, cSize=%ld,%ld
\n
"
,
iP
->
hwndSelf
,
iP
->
clrText
,
iP
->
clrBk
,
iP
->
uNumBands
,
iP
->
uNumRows
,
iP
->
calcSize
.
cx
,
iP
->
calcSize
.
cy
);
TRACE
(
"hwnd=%p: flags=%08x, dragStart=%d,%d, dragNow=%d,%d, i
hit
Band=%d
\n
"
,
TRACE
(
"hwnd=%p: flags=%08x, dragStart=%d,%d, dragNow=%d,%d, i
Grabbed
Band=%d
\n
"
,
iP
->
hwndSelf
,
iP
->
fStatus
,
iP
->
dragStart
.
x
,
iP
->
dragStart
.
y
,
iP
->
dragNow
.
x
,
iP
->
dragNow
.
y
,
iP
->
i
hit
Band
);
iP
->
i
Grabbed
Band
);
TRACE
(
"hwnd=%p: style=%08lx, I'm Unicode=%s, notify in Unicode=%s, redraw=%s
\n
"
,
iP
->
hwndSelf
,
iP
->
dwStyle
,
(
iP
->
bUnicode
)
?
"TRUE"
:
"FALSE"
,
(
iP
->
NtfUnicode
)
?
"TRUE"
:
"FALSE"
,
(
iP
->
DoRedraw
)
?
"TRUE"
:
"FALSE"
);
...
...
@@ -484,6 +492,25 @@ REBAR_DumpBand (REBAR_INFO *iP)
}
static
void
REBAR_DrawChevron
(
HDC
hdc
,
INT
left
,
INT
top
,
INT
colorRef
)
{
INT
x
,
y
;
HPEN
hPen
,
hOldPen
;
if
(
!
(
hPen
=
CreatePen
(
PS_SOLID
,
1
,
GetSysColor
(
colorRef
))))
return
;
hOldPen
=
SelectObject
(
hdc
,
hPen
);
x
=
left
+
2
;
y
=
top
;
MoveToEx
(
hdc
,
x
,
y
,
NULL
);
LineTo
(
hdc
,
x
+
5
,
y
++
);
x
++
;
MoveToEx
(
hdc
,
x
,
y
,
NULL
);
LineTo
(
hdc
,
x
+
3
,
y
++
);
x
++
;
MoveToEx
(
hdc
,
x
,
y
,
NULL
);
LineTo
(
hdc
,
x
+
1
,
y
++
);
SelectObject
(
hdc
,
hOldPen
);
DeleteObject
(
hPen
);
}
static
HWND
REBAR_GetNotifyParent
(
REBAR_INFO
*
infoPtr
)
...
...
@@ -613,6 +640,22 @@ REBAR_DrawBand (HDC hdc, REBAR_INFO *infoPtr, REBAR_BAND *lpBand)
SelectObject
(
hdc
,
hOldFont
);
}
if
(
!
IsRectEmpty
(
&
lpBand
->
rcChevron
))
{
if
(
lpBand
->
fDraw
&
DRAW_CHEVRONPUSHED
)
{
DrawEdge
(
hdc
,
&
lpBand
->
rcChevron
,
BDR_SUNKENOUTER
,
BF_RECT
|
BF_MIDDLE
);
REBAR_DrawChevron
(
hdc
,
lpBand
->
rcChevron
.
left
+
1
,
lpBand
->
rcChevron
.
top
+
11
,
COLOR_WINDOWFRAME
);
}
else
if
(
lpBand
->
fDraw
&
DRAW_CHEVRONHOT
)
{
DrawEdge
(
hdc
,
&
lpBand
->
rcChevron
,
BDR_RAISEDINNER
,
BF_RECT
|
BF_MIDDLE
);
REBAR_DrawChevron
(
hdc
,
lpBand
->
rcChevron
.
left
,
lpBand
->
rcChevron
.
top
+
10
,
COLOR_WINDOWFRAME
);
}
else
REBAR_DrawChevron
(
hdc
,
lpBand
->
rcChevron
.
left
,
lpBand
->
rcChevron
.
top
+
10
,
COLOR_WINDOWFRAME
);
}
if
(
lpBand
->
uCDret
==
(
CDRF_NOTIFYPOSTPAINT
|
CDRF_NOTIFYITEMDRAW
))
{
nmcd
.
dwDrawStage
=
CDDS_ITEMPOSTPAINT
;
nmcd
.
hdc
=
hdc
;
...
...
@@ -954,6 +997,13 @@ REBAR_CalcHorzBand (REBAR_INFO *infoPtr, UINT rstart, UINT rend, BOOL notify)
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
,
...
...
@@ -1431,6 +1481,8 @@ REBAR_Layout (REBAR_INFO *infoPtr, LPRECT lpRect, BOOL notify, BOOL resetclient)
lpBand
->
fDraw
=
0
;
lpBand
->
iRow
=
row
;
SetRectEmpty
(
&
lpBand
->
rcChevron
);
if
(
HIDDENBAND
(
lpBand
))
continue
;
lpBand
->
rcoldBand
=
lpBand
->
rcBand
;
...
...
@@ -2207,7 +2259,7 @@ REBAR_InternalEraseBkGnd (REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam, REC
}
static
void
REBAR_InternalHitTest
(
REBAR_INFO
*
infoPtr
,
LPPOINT
lpPt
,
UINT
*
pFlags
,
INT
*
pBand
)
REBAR_InternalHitTest
(
REBAR_INFO
*
infoPtr
,
const
LPPOINT
lpPt
,
UINT
*
pFlags
,
INT
*
pBand
)
{
REBAR_BAND
*
lpBand
;
RECT
rect
;
...
...
@@ -2227,7 +2279,6 @@ REBAR_InternalHitTest (REBAR_INFO *infoPtr, LPPOINT lpPt, UINT *pFlags, INT *pBa
}
else
{
/* somewhere inside */
infoPtr
->
ihitBand
=
-
1
;
for
(
iCount
=
0
;
iCount
<
infoPtr
->
uNumBands
;
iCount
++
)
{
lpBand
=
&
infoPtr
->
bands
[
iCount
];
if
(
HIDDENBAND
(
lpBand
))
continue
;
...
...
@@ -2236,7 +2287,6 @@ REBAR_InternalHitTest (REBAR_INFO *infoPtr, LPPOINT lpPt, UINT *pFlags, INT *pBa
*
pBand
=
iCount
;
if
(
PtInRect
(
&
lpBand
->
rcGripper
,
*
lpPt
))
{
*
pFlags
=
RBHT_GRABBER
;
infoPtr
->
ihitBand
=
iCount
;
TRACE
(
"ON GRABBER %d
\n
"
,
iCount
);
return
;
}
...
...
@@ -2255,6 +2305,11 @@ REBAR_InternalHitTest (REBAR_INFO *infoPtr, LPPOINT lpPt, UINT *pFlags, INT *pBa
TRACE
(
"ON CLIENT %d
\n
"
,
iCount
);
return
;
}
else
if
(
PtInRect
(
&
lpBand
->
rcChevron
,
*
lpPt
))
{
*
pFlags
=
RBHT_CHEVRON
;
TRACE
(
"ON CHEVRON %d
\n
"
,
iCount
);
return
;
}
else
{
*
pFlags
=
RBHT_NOWHERE
;
TRACE
(
"NOWHERE %d
\n
"
,
iCount
);
...
...
@@ -2373,14 +2428,14 @@ REBAR_HandleLRDrag (REBAR_INFO *infoPtr, POINTS *ptsmove)
infoPtr
->
dragStart
.
x
=
0
;
infoPtr
->
dragStart
.
y
=
0
;
infoPtr
->
dragNow
=
infoPtr
->
dragStart
;
infoPtr
->
i
hit
Band
=
-
1
;
infoPtr
->
i
Grabbed
Band
=
-
1
;
ReleaseCapture
();
return
;
}
infoPtr
->
fStatus
|=
BEGIN_DRAG_ISSUED
;
}
ihitBand
=
infoPtr
->
i
hit
Band
;
ihitBand
=
infoPtr
->
i
Grabbed
Band
;
hitBand
=
&
infoPtr
->
bands
[
ihitBand
];
imaxdBand
=
ihitBand
;
/* to suppress warning message */
...
...
@@ -3727,103 +3782,219 @@ REBAR_GetFont (REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
return
(
LRESULT
)
infoPtr
->
hFont
;
}
static
LRESULT
REBAR_PushChevron
(
REBAR_INFO
*
infoPtr
,
WPARAM
wParam
,
LPARAM
lParam
)
{
if
(
wParam
>=
0
&&
(
UINT
)
wParam
<
infoPtr
->
uNumBands
)
{
NMREBARCHEVRON
nmrbc
;
REBAR_BAND
*
lpBand
=
&
infoPtr
->
bands
[
wParam
];
TRACE
(
"Pressed chevron on band %d
\n
"
,
wParam
);
/* redraw chevron in pushed state */
lpBand
->
fDraw
|=
DRAW_CHEVRONPUSHED
;
RedrawWindow
(
infoPtr
->
hwndSelf
,
&
lpBand
->
rcChevron
,
0
,
RDW_ERASE
|
RDW_INVALIDATE
|
RDW_UPDATENOW
);
/* notify app so it can display a popup menu or whatever */
nmrbc
.
uBand
=
wParam
;
nmrbc
.
wID
=
lpBand
->
wID
;
nmrbc
.
lParam
=
lpBand
->
lParam
;
nmrbc
.
rc
=
lpBand
->
rcChevron
;
nmrbc
.
lParamNM
=
lParam
;
REBAR_Notify
((
NMHDR
*
)
&
nmrbc
,
infoPtr
,
RBN_CHEVRONPUSHED
);
/* redraw chevron in previous state */
lpBand
->
fDraw
&=
~
DRAW_CHEVRONPUSHED
;
InvalidateRect
(
infoPtr
->
hwndSelf
,
&
lpBand
->
rcChevron
,
TRUE
);
return
TRUE
;
}
return
FALSE
;
}
static
LRESULT
REBAR_LButtonDown
(
REBAR_INFO
*
infoPtr
,
WPARAM
wParam
,
LPARAM
lParam
)
{
REBAR_BAND
*
lpBand
;
UINT
htFlags
;
UINT
iHitBand
;
POINT
ptMouseDown
;
ptMouseDown
.
x
=
(
INT
)
LOWORD
(
lParam
);
ptMouseDown
.
y
=
(
INT
)
HIWORD
(
lParam
);
/* If InternalHitTest did not find a hit on the Gripper, */
/* then ignore the button click. */
if
(
infoPtr
->
ihitBand
==
-
1
)
return
0
;
REBAR_InternalHitTest
(
infoPtr
,
&
ptMouseDown
,
&
htFlags
,
&
iHitBand
);
lpBand
=
&
infoPtr
->
bands
[
iHitBand
];
SetCapture
(
infoPtr
->
hwndSelf
);
if
(
htFlags
==
RBHT_CHEVRON
)
{
REBAR_PushChevron
(
infoPtr
,
iHitBand
,
0
);
}
else
if
(
htFlags
==
RBHT_GRABBER
||
htFlags
==
RBHT_CAPTION
)
{
TRACE
(
"Starting drag
\n
"
);
/* save off the LOWORD and HIWORD of lParam as initial x,y */
lpBand
=
&
infoPtr
->
bands
[
infoPtr
->
ihitBand
];
infoPtr
->
dragStart
=
MAKEPOINTS
(
lParam
);
infoPtr
->
dragNow
=
infoPtr
->
dragStart
;
if
(
infoPtr
->
dwStyle
&
CCS_VERT
)
infoPtr
->
ihitoffset
=
infoPtr
->
dragStart
.
y
-
(
lpBand
->
rcBand
.
top
+
REBAR_PRE_GRIPPER
);
else
infoPtr
->
ihitoffset
=
infoPtr
->
dragStart
.
x
-
(
lpBand
->
rcBand
.
left
+
REBAR_PRE_GRIPPER
);
SetCapture
(
infoPtr
->
hwndSelf
);
infoPtr
->
iGrabbedBand
=
iHitBand
;
/* save off the LOWORD and HIWORD of lParam as initial x,y */
infoPtr
->
dragStart
=
MAKEPOINTS
(
lParam
);
infoPtr
->
dragNow
=
infoPtr
->
dragStart
;
if
(
infoPtr
->
dwStyle
&
CCS_VERT
)
infoPtr
->
ihitoffset
=
infoPtr
->
dragStart
.
y
-
(
lpBand
->
rcBand
.
top
+
REBAR_PRE_GRIPPER
);
else
infoPtr
->
ihitoffset
=
infoPtr
->
dragStart
.
x
-
(
lpBand
->
rcBand
.
left
+
REBAR_PRE_GRIPPER
);
}
return
0
;
}
static
LRESULT
REBAR_LButtonUp
(
REBAR_INFO
*
infoPtr
,
WPARAM
wParam
,
LPARAM
lParam
)
{
NMHDR
layout
;
RECT
rect
;
INT
ihitBand
;
if
(
infoPtr
->
iGrabbedBand
>=
0
)
{
NMHDR
layout
;
RECT
rect
;
infoPtr
->
dragStart
.
x
=
0
;
infoPtr
->
dragStart
.
y
=
0
;
infoPtr
->
dragNow
=
infoPtr
->
dragStart
;
/* If InternalHitTest did not find a hit on the Gripper, */
/* then ignore the button click. */
if
(
infoPtr
->
ihitBand
==
-
1
)
return
0
;
ReleaseCapture
();
ihitBand
=
infoPtr
->
ihitBand
;
infoPtr
->
dragStart
.
x
=
0
;
infoPtr
->
dragStart
.
y
=
0
;
infoPtr
->
dragNow
=
infoPtr
->
dragStart
;
infoPtr
->
ihitBand
=
-
1
;
if
(
infoPtr
->
fStatus
&
BEGIN_DRAG_ISSUED
)
{
REBAR_Notify
(
&
layout
,
infoPtr
,
RBN_LAYOUTCHANGED
)
;
REBAR_Notify_NMREBAR
(
infoPtr
,
infoPtr
->
iGrabbedBand
,
RBN_ENDDRAG
)
;
infoPtr
->
fStatus
&=
~
BEGIN_DRAG_ISSUED
;
}
ReleaseCapture
()
;
infoPtr
->
iGrabbedBand
=
-
1
;
if
(
infoPtr
->
fStatus
&
BEGIN_DRAG_ISSUED
)
{
REBAR_Notify
((
NMHDR
*
)
&
layout
,
infoPtr
,
RBN_LAYOUTCHANGED
);
REBAR_Notify_NMREBAR
(
infoPtr
,
ihitBand
,
RBN_ENDDRAG
);
infoPtr
->
fStatus
&=
~
BEGIN_DRAG_ISSUED
;
GetClientRect
(
infoPtr
->
hwndSelf
,
&
rect
);
InvalidateRect
(
infoPtr
->
hwndSelf
,
NULL
,
TRUE
);
}
GetClientRect
(
infoPtr
->
hwndSelf
,
&
rect
);
InvalidateRect
(
infoPtr
->
hwndSelf
,
NULL
,
TRUE
);
return
0
;
}
static
LRESULT
REBAR_MouseLeave
(
REBAR_INFO
*
infoPtr
,
WPARAM
wParam
,
LPARAM
lParam
)
{
if
(
infoPtr
->
ichevronhotBand
>=
0
)
{
REBAR_BAND
*
lpChevronBand
=
&
infoPtr
->
bands
[
infoPtr
->
ichevronhotBand
];
if
(
lpChevronBand
->
fDraw
&
DRAW_CHEVRONHOT
)
{
lpChevronBand
->
fDraw
&=
~
DRAW_CHEVRONHOT
;
InvalidateRect
(
infoPtr
->
hwndSelf
,
&
lpChevronBand
->
rcChevron
,
TRUE
);
}
}
infoPtr
->
iOldBand
=
-
1
;
infoPtr
->
ichevronhotBand
=
-
2
;
return
TRUE
;
}
static
LRESULT
REBAR_MouseMove
(
REBAR_INFO
*
infoPtr
,
WPARAM
wParam
,
LPARAM
lParam
)
{
REBAR_BAND
*
band1
,
*
band2
;
REBAR_BAND
*
lpChevronBand
;
POINTS
ptsmove
;
/* Validate entry as hit on Gripper has occurred */
if
(
GetCapture
()
!=
infoPtr
->
hwndSelf
)
return
0
;
if
(
infoPtr
->
ihitBand
==
-
1
)
return
0
;
ptsmove
=
MAKEPOINTS
(
lParam
);
/* if mouse did not move much, exit */
if
((
abs
(
ptsmove
.
x
-
infoPtr
->
dragNow
.
x
)
<=
mindragx
)
&&
(
abs
(
ptsmove
.
y
-
infoPtr
->
dragNow
.
y
)
<=
mindragy
))
return
0
;
/* if we are currently dragging a band */
if
(
infoPtr
->
iGrabbedBand
>=
0
)
{
REBAR_BAND
*
band1
,
*
band2
;
if
(
GetCapture
()
!=
infoPtr
->
hwndSelf
)
ERR
(
"We are dragging but haven't got capture?!?
\n
"
);
band1
=
&
infoPtr
->
bands
[
infoPtr
->
ihit
Band
-
1
];
band2
=
&
infoPtr
->
bands
[
infoPtr
->
ihit
Band
];
band1
=
&
infoPtr
->
bands
[
infoPtr
->
iGrabbed
Band
-
1
];
band2
=
&
infoPtr
->
bands
[
infoPtr
->
iGrabbed
Band
];
/* Test for valid drag case - must not be first band in row */
if
(
infoPtr
->
dwStyle
&
CCS_VERT
)
{
if
((
ptsmove
.
x
<
band2
->
rcBand
.
left
)
||
(
ptsmove
.
x
>
band2
->
rcBand
.
right
)
||
((
infoPtr
->
ihitBand
>
0
)
&&
(
band1
->
iRow
!=
band2
->
iRow
)))
{
FIXME
(
"Cannot drag to other rows yet!!
\n
"
);
}
else
{
REBAR_HandleLRDrag
(
infoPtr
,
&
ptsmove
);
}
/* if mouse did not move much, exit */
if
((
abs
(
ptsmove
.
x
-
infoPtr
->
dragNow
.
x
)
<=
mindragx
)
&&
(
abs
(
ptsmove
.
y
-
infoPtr
->
dragNow
.
y
)
<=
mindragy
))
return
0
;
/* Test for valid drag case - must not be first band in row */
if
(
infoPtr
->
dwStyle
&
CCS_VERT
)
{
if
((
ptsmove
.
x
<
band2
->
rcBand
.
left
)
||
(
ptsmove
.
x
>
band2
->
rcBand
.
right
)
||
((
infoPtr
->
iGrabbedBand
>
0
)
&&
(
band1
->
iRow
!=
band2
->
iRow
)))
{
FIXME
(
"Cannot drag to other rows yet!!
\n
"
);
}
else
{
REBAR_HandleLRDrag
(
infoPtr
,
&
ptsmove
);
}
}
else
{
if
((
ptsmove
.
y
<
band2
->
rcBand
.
top
)
||
(
ptsmove
.
y
>
band2
->
rcBand
.
bottom
)
||
((
infoPtr
->
iGrabbedBand
>
0
)
&&
(
band1
->
iRow
!=
band2
->
iRow
)))
{
FIXME
(
"Cannot drag to other rows yet!!
\n
"
);
}
else
{
REBAR_HandleLRDrag
(
infoPtr
,
&
ptsmove
);
}
}
}
else
{
if
((
ptsmove
.
y
<
band2
->
rcBand
.
top
)
||
(
ptsmove
.
y
>
band2
->
rcBand
.
bottom
)
||
((
infoPtr
->
ihitBand
>
0
)
&&
(
band1
->
iRow
!=
band2
->
iRow
)))
{
FIXME
(
"Cannot drag to other rows yet!!
\n
"
);
}
else
{
REBAR_HandleLRDrag
(
infoPtr
,
&
ptsmove
);
}
else
{
POINT
ptMove
;
INT
iHitBand
;
UINT
htFlags
;
TRACKMOUSEEVENT
trackinfo
;
ptMove
.
x
=
(
INT
)
ptsmove
.
x
;
ptMove
.
y
=
(
INT
)
ptsmove
.
y
;
REBAR_InternalHitTest
(
infoPtr
,
&
ptMove
,
&
htFlags
,
&
iHitBand
);
if
(
infoPtr
->
iOldBand
>=
0
&&
infoPtr
->
iOldBand
==
infoPtr
->
ichevronhotBand
)
{
lpChevronBand
=
&
infoPtr
->
bands
[
infoPtr
->
ichevronhotBand
];
if
(
lpChevronBand
->
fDraw
&
DRAW_CHEVRONHOT
)
{
lpChevronBand
->
fDraw
&=
~
DRAW_CHEVRONHOT
;
InvalidateRect
(
infoPtr
->
hwndSelf
,
&
lpChevronBand
->
rcChevron
,
TRUE
);
}
infoPtr
->
ichevronhotBand
=
-
2
;
}
if
(
htFlags
==
RBHT_CHEVRON
)
{
/* fill in the TRACKMOUSEEVENT struct */
trackinfo
.
cbSize
=
sizeof
(
TRACKMOUSEEVENT
);
trackinfo
.
dwFlags
=
TME_QUERY
;
trackinfo
.
hwndTrack
=
infoPtr
->
hwndSelf
;
trackinfo
.
dwHoverTime
=
0
;
/* call _TrackMouseEvent to see if we are currently tracking for this hwnd */
_TrackMouseEvent
(
&
trackinfo
);
/* Make sure tracking is enabled so we receive a WM_MOUSELEAVE message */
if
(
!
(
trackinfo
.
dwFlags
&
TME_LEAVE
))
{
trackinfo
.
dwFlags
=
TME_LEAVE
;
/* notify upon leaving */
/* call TRACKMOUSEEVENT so we receive a WM_MOUSELEAVE message */
/* and can properly deactivate the hot chevron */
_TrackMouseEvent
(
&
trackinfo
);
}
lpChevronBand
=
&
infoPtr
->
bands
[
iHitBand
];
if
(
!
(
lpChevronBand
->
fDraw
&
DRAW_CHEVRONHOT
))
{
lpChevronBand
->
fDraw
|=
DRAW_CHEVRONHOT
;
InvalidateRect
(
infoPtr
->
hwndSelf
,
&
lpChevronBand
->
rcChevron
,
TRUE
);
infoPtr
->
ichevronhotBand
=
iHitBand
;
}
}
infoPtr
->
iOldBand
=
iHitBand
;
}
return
0
;
}
...
...
@@ -3875,7 +4046,9 @@ REBAR_NCCreate (HWND hwnd, WPARAM wParam, LPARAM lParam)
infoPtr
->
clrText
=
CLR_NONE
;
infoPtr
->
clrBtnText
=
GetSysColor
(
COLOR_BTNTEXT
);
infoPtr
->
clrBtnFace
=
GetSysColor
(
COLOR_BTNFACE
);
infoPtr
->
ihitBand
=
-
1
;
infoPtr
->
iOldBand
=
-
1
;
infoPtr
->
ichevronhotBand
=
-
2
;
infoPtr
->
iGrabbedBand
=
-
1
;
infoPtr
->
hwndSelf
=
hwnd
;
infoPtr
->
DoRedraw
=
TRUE
;
infoPtr
->
hcurArrow
=
LoadCursorA
(
0
,
(
LPSTR
)
IDC_ARROW
);
...
...
@@ -4355,6 +4528,9 @@ REBAR_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case
RB_MOVEBAND
:
return
REBAR_MoveBand
(
infoPtr
,
wParam
,
lParam
);
case
RB_PUSHCHEVRON
:
return
REBAR_PushChevron
(
infoPtr
,
wParam
,
lParam
);
case
RB_SETBANDINFOA
:
return
REBAR_SetBandInfoA
(
infoPtr
,
wParam
,
lParam
);
...
...
@@ -4431,6 +4607,9 @@ REBAR_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case
WM_MOUSEMOVE
:
return
REBAR_MouseMove
(
infoPtr
,
wParam
,
lParam
);
case
WM_MOUSELEAVE
:
return
REBAR_MouseLeave
(
infoPtr
,
wParam
,
lParam
);
case
WM_NCCALCSIZE
:
return
REBAR_NCCalcSize
(
infoPtr
,
wParam
,
lParam
);
...
...
include/commctrl.h
View file @
fc58ef81
...
...
@@ -1678,6 +1678,9 @@ static const WCHAR REBARCLASSNAMEW[] = { 'R','e','B','a','r',
#define RBBS_VARIABLEHEIGHT 0x00000040
#define RBBS_GRIPPERALWAYS 0x00000080
#define RBBS_NOGRIPPER 0x00000100
#define RBBS_USECHEVRON 0x00000200
#define RBBS_HIDETITLE 0x00000400
#define RBBS_TOPALIGN 0x00000800
#define RBNM_ID 0x00000001
#define RBNM_STYLE 0x00000002
...
...
@@ -1687,6 +1690,7 @@ static const WCHAR REBARCLASSNAMEW[] = { 'R','e','B','a','r',
#define RBHT_CAPTION 0x0002
#define RBHT_CLIENT 0x0003
#define RBHT_GRABBER 0x0004
#define RBHT_CHEVRON 0x0008
#define RB_INSERTBANDA (WM_USER+1)
#define RB_INSERTBANDW (WM_USER+10)
...
...
@@ -1726,6 +1730,8 @@ static const WCHAR REBARCLASSNAMEW[] = { 'R','e','B','a','r',
#define RB_SETPALETTE (WM_USER+37)
#define RB_GETPALETTE (WM_USER+38)
#define RB_MOVEBAND (WM_USER+39)
#define RB_GETBANDMARGINS (WM_USER+40)
#define RB_PUSHCHEVRON (WM_USER+43)
#define RB_GETDROPTARGET CCM_GETDROPTARGET
#define RB_SETCOLORSCHEME CCM_SETCOLORSCHEME
#define RB_GETCOLORSCHEME CCM_GETCOLORSCHEME
...
...
@@ -1743,6 +1749,9 @@ static const WCHAR REBARCLASSNAMEW[] = { 'R','e','B','a','r',
#define RBN_DELETINGBAND (RBN_FIRST-6)
#define RBN_DELETEDBAND (RBN_FIRST-7)
#define RBN_CHILDSIZE (RBN_FIRST-8)
#define RBN_CHEVRONPUSHED (RBN_FIRST-10)
#define RBN_MINMAX (RBN_FIRST-21)
#define RBN_AUTOBREAK (RBN_FIRST-22)
typedef
struct
tagREBARINFO
{
...
...
@@ -1838,6 +1847,16 @@ typedef struct tagNMRBAUTOSIZE
RECT
rcActual
;
}
NMRBAUTOSIZE
,
*
LPNMRBAUTOSIZE
;
typedef
struct
tagNMREBARCHEVRON
{
NMHDR
hdr
;
UINT
uBand
;
UINT
wID
;
LPARAM
lParam
;
RECT
rc
;
LPARAM
lParamNM
;
}
NMREBARCHEVRON
,
*
LPNMREBARCHEVRON
;
typedef
struct
_RB_HITTESTINFO
{
POINT
pt
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment