Scroll Bar完成
Win32 API为了让控件更为有用真是煞费苦心,不仅Tab没有提供控件可见控制,连Scroll Bar点击的时候竟然是不修改Position的,要我在每一个消息里用SBM_SETSCROLLINFO来设置当前的位置。而且当前的位置的获得还不是一致的,根据消息的不同而不同。真是故意为难人啊。
文本框里面的东西是为了检查各个消息中GetPosition函数的正确性而打出来的。输出消息的代码如下:
1
#include
"
..\..\..\..\VL++\Library\Windows\VL_WinGUI.h
"
2
3 using namespace vl;
4 using namespace vl::windows;
5
6 class MyForm : public VL_WinForm
7 {
8 protected :
9 VL_WinScroll * FHScroll;
10 VL_WinScroll * FVScroll;
11 VL_WinEdit * FEdit;
12
13 void InitControls()
14 {
15 FHScroll = new VL_WinScroll( this , true );
16 FHScroll -> Move( 0 , 380 , 380 , 20 );
17 FVScroll = new VL_WinScroll( this , false );
18 FVScroll -> Move( 380 , 0 , 20 , 380 );
19 FEdit = new VL_WinEdit( this , true );
20 FEdit -> Move( 0 , 0 , 380 , 380 );
21 FEdit -> SetReadonly( true );
22
23 FHScroll -> OnScrollMin.Bind( this , & MyForm::Scroll_ScrollMin);
24 FHScroll -> OnScrollMax.Bind( this , & MyForm::Scroll_ScrollMax);
25 FHScroll -> OnArrowDec.Bind( this , & MyForm::Scroll_ArrowDec);
26 FHScroll -> OnArrowInc.Bind( this , & MyForm::Scroll_ArrowInc);
27 FHScroll -> OnPageDec.Bind( this , & MyForm::Scroll_PageDec);
28 FHScroll -> OnPageInc.Bind( this , & MyForm::Scroll_PageInc);
29 FHScroll -> OnTracking.Bind( this , & MyForm::Scroll_Tracking);
30 FHScroll -> OnThumbUp.Bind( this , & MyForm::Scroll_ThumbUp);
31 FHScroll -> OnPositionChanged.Bind( this , & MyForm::Scroll_PositionChanged);
32 FHScroll -> OnEndScroll.Bind( this , & MyForm::Scroll_EndScroll);
33
34 FVScroll -> OnScrollMin.Bind( this , & MyForm::Scroll_ScrollMin);
35 FVScroll -> OnScrollMax.Bind( this , & MyForm::Scroll_ScrollMax);
36 FVScroll -> OnArrowDec.Bind( this , & MyForm::Scroll_ArrowDec);
37 FVScroll -> OnArrowInc.Bind( this , & MyForm::Scroll_ArrowInc);
38 FVScroll -> OnPageDec.Bind( this , & MyForm::Scroll_PageDec);
39 FVScroll -> OnPageInc.Bind( this , & MyForm::Scroll_PageInc);
40 FVScroll -> OnTracking.Bind( this , & MyForm::Scroll_Tracking);
41 FVScroll -> OnThumbUp.Bind( this , & MyForm::Scroll_ThumbUp);
42 FVScroll -> OnPositionChanged.Bind( this , & MyForm::Scroll_PositionChanged);
43 FVScroll -> OnEndScroll.Bind( this , & MyForm::Scroll_EndScroll);
44 }
45
46 void Print(VUnicodeString Message)
47 {
48 FEdit -> SetText(FEdit -> GetText() + Message + L " \r\n " );
49 FEdit -> Select(FEdit -> GetText().Length(), 0 );
50 FEdit -> ScrollToCaret();
51 }
52
53 void Print(VL_Base * Sender , VUnicodeString Message)
54 {
55 VL_WinScroll * Scroll = dynamic_cast < VL_WinScroll *> (Sender);
56 if (Scroll)
57 {
58 if (Scroll == FHScroll)
59 {
60 Print(L " Horizontal , " + Message + L " = " + VUnicodeString(Scroll -> GetPosition()));
61 }
62 else
63 {
64 Print(L " Vertical , " + Message + L " = " + VUnicodeString(Scroll -> GetPosition()));
65 }
66 }
67 }
68
69 void Scroll_ScrollMin(VL_Base * Sender)
70 {
71 Print(Sender,L " Min " );
72 }
73
74 void Scroll_ScrollMax(VL_Base * Sender)
75 {
76 Print(Sender,L " Max " );
77 }
78
79 void Scroll_ArrowDec(VL_Base * Sender)
80 {
81 Print(Sender,L " Arrow- " );
82 }
83
84 void Scroll_ArrowInc(VL_Base * Sender)
85 {
86 Print(Sender,L " Arrow+ " );
87 }
88
89 void Scroll_PageDec(VL_Base * Sender)
90 {
91 Print(Sender,L " Page- " );
92 }
93
94 void Scroll_PageInc(VL_Base * Sender)
95 {
96 Print(Sender,L " Page+ " );
97 }
98
99 void Scroll_Tracking(VL_Base * Sender)
100 {
101 Print(Sender,L " Tracking " );
102 }
103
104 void Scroll_ThumbUp(VL_Base * Sender)
105 {
106 Print(Sender,L " ThumbUp " );
107 }
108
109 void Scroll_PositionChanged(VL_Base * Sender)
110 {
111 Print(Sender,L " Changed " );
112 }
113
114 void Scroll_EndScroll(VL_Base * Sender)
115 {
116 Print(Sender,L " End " );
117 }
118
119 public :
120
121 MyForm():VL_WinForm( true )
122 {
123 SetMaximizeBox( false );
124 SetBorder(vwfbSingle);
125 SetClientWidth( 400 );
126 SetClientHeight( 400 );
127 SetText(L " Vczh Form " );
128 MoveCenter();
129 InitControls();
130 Show();
131 }
132 };
133
134 void main()
135 {
136 new MyForm;
137 GetApplication() -> Run();
138 }
至于我是怎么解决GetPosition的呢?因为每一次操作Scroll Bar的Position都不会改,所以理所当然的,我要替它改……
2
3 using namespace vl;
4 using namespace vl::windows;
5
6 class MyForm : public VL_WinForm
7 {
8 protected :
9 VL_WinScroll * FHScroll;
10 VL_WinScroll * FVScroll;
11 VL_WinEdit * FEdit;
12
13 void InitControls()
14 {
15 FHScroll = new VL_WinScroll( this , true );
16 FHScroll -> Move( 0 , 380 , 380 , 20 );
17 FVScroll = new VL_WinScroll( this , false );
18 FVScroll -> Move( 380 , 0 , 20 , 380 );
19 FEdit = new VL_WinEdit( this , true );
20 FEdit -> Move( 0 , 0 , 380 , 380 );
21 FEdit -> SetReadonly( true );
22
23 FHScroll -> OnScrollMin.Bind( this , & MyForm::Scroll_ScrollMin);
24 FHScroll -> OnScrollMax.Bind( this , & MyForm::Scroll_ScrollMax);
25 FHScroll -> OnArrowDec.Bind( this , & MyForm::Scroll_ArrowDec);
26 FHScroll -> OnArrowInc.Bind( this , & MyForm::Scroll_ArrowInc);
27 FHScroll -> OnPageDec.Bind( this , & MyForm::Scroll_PageDec);
28 FHScroll -> OnPageInc.Bind( this , & MyForm::Scroll_PageInc);
29 FHScroll -> OnTracking.Bind( this , & MyForm::Scroll_Tracking);
30 FHScroll -> OnThumbUp.Bind( this , & MyForm::Scroll_ThumbUp);
31 FHScroll -> OnPositionChanged.Bind( this , & MyForm::Scroll_PositionChanged);
32 FHScroll -> OnEndScroll.Bind( this , & MyForm::Scroll_EndScroll);
33
34 FVScroll -> OnScrollMin.Bind( this , & MyForm::Scroll_ScrollMin);
35 FVScroll -> OnScrollMax.Bind( this , & MyForm::Scroll_ScrollMax);
36 FVScroll -> OnArrowDec.Bind( this , & MyForm::Scroll_ArrowDec);
37 FVScroll -> OnArrowInc.Bind( this , & MyForm::Scroll_ArrowInc);
38 FVScroll -> OnPageDec.Bind( this , & MyForm::Scroll_PageDec);
39 FVScroll -> OnPageInc.Bind( this , & MyForm::Scroll_PageInc);
40 FVScroll -> OnTracking.Bind( this , & MyForm::Scroll_Tracking);
41 FVScroll -> OnThumbUp.Bind( this , & MyForm::Scroll_ThumbUp);
42 FVScroll -> OnPositionChanged.Bind( this , & MyForm::Scroll_PositionChanged);
43 FVScroll -> OnEndScroll.Bind( this , & MyForm::Scroll_EndScroll);
44 }
45
46 void Print(VUnicodeString Message)
47 {
48 FEdit -> SetText(FEdit -> GetText() + Message + L " \r\n " );
49 FEdit -> Select(FEdit -> GetText().Length(), 0 );
50 FEdit -> ScrollToCaret();
51 }
52
53 void Print(VL_Base * Sender , VUnicodeString Message)
54 {
55 VL_WinScroll * Scroll = dynamic_cast < VL_WinScroll *> (Sender);
56 if (Scroll)
57 {
58 if (Scroll == FHScroll)
59 {
60 Print(L " Horizontal , " + Message + L " = " + VUnicodeString(Scroll -> GetPosition()));
61 }
62 else
63 {
64 Print(L " Vertical , " + Message + L " = " + VUnicodeString(Scroll -> GetPosition()));
65 }
66 }
67 }
68
69 void Scroll_ScrollMin(VL_Base * Sender)
70 {
71 Print(Sender,L " Min " );
72 }
73
74 void Scroll_ScrollMax(VL_Base * Sender)
75 {
76 Print(Sender,L " Max " );
77 }
78
79 void Scroll_ArrowDec(VL_Base * Sender)
80 {
81 Print(Sender,L " Arrow- " );
82 }
83
84 void Scroll_ArrowInc(VL_Base * Sender)
85 {
86 Print(Sender,L " Arrow+ " );
87 }
88
89 void Scroll_PageDec(VL_Base * Sender)
90 {
91 Print(Sender,L " Page- " );
92 }
93
94 void Scroll_PageInc(VL_Base * Sender)
95 {
96 Print(Sender,L " Page+ " );
97 }
98
99 void Scroll_Tracking(VL_Base * Sender)
100 {
101 Print(Sender,L " Tracking " );
102 }
103
104 void Scroll_ThumbUp(VL_Base * Sender)
105 {
106 Print(Sender,L " ThumbUp " );
107 }
108
109 void Scroll_PositionChanged(VL_Base * Sender)
110 {
111 Print(Sender,L " Changed " );
112 }
113
114 void Scroll_EndScroll(VL_Base * Sender)
115 {
116 Print(Sender,L " End " );
117 }
118
119 public :
120
121 MyForm():VL_WinForm( true )
122 {
123 SetMaximizeBox( false );
124 SetBorder(vwfbSingle);
125 SetClientWidth( 400 );
126 SetClientHeight( 400 );
127 SetText(L " Vczh Form " );
128 MoveCenter();
129 InitControls();
130 Show();
131 }
132 };
133
134 void main()
135 {
136 new MyForm;
137 GetApplication() -> Run();
138 }
1
LRESULT VL_WinScroll::ProcessMessage(UINT Message , WPARAM
&
wParam , LPARAM
&
lParam , VBool
&
CallDefaultProcedure)
2 {
3 LRESULT Result = 0 ;
4 switch (Message)
5 {
6 case WM_VSCROLL_DISPATCHED:
7 case WM_HSCROLL_DISPATCHED:
8 switch (LOWORD(wParam))
9 {
10 case SB_ENDSCROLL:
11 OnEndScroll( this );
12 break ;
13 case SB_LEFT:
14 OnScrollMin( this );
15 OnPositionChanged( this );
16 break ;
17 case SB_RIGHT:
18 OnScrollMax( this );
19 OnPositionChanged( this );
20 break ;
21 case SB_LINELEFT:
22 SetPosition(GetPosition() - 1 );
23 OnArrowDec( this );
24 OnPositionChanged( this );
25 break ;
26 case SB_LINERIGHT:
27 SetPosition(GetPosition() + 1 );
28 OnArrowInc( this );
29 OnPositionChanged( this );
30 break ;
31 case SB_PAGELEFT:
32 SetPosition(GetPosition() - GetPage());
33 OnPageDec( this );
34 OnPositionChanged( this );
35 break ;
36 case SB_PAGERIGHT:
37 OnPageInc( this );
38 SetPosition(GetPosition() + GetPage());
39 OnPositionChanged( this );
40 break ;
41 case SB_THUMBPOSITION:
42 {
43 SCROLLINFO Info;
44 GetInfo(Info);
45 SetPosition(Info.nTrackPos);
46 OnThumbUp( this );
47 OnPositionChanged( this );
48 }
49 break ;
50 case SB_THUMBTRACK:
51 {
52 SCROLLINFO Info;
53 GetInfo(Info);
54 SetPosition(Info.nTrackPos);
55 OnTracking( this );
56 OnPositionChanged( this );
57 }
58 break ;
59 }
60 Result = VL_WinControl::ProcessMessage(Message,wParam,lParam,CallDefaultProcedure);
61 break ;
62 default :
63 Result = VL_WinControl::ProcessMessage(Message,wParam,lParam,CallDefaultProcedure);
64 }
65 return Result;
66 }
2 {
3 LRESULT Result = 0 ;
4 switch (Message)
5 {
6 case WM_VSCROLL_DISPATCHED:
7 case WM_HSCROLL_DISPATCHED:
8 switch (LOWORD(wParam))
9 {
10 case SB_ENDSCROLL:
11 OnEndScroll( this );
12 break ;
13 case SB_LEFT:
14 OnScrollMin( this );
15 OnPositionChanged( this );
16 break ;
17 case SB_RIGHT:
18 OnScrollMax( this );
19 OnPositionChanged( this );
20 break ;
21 case SB_LINELEFT:
22 SetPosition(GetPosition() - 1 );
23 OnArrowDec( this );
24 OnPositionChanged( this );
25 break ;
26 case SB_LINERIGHT:
27 SetPosition(GetPosition() + 1 );
28 OnArrowInc( this );
29 OnPositionChanged( this );
30 break ;
31 case SB_PAGELEFT:
32 SetPosition(GetPosition() - GetPage());
33 OnPageDec( this );
34 OnPositionChanged( this );
35 break ;
36 case SB_PAGERIGHT:
37 OnPageInc( this );
38 SetPosition(GetPosition() + GetPage());
39 OnPositionChanged( this );
40 break ;
41 case SB_THUMBPOSITION:
42 {
43 SCROLLINFO Info;
44 GetInfo(Info);
45 SetPosition(Info.nTrackPos);
46 OnThumbUp( this );
47 OnPositionChanged( this );
48 }
49 break ;
50 case SB_THUMBTRACK:
51 {
52 SCROLLINFO Info;
53 GetInfo(Info);
54 SetPosition(Info.nTrackPos);
55 OnTracking( this );
56 OnPositionChanged( this );
57 }
58 break ;
59 }
60 Result = VL_WinControl::ProcessMessage(Message,wParam,lParam,CallDefaultProcedure);
61 break ;
62 default :
63 Result = VL_WinControl::ProcessMessage(Message,wParam,lParam,CallDefaultProcedure);
64 }
65 return Result;
66 }