TNB Library
TnbMfcDragDrawingListCtrl.h
[詳解]
1#pragma once
12#include "TnbMfcDrag.h"
13
14
15
16//TNB Library
17namespace TNB {
18namespace MFC {
19
20
21
38class CDragDrawingListCtrl : public CDragAddinT<CDrawingListCtrl>
39{
41 int m_itemHeight;
42 int m_headerHeight;
43 int m_ctrlId;
44 int m_scrollCount;
46 int GetItemHeight(void)
47 {
48 if ( m_itemHeight < 0 )
49 {
50 CRect rc;
51 GetItemRect(0, &rc, LVIR_BOUNDS);
52 m_itemHeight = rc.Height();
53 }
54 return m_itemHeight;
55 }
57 int GetHeaderHeight(void)
58 {
59 if ( m_headerHeight < 0 )
60 {
61 CRect rc;
62 GetHeaderCtrl()->GetClientRect(rc);
63 m_headerHeight = rc.Height();
64 }
65 return m_headerHeight;
66 }
67
68protected:
69
74 int GetVirtualCtrlID(void) const
75 {
76 return m_ctrlId;
77 }
78
88 virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
89 {
90 if ( message == WM_LBUTTONDOWN )
91 {
92 CPoint po;
93 ::GetCursorPos(&po);
94 ScreenToClient(&po);
95 if ( _super::HitTest(po, NULL) >= 0 )
96 {
97 CListCtrl::WindowProc(message, wParam, lParam);
98 }
99 }
100 else if ( IsNofityMessage(message) && wParam == static_cast<WPARAM>(MAKELONG(CANDROP, GetDragGroupID())) )
101 {
102 if ( ! _super::CanDropping() )
103 {
104 return false;
105 }
106 TDropParam* P = reinterpret_cast<TDropParam*>(lParam); //クライアント座標が格納されている
107 if ( P->point.y < GetHeaderHeight() + 2 )
108 {
109 return false;
110 }
111 int h = GetItemHeight();
112 CRect rc;
113 _super::GetClientRect(&rc);
114 LONG scrollHeight = 0;
115 if ( P->point.y < GetHeaderHeight() + 2 + h )
116 {
117 if ( _super::GetTopIndex() > 0 && ++m_scrollCount > 4 )
118 {
119 scrollHeight = -h;
120 }
121 }
122 else if ( rc.bottom - h < P->point.y )
123 {
124 int i1 = _super::GetItemCount() - _super::GetTopIndex();
125 int i2 = _super::GetCountPerPage();
126 if ( i1 > i2 && ++m_scrollCount > 4 )
127 {
128 scrollHeight = h;
129 }
130 }
131 if ( scrollHeight != 0 )
132 {
133 m_scrollCount = 0;
134 _super::Scroll(CSize(0, scrollHeight));
135 _super::Invalidate(false);
136 }
137 int r = _super::HitTest(P->point, NULL);
138 if ( r >= 0 )
139 {
140 RECT rc;
141 _super::GetItemRect(r, &rc, LVIR_BOUNDS);
142 _DeleteObject(P->hRgn);
143 P->hRgn = ::CreateRectRgnIndirect(&rc);
144 ASSERT1( m_ctrlId + r < 0x10000, "CDrawingListCtrlDg", "仮想コントロールIDが WORD で表現できない値になってしまいました(%u)。", m_ctrlId + r );
145 P->ctrlID = static_cast<WORD>(m_ctrlId + r);
146 return true;
147 }
148 return false;
149 }
150 return _super::WindowProc(message, wParam, lParam);
151 }
152
160 virtual int OnBeginDrag(RECT& _rc, const POINT& po)
161 {
162 CPoint p = po;
163 ScreenToClient(&p);
164 int r = HitTest(p, NULL);
165 if ( r >= 0 )
166 {
167 if ( ! ::DragDetect(m_hWnd, p) )
168 {
169 return 0;
170 }
171// UINT s = LVIS_SELECTED | LVIS_FOCUSED;
172// SetItemState(r, s, s);
173 GetItemRect(r, &_rc, LVIR_BOUNDS);
174 ClientToScreen(&_rc);
175 //void SetDraggingBitmap(CBitmapHandle bmp)
176 return m_ctrlId + r;
177 }
178 return 0;
179 }
180
181
182public:
183
186 : _super(), m_ctrlId(0x8000), m_itemHeight(-1), m_headerHeight(-1), m_scrollCount(0)
187 {
188 }
189
192 {
193 }
194
204 void SetVirtualCtrlID(int base)
205 {
206 m_ctrlId = base;
207 }
208};
209
210
211
212}; // MFC
213}; // TNB
ドラッグ&ドロップ処理関係のヘッダ
描画情報ListCtrl関係のヘッダ
ドラッグコントロールアドインクラス
Definition: TnbMfcDrag.h:125
bool IsNofityMessage(UINT message) const
[確認] 通知メッセージ確認.
Definition: TnbMfcDrag.h:344
WORD GetDragGroupID(void) const
[取得] ドロップグループID取得
Definition: TnbMfcDrag.h:209
@ CANDROP
ドロップ可能かチェック時に通知します。 通知を受けたコントロールは LRESULT で true(ドロップ可能),false(不可能) を返します。 LPARAM は TDropParam のポインタが...
Definition: TnbMfcDrag.h:152
ドラッグ付き描画情報ListCtrlコントロール
void SetVirtualCtrlID(int base)
[設定] 仮想コントロールIDベース設定.
~CDragDrawingListCtrl(void)
デストラクタ
CDragDrawingListCtrl(void)
コンストラクタ
int GetVirtualCtrlID(void) const
[取得] 仮想コントロールIDベース取得.
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
[通知] for processing Windows messages.
virtual int OnBeginDrag(RECT &_rc, const POINT &po)
[通知] ドラッグ開始.
CDrawingHeaderCtrl * GetHeaderCtrl(void)
[取得] ヘッダコントロール参照.
TNB Library
Definition: TnbDoxyTitle.txt:2