123template<
typename TYP = CStatic>
174 return ::RegisterWindowMessage(_T(
"TnbMfcDragAddin"));
179 : m_targetMarkColor(::GetSysColor(COLOR_HIGHLIGHT)), m_targetMarkThick(2)
180 , m_arrowIcon(NULL), m_noIcon(NULL)
181 , m_wGroupID(0), m_boCanDragging(true), m_boCanDropping(true)
182 , m_boIsDragging(false), m_nowDropItem(-1), m_nowDropItemRgn(NULL)
185 m_nowDropItemRgn = ::CreateRectRgn(0, 0, 0, 0);
191 _DeleteObject(m_nowDropItemRgn);
239 m_targetMarkDrawer = draw->
Clone();
241 m_targetMarkColor = color;
242 m_targetMarkThick = thick;
253 m_targetMarkDrawer = draw.
Clone();
265 m_targetMarkDrawer.
Null();
266 m_targetMarkColor = color;
269 m_targetMarkThick = thick;
281 _draw = m_targetMarkDrawer;
282 _color = m_targetMarkColor;
283 _thick = m_targetMarkThick;
292 m_boCanDragging = can;
302 return m_boCanDragging;
311 m_boCanDropping = can;
321 return m_boCanDropping;
335 return !! ::SendMessage(*pWnd, m_nMessageCode, wParam, lParam);
346 return m_nMessageCode == message;
358 virtual LRESULT
WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
360 if ( message == m_nMessageCode )
362 if ( wParam ==
static_cast<WPARAM
>(MAKELONG(
CANDROP, m_wGroupID)) )
364 return m_boCanDropping;
367 else if ( message == WM_LBUTTONDOWN )
371 m_SendCommand(
START, 0);
375 else if ( message == WM_LBUTTONUP )
379 if ( m_nowDropItem >= 0 )
381 m_SendCommand(
DROP, m_nowDropItem);
390 else if ( message == WM_CAPTURECHANGED || message == WM_RBUTTONDOWN )
397 else if ( message == WM_MOUSEMOVE )
399 if ( m_boIsDragging )
404 else if ( message == WM_DESTROY )
408 return _super::WindowProc(message, wParam, lParam);
420 if ( ! ::DragDetect(m_hWnd, po) )
424 return _super::GetDlgCtrlID();
441 COLORREF m_targetMarkColor;
442 int m_targetMarkThick;
445 bool m_boCanDragging;
446 bool m_boCanDropping;
449 int m_draggingItemID;
452 CImageList m_imglist;
457 HRGN m_nowDropItemRgn;
460 void m_DrawTargetMark(CDC* pDC, HRGN hRgn)
462 if ( m_targetMarkDrawer.
IsNull() )
465 br.CreateSolidBrush(m_targetMarkColor);
466 ::FrameRgn(*pDC, m_nowDropItemRgn, br, m_targetMarkThick, m_targetMarkThick);
471 ::GetRgnBox(hRgn, &rc);
472 ::SelectClipRgn(*pDC, hRgn);
473 m_targetMarkDrawer->
Resize(rc.Size());
474 m_targetMarkDrawer->
Draw(*pDC, rc.left, rc.top);
475 ::SelectClipRgn(*pDC, NULL);
479 void m_OnMouseMove(
void)
481 if ( m_arrowIcon == NULL ) { m_arrowIcon = ::GetCursor(); }
483 ::GetCursorPos(&pos);
484 m_imglist.DragMove(pos - m_dragOffset);
486 CWnd* pParent = _super::GetParent();
487 if ( pParent == NULL )
491 int backupDropItem = m_nowDropItem;
492 CWnd* pBackupDropWnd = m_nowDropWnd;
494 ::GetRgnBox(m_nowDropItemRgn, &backupDropRect);
496 HCURSOR hCursor = NULL;
498 CWnd* P = pParent->GetParentOwner();
504 P->GetClientRect(&rc);
505 P->ClientToScreen(&rc);
506 if ( rc.PtInRect(pos) )
508 pParent->ScreenToClient(&pos);
509 CWnd* P = pParent->ChildWindowFromPoint(pos, CWP_SKIPINVISIBLE);
513 param.dragID = m_draggingItemID;
514 param.ctrlID =
static_cast<WORD
>(P->GetDlgCtrlID());
515 if ( param.ctrlID != 0 )
517 pParent->ClientToScreen(&pos);
518 P->ScreenToClient(&pos);
521 P->GetClientRect(&rect);
522 param.hRgn = ::CreateRectRgn(0, 0, rect.right, rect.bottom);
523 P->GetWindowRgn(param.hRgn);
524 if ( m_CanDropping(P, param) )
526 if ( param.ctrlID != m_draggingItemID )
528 _DeleteObject(m_nowDropItemRgn);
529 m_nowDropItemRgn = param.hRgn;
530 m_nowDropItem = param.ctrlID;
532 hCursor = m_arrowIcon;
536 _DeleteObject(param.hRgn);
541 _DeleteObject(param.hRgn);
546 if ( hCursor == NULL )
548 if ( m_noIcon == NULL ) { m_noIcon = ::LoadCursor(NULL, IDC_NO); }
551 ::SetCursor(hCursor);
552 if ( backupDropItem != m_nowDropItem )
554 if ( backupDropItem >= 0 )
556 m_SendCommand(
LEAVE, backupDropItem);
557 m_imglist.DragShowNolock(
false);
558 CWnd* P = pBackupDropWnd->GetParent();
561 pBackupDropWnd->ClientToScreen(&backupDropRect);
562 P->ScreenToClient(&backupDropRect);
563 P->RedrawWindow(&backupDropRect);
567 pBackupDropWnd->RedrawWindow(&backupDropRect);
569 m_imglist.DragShowNolock(
true);
571 if ( m_nowDropItem >= 0 )
573 m_SendCommand(
HOVER, m_nowDropItem);
574 if ( IS_RGBVALUE(m_targetMarkColor) )
576 CDC* pDC = m_nowDropWnd->GetDC();
577 m_imglist.DragShowNolock(
false);
578 m_DrawTargetMark(pDC, m_nowDropItemRgn);
579 m_imglist.DragShowNolock(
true);
580 m_nowDropWnd->ReleaseDC(pDC);
586 bool m_CanDropping(
CWnd* P, TDropParam& _param)
588 ASSERTLIB( P != NULL );
589 ASSERTLIB( _param.ctrlID != 0 );
590 WPARAM wParam = MAKELONG(
CANDROP, m_wGroupID);
591 LPARAM lParam =
reinterpret_cast<LPARAM
>(&_param);
592 if ( P->SendMessage(m_nMessageCode, wParam, lParam) )
596 if ( m_SendCommand(
ISDROP, _param.ctrlID) )
603 bool m_BeginDrag(
void)
605 if ( m_boIsDragging )
609 if ( ! m_boCanDragging ) {
return false; }
611 ::GetCursorPos(&pos);
613 _super::GetWindowRect(rect);
614 CRect winRect = rect;
616 if ( m_draggingItemID <= 0 )
620 CPoint controlPoint = rect.TopLeft();
621 m_dragOffset = pos - controlPoint;
628 rect.OffsetRect(-winRect.TopLeft());
636 m_imglist.Create(size.cx, size.cy, ILC_MASK, 0, 1);
637 m_imglist.Add(CBitmap::FromHandle(hh), RGB(0, 0, 1));
638 m_imglist.BeginDrag(0, CPoint(0, 0));
639 m_imglist.DragEnter(NULL, controlPoint);
640 m_imglist.DragMove(controlPoint);
642 m_boIsDragging =
true;
648 if ( ! m_boIsDragging ) {
return false; }
649 m_boIsDragging =
false;
651 m_imglist.DeleteImageList();
652 if ( m_nowDropItem >= 0 && ::IsWindow(*m_nowDropWnd) )
654 m_nowDropWnd->Invalidate();
660 bool m_SendCommand(UINT uCmd,
int item)
662 WPARAM wParam = MAKELONG(uCmd, m_wGroupID);
663 LPARAM lParam = MAKELONG(m_draggingItemID, item);
665 CWnd* pWnd = _super::GetParent();
668 r = pWnd->SendMessage(m_nMessageCode, wParam, lParam);
bool GetSize(SIZE &_size) const
[取得] ビットマップサイズ取得.
CBitmapImage Cut(const RECT &rect, int cx=0, int cy=0) const
[取得] イメージ取り出し.
bool SetFromWindow(HWND hWnd, COLORREF backColor=CLR_INVALID, LPARAM mode=PRF_CLIENT|PRF_ERASEBKGND|PRF_NONCLIENT|PRF_OWNED)
[設定] ウィンドウからイメージ設定.
CBitmapHandle GetBitmapHandle(void)
[取得] ビットマップハンドル取得
bool IsNull(void) const
[確認] NULLチェック
void GetDropTargetMark(const IDrawable *&_draw, COLORREF &_color, int &_thick) const
[取得] ドロップ先のマーク設定取得.
static UINT GetDragNotifyMessage(void)
[取得] 通知用メッセージコード取得.
void SetDraggingBitmap(CBitmapHandle bmp)
[設定] ドラック中ビットマップ設定.
void SetDragGroupID(WORD w)
[設定] ドロップグループID設定
void SetDropMode(bool can)
[設定] ドロップモード設定.
bool IsNofityMessage(UINT message) const
[確認] 通知メッセージ確認.
void SetDropTargetMark(const CDragAddinT< T > &other)
[設定] ドロップ先のマーク設定.
bool CanDropping(void) const
[取得] ドロップモード取得.
void SetDragMode(bool can)
[設定] ドラッグモード設定.
bool CanDragging(void) const
[取得] ドラッグモード取得.
bool SendNofityMessage(CWnd *pWnd, WPARAM wParam, LPARAM lParam) const
[通知] メッセージ通知.
void SetDropTargetMark(const IDrawable &draw)
[設定] ドロップ先のマーク設定.
void SetDropTargetMark(COLORREF color, int thick=0)
[設定] ドロップ先のマーク設定.
virtual void OnDragNofity(UINT cmd, int draggingItem, int dropedItem)
[通知] ドラッグ通知.
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
[通知] for processing Windows messages.
EDragNotifyCode
ドラッグ通知種別コード.
WORD GetDragGroupID(void) const
[取得] ドロップグループID取得
EDropCtrlCode
ドロップコントロールコード.
@ CANDROP
ドロップ可能かチェック時に通知します。 通知を受けたコントロールは LRESULT で true(ドロップ可能),false(不可能) を返します。 LPARAM は TDropParam のポインタが...
virtual int OnBeginDrag(RECT &_rc, const POINT &po)
[通知] ドラッグ開始.
virtual bool Resize(const SIZE &size)=0
[設定] サイズ設定.
virtual IDrawable * Clone(void) const =0
[作成] クローン作成.
virtual void Draw(HDC dc, int x=0, int y=0) const =0
[描画] 描画.
POINT point
マウスカーソル位置(クライアント座標)。変更不可。
HRGN hRgn
クライアントの領域(クライアント座標)。変更可能。
int dragID
ドラッグ中のコントロールID。変更不可。
WORD ctrlID
コントロールID。変更可能。