TNB Library
クラス | 公開型 | 公開メンバ関数 | 静的公開メンバ関数 | 限定公開メンバ関数 | 全メンバ一覧
CDragAddinT< TYP > クラステンプレート

ドラッグコントロールアドインクラス [詳解]

#include <TnbMfcDrag.h>

+ CDragAddinT< TYP > の継承関係図

クラス

struct  TDropParam
 ドロップコントロールパラメータ [詳解]
 

公開型

enum  EDragNotifyCode {
  START = 0 , HOVER , LEAVE , CANCEL ,
  INVALID , DROP , ISDROP
}
 ドラッグ通知種別コード. [詳解]
 
enum  EDropCtrlCode { CANDROP = 100 }
 ドロップコントロールコード. [詳解]
 

公開メンバ関数

bool CanDragging (void) const
 [取得] ドラッグモード取得. [詳解]
 
bool CanDropping (void) const
 [取得] ドロップモード取得. [詳解]
 
 CDragAddinT (void)
 コンストラクタ [詳解]
 
WORD GetDragGroupID (void) const
 [取得] ドロップグループID取得 [詳解]
 
void GetDropTargetMark (const IDrawable *&_draw, COLORREF &_color, int &_thick) const
 [取得] ドロップ先のマーク設定取得. [詳解]
 
DWORD GetExStyle (void) const
 [取得] ウィンドウ拡張スタイル取得. [詳解]
 
HWND GetSafeHwnd (void) const
 [取得] ウィンドウハンドル取得. [詳解]
 
DWORD GetStyle (void) const
 [取得] ウィンドウスタイル取得. [詳解]
 
BOOL ModifyStyle (DWORD dwRemove, DWORD dwAdd, UINT nFlags=0)
 [設定] ウィンドウスタイル変更. [詳解]
 
BOOL ModifyStyleEx (DWORD dwRemove, DWORD dwAdd, UINT nFlags=0)
 [設定] ウィンドウ拡張スタイル変更. [詳解]
 
void SetDraggingBitmap (CBitmapHandle bmp)
 [設定] ドラック中ビットマップ設定. [詳解]
 
void SetDragGroupID (WORD w)
 [設定] ドロップグループID設定 [詳解]
 
void SetDragMode (bool can)
 [設定] ドラッグモード設定. [詳解]
 
void SetDropMode (bool can)
 [設定] ドロップモード設定. [詳解]
 
void SetDropTargetMark (COLORREF color, int thick=0)
 [設定] ドロップ先のマーク設定. [詳解]
 
template<typename T >
void SetDropTargetMark (const CDragAddinT< T > &other)
 [設定] ドロップ先のマーク設定. [詳解]
 
void SetDropTargetMark (const IDrawable &draw)
 [設定] ドロップ先のマーク設定. [詳解]
 
BOOL SetWindowPos (const CWnd *pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags)
 [設定] ウィンドウサイズポジション設定. [詳解]
 
BOOL ShowWindow (int nCmdShow)
 [設定] ウィンドウ表示状態. [詳解]
 
 ~CDragAddinT (void)
 デストラクタ [詳解]
 

静的公開メンバ関数

static UINT GetDragNotifyMessage (void)
 [取得] 通知用メッセージコード取得. [詳解]
 

限定公開メンバ関数

bool IsNofityMessage (UINT message) const
 [確認] 通知メッセージ確認. [詳解]
 
virtual int OnBeginDrag (RECT &_rc, const POINT &po)
 [通知] ドラッグ開始. [詳解]
 
virtual void OnDragNofity (UINT cmd, int draggingItem, int dropedItem)
 [通知] ドラッグ通知. [詳解]
 
bool SendNofityMessage (CWnd *pWnd, WPARAM wParam, LPARAM lParam) const
 [通知] メッセージ通知. [詳解]
 
virtual LRESULT WindowProc (UINT message, WPARAM wParam, LPARAM lParam)
 [通知] for processing Windows messages. [詳解]
 

詳解

template<typename TYP = CStatic>
class TNB::MFC::CDragAddinT< TYP >

ドラッグコントロールアドインクラス

本クラスを使用すると、ドラッグすることが可能になります。

ドラック開始時、ドラッグ中止時、ドロップ時にメッセージを親に通知します。
通知メッセージは以下のようになります。 \n
    message = MSG (テンプレートの引数リスト、参照) \n
    WPARAMの上位WORD = グループID( SetDragGroupID() 参照)。\n
    WPARAMの下位WORD = 通知種別( CDragAddinT::EDragNotifyCode ) 。  \n
    LPARAMの上位WORD = 相手コントロールID (コマンド種別がドラック開始やキャンセルの時は0固定)。 \n
    LPARAMの下位WORD = ドラックコントロールID 。  \n
※通知種別 ISDROP は、普通のコントロールだけど、ドロップ対象にしたい場合に使用します。
覚え書き
上位WORDは HIWORD() マクロを使うと便利です。
下位WORDは LOWORD() マクロを使うと便利です。
ポイント:
ドロップ対象コントロールについて。
ドロップ可能のコントロールは、メッセージで応答したものが対象になります。
まず、本クラスをアドインしたコントロールをドラッグすると、マウス下にあるコントロールに GetDragNotifyMessage() で得られるメッセージを SendMessage します。その際、 WPARAM の下位WORDには CANDROP 、上位WORDには グループID、LPARAM は TDropParam のポインタが入っています。 コントロールが 1 で応答すると、ドロップ可能なコントロールと判断します( TDropParam には、 コントロールの領域やIDが入っており、変更も可能)。
また、コントロールが 0(拒否・未サポート)を返した場合、親ダイアログに、 通知種別 = ISDROP で 通知メッセージを送ります。これにより標準のコントロールもドロップ対象にすることが可能です。
なお、 本クラスをアドインしたコントロールは、上記メッセージに対応しており、 SetDropMode() で、ドロップ許可、拒否の設定、 SetDragMode() でドラッグ許可、拒否の設定が可能です。
使用例
    //= 宣言
    typedef CDragAddinT<CStatic> CDragStatic;
            ;
    class CXXXX : public CDialog
    {
            ;
        CDragStatic m_dragText;     // <- 元々 CStaticだったメンバを書き換えた
            ;
        afx_msg LRESULT OnDroped(WPARAM wParam, LPARAM lParam);
            ;

    //= 設定(グローバル)
    static UINT s_uDropMessage = CDragStatic::GetNotifyMessage();
    BEGIN_MESSAGE_MAP(CXXXX, CDialog)
        //{{AFX_MSG_MAP(CMfcTestAppDlg)
            ;
        //}}AFX_MSG_MAP
        ON_REGISTERED_MESSAGE(s_uDropMessage, OnDroped)     //←追加
    END_MESSAGE_MAP()

    //= 処理(OnDroped() 内)
    LRESULT CXXXX::OnDroped(WPARAM wParam, LPARAM lParam)
    {
        switch( LOWORD(wParam) )
        {
        case CDragStatic::START:        // ドラック開始
            TRACE1("ID = %d をドラッグ開始", LOWORD(lParam));
            break;
        case CDragStatic::CANCEL:       // キャンセル(ドラック終了)
            TRACE1("ID = %d のドラックを中止", LOWORD(lParam));
            break;
        case CDragStatic::INVALID:      // 無効(ドラック終了)
            TRACE1("ID = %d は許可できないところへドロップ", LOWORD(lParam));
            break;
        case CDragStatic::DROP:         // ドロップ(ドラック終了)
            TRACE2("ID = %d から %d へドラッグ", LOWORD(lParam), HIWORD(lParam));
            break;
        case CDragStatic::HOVER:        // ホバー(ドラック中)
            TRACE2("ID = %dが%dの上", LOWORD(lParam), HIWORD(lParam));
            break;
        case CDragStatic::LEAVE:        // ホバー終了(ドラック中)
            TRACE2("ID = %dが%dの上からはなれた", LOWORD(lParam), HIWORD(lParam));
            break;
        case CDragStatic::ISDROP:       // ドロップ確認
            TRACE2("ID = %dが%dの上へ。IDOK ならドロップ可能に", LOWORD(lParam), HIWORD(lParam));
            return HIWORD(lParam) == IDOK; 
        }
        return 0;
    }
    
引数
TYP要素の型。CWnd のサブクラスである必須があります。
必要ファイル
TnbMfcDrag.h
日付
07/10/11 新規作成
07/10/16 専用メッセージに変更。
07/10/26 INVALID 通知を追加。
07/10/31 画像取得方法を変更。
07/11/14 リスナー、装備。 ドロップ可能のアイテムにマークをつけられるようにした。
07/12/06 ドロップ対象の登録方法を変更。
07/12/25 ドロップマーク指定方法、追加。 Listener 廃止。
08/03/04 Drag中の 破棄時に、Drag状態を解除するように修正。
09/04/15 Leave時、コントロール再描画処理を最適化。

TnbMfcDrag.h124 行目に定義があります。

列挙型メンバ詳解

◆ EDragNotifyCode

ドラッグ通知種別コード.

通知メッセージのWPARAM の下位WORDに格納されています。

覚え書き
親ダイアログに通知されます。
列挙値
START 

ドラック開始.

HOVER 

ホバー(ドラック中).

LEAVE 

ホバー終了(ドラック中).

CANCEL 

キャンセル(ドラック終了).

INVALID 

無効ドロップ(ドラック終了).

DROP 

有効ドロップ(ドラック終了).

ISDROP 

ドロップ確認.

TnbMfcDrag.h134 行目に定義があります。

◆ EDropCtrlCode

ドロップコントロールコード.

通知メッセージの WPARAM の下位WORDに格納されています。

覚え書き
自分自身に通知されます。
列挙値
CANDROP 

ドロップ可能かチェック時に通知します。 通知を受けたコントロールは LRESULT で true(ドロップ可能),false(不可能) を返します。 LPARAM は TDropParam のポインタが格納されます(必要に応じて変更します)。

TnbMfcDrag.h150 行目に定義があります。

構築子と解体子

◆ CDragAddinT()

CDragAddinT ( void  )

コンストラクタ

TnbMfcDrag.h178 行目に定義があります。

◆ ~CDragAddinT()

~CDragAddinT ( void  )

デストラクタ

TnbMfcDrag.h189 行目に定義があります。

関数詳解

◆ CanDragging()

bool CanDragging ( void  ) const

[取得] ドラッグモード取得.

戻り値
trueドラッグ可能.
falseドラッグ不可能.

TnbMfcDrag.h300 行目に定義があります。

◆ CanDropping()

bool CanDropping ( void  ) const

[取得] ドロップモード取得.

戻り値
trueドロップ可能.
falseドロップ不可能.

TnbMfcDrag.h319 行目に定義があります。

◆ GetDragGroupID()

WORD GetDragGroupID ( void  ) const

[取得] ドロップグループID取得

戻り値
グループ値。

TnbMfcDrag.h209 行目に定義があります。

◆ GetDragNotifyMessage()

static UINT GetDragNotifyMessage ( void  )
static

[取得] 通知用メッセージコード取得.

戻り値
通知用メッセージコード.

TnbMfcDrag.h172 行目に定義があります。

◆ GetDropTargetMark()

void GetDropTargetMark ( const IDrawable *&  _draw,
COLORREF &  _color,
int &  _thick 
) const

[取得] ドロップ先のマーク設定取得.

引数
[out]_draw描画情報。
[out]_colorカラー。
[out]_thick太さ。

TnbMfcDrag.h279 行目に定義があります。

◆ GetExStyle()

DWORD GetExStyle ( void  ) const
inherited

[取得] ウィンドウ拡張スタイル取得.

本インスタンスが管理しているウィンドウの拡張スタイルを返します。

戻り値
ウィンドウスタイル。 WS_EX_LEFT や WS_EX_TOPMOST などのシンボルが論理和(or)されている。

◆ GetSafeHwnd()

HWND GetSafeHwnd ( void  ) const
inherited

[取得] ウィンドウハンドル取得.

本インスタンスが管理しているウィンドウのハンドルを返します。

戻り値
ウィンドウハンドル

◆ GetStyle()

DWORD GetStyle ( void  ) const
inherited

[取得] ウィンドウスタイル取得.

本インスタンスが管理しているウィンドウのスタイルを返します。

戻り値
ウィンドウスタイル。 WS_CHILD や WS_MINIMIZE などのシンボルが論理和(or)されている。

◆ IsNofityMessage()

bool IsNofityMessage ( UINT  message) const
protected

[確認] 通知メッセージ確認.

引数
message比較メッセージ。
戻り値
true通知メッセージ。
false否。

TnbMfcDrag.h344 行目に定義があります。

◆ ModifyStyle()

BOOL ModifyStyle ( DWORD  dwRemove,
DWORD  dwAdd,
UINT  nFlags = 0 
)
inherited

[設定] ウィンドウスタイル変更.

引数
dwRemove除去するスタイルを指定する。
dwAdd追加するスタイルを指定する。
nFlagsSetWindowPos() に渡すフラグ。0なら SetWindowPos() を呼びません。
戻り値
TRUE成功.
FALSE失敗.

◆ ModifyStyleEx()

BOOL ModifyStyleEx ( DWORD  dwRemove,
DWORD  dwAdd,
UINT  nFlags = 0 
)
inherited

[設定] ウィンドウ拡張スタイル変更.

引数
dwRemove除去する拡張スタイルを指定する。
dwAdd追加する拡張スタイルを指定する。
nFlagsSetWindowPos() に渡すフラグ。0なら SetWindowPos() を呼びません。
戻り値
TRUE成功.
FALSE失敗.

◆ OnBeginDrag()

virtual int OnBeginDrag ( RECT &  _rc,
const POINT &  po 
)
protectedvirtual

[通知] ドラッグ開始.

引数
[in,out]_rcアイテム範囲。inで ::GetWindowRect() した範囲が入っています(Window座標)。
[in]poマウスのポジション(Window座標)。
戻り値
0ドラック出来ない.
1以上コントロールID

CDragDrawingListCtrlで再実装されています。

TnbMfcDrag.h418 行目に定義があります。

◆ OnDragNofity()

virtual void OnDragNofity ( UINT  cmd,
int  draggingItem,
int  dropedItem 
)
protectedvirtual

[通知] ドラッグ通知.

覚え書き
親に通知するものと同じものが通知されます。
引数
cmdコマンド.
draggingItemドラッグ元アイテムID
dropedItemドロップ先アイテムID

TnbMfcDrag.h434 行目に定義があります。

◆ SendNofityMessage()

bool SendNofityMessage ( CWnd pWnd,
WPARAM  wParam,
LPARAM  lParam 
) const
protected

[通知] メッセージ通知.

引数
pWnd通知先。
wParamWPARAM。
lParamLPARAM。
戻り値
応答。

TnbMfcDrag.h333 行目に定義があります。

◆ SetDraggingBitmap()

void SetDraggingBitmap ( CBitmapHandle  bmp)

[設定] ドラック中ビットマップ設定.

ドラック中の絵を指定できます。指定しない場合、コントロールの大きさでキャプチャした物を使います。

引数
bmpビットマップ。

TnbMfcDrag.h219 行目に定義があります。

◆ SetDragGroupID()

void SetDragGroupID ( WORD  w)

[設定] ドロップグループID設定

覚え書き
この値は通知メッセージの WPARAM の上位WORDに格納されます。 グループ値を設定することで、同時に複数のドラックアンドドロップグループを配置できます。
引数
wグループ値。

TnbMfcDrag.h200 行目に定義があります。

◆ SetDragMode()

void SetDragMode ( bool  can)

[設定] ドラッグモード設定.

引数
cantrue ならドラッグ可能になります。 false ならドラッグ出来なくなります。

TnbMfcDrag.h290 行目に定義があります。

◆ SetDropMode()

void SetDropMode ( bool  can)

[設定] ドロップモード設定.

引数
cantrue ならドロップを許可します。 false なら許可しません。

TnbMfcDrag.h309 行目に定義があります。

◆ SetDropTargetMark() [1/3]

void SetDropTargetMark ( COLORREF  color,
int  thick = 0 
)

[設定] ドロップ先のマーク設定.

ドロップ可能のアイテムにマークを表示することが出来ます。

覚え書き
設定しないと、選択色の太さ2になっています。
引数
colorカラー。
thick太さ。0なら設定変更なし。

TnbMfcDrag.h263 行目に定義があります。

◆ SetDropTargetMark() [2/3]

void SetDropTargetMark ( const CDragAddinT< T > &  other)

[設定] ドロップ先のマーク設定.

ドロップ可能のアイテムにマークを表示することが出来ます。

覚え書き
設定しないと、選択色の太さ2になっています。
引数
otherコピー元。

TnbMfcDrag.h231 行目に定義があります。

◆ SetDropTargetMark() [3/3]

void SetDropTargetMark ( const IDrawable draw)

[設定] ドロップ先のマーク設定.

ドロップ可能のアイテムにマークを表示することが出来ます。

覚え書き
設定しないと、選択色の太さ2になっています。
引数
draw描画情報(Resize() を使用します)。複製を保持しますので、 draw は破棄してかまいません。

TnbMfcDrag.h251 行目に定義があります。

◆ SetWindowPos()

BOOL SetWindowPos ( const CWnd pWndInsertAfter,
int  x,
int  y,
int  cx,
int  cy,
UINT  nFlags 
)
inherited

[設定] ウィンドウサイズポジション設定.

子ウィンドウ、ポップアップ ウィンドウ、およびトップレベル ウィンドウのサイズ、位置、および Z オーダーを変更します。

引数
pWndInsertAfterZ オーダーでこの CWnd オブジェクトより前に配置される CWnd オブジェクトを識別します。このパラメータへは、 CWnd へのポインタか 次の値のいずれか 1 つを指定できます。
  • wndBottom ウィンドウを Z オーダーの一番下に置きます。この CWnd が最上位のウィンドウの場合、ウィンドウの最上位ステータスは失われます。 システムでは、このウィンドウをほかのすべてのウィンドウよりも下に置きます。
  • wndTop ウィンドウを Z オーダーの先頭に置きます。
  • wndTopMost ウィンドウを最上位でないすべてのウィンドウの上に置きます。 ウィンドウは、非アクティブになったときも、最上位の位置を保持します。
  • wndNoTopMost ウィンドウを最上位でないすべてのウィンドウの先頭に再配置します (つまり、一番手前のすべてのウィンドウの後ろに置きます)。 ウィンドウが既に非最上位ウィンドウとなっているときは、このフラグは無効です。
xウィンドウの新しい左辺の位置を指定します。
yウィンドウの新しい上辺の位置を指定します。
cxウィンドウの新しい幅を指定します。
cyウィンドウの新しい高さを指定します。
nFlagsサイズ変更オプションおよび位置指定オプションを指定します。このパラメータには、次の値を組み合わせて指定できます。
  • SWP_DRAWFRAME ウィンドウの周りにフレーム (ウィンドウ作成時に定義されます) を描画します。
  • SWP_FRAMECHANGED ウィンドウのサイズが変化されていない場合でも、ウィンドウに WM_NCCALCSIZE メッセージを送信します。このフラグが指定されていない場合、WM_NCCALCSIZE メッセージはウィンドウのサイズが実際に変化しているときにだけ送られます。
  • SWP_HIDEWINDOW ウィンドウを非表示にします。
  • SWP_NOACTIVATE ウィンドウをアクティブにしません。このフラグが設定されていないと、ウィンドウはアクティブになり、最上位または非最上位のウィンドウ グループのいずれかの先頭に移動されます (パラメータ pWndInsertAfter の設定に依存します)。
  • SWP_NOCOPYBITS クライアント領域の内容全体を破棄します。このフラグが指定されていない場合、クライアント領域の有効な内容はすべて保存されます。保存された内容は、ウィンドウのサイズや位置が再び変更されたときにクライアント領域に復元されます。
  • SWP_NOMOVE 現在位置を保持します (x パラメータと y パラメータを無視します)。
  • SWP_NOOWNERZORDER オーナー ウィンドウの Z オーダーの位置を変更しません。
  • SWP_NOREDRAW 変更があっても再描画しません。このフラグが設定されていると、どのような種類の再描画も行われません。このことは、クライアント領域、非クライアント領域 (タイトルやスクロール バーを含みます)、ウィンドウが移動したことにより覆われない親ウィンドウのあらゆる部分に適用されます。このフラグが設定されているときは、アプリケーションは再描画が必要なウィンドウや親ウィンドウのあらゆる部分を明示的に無効領域または再描画する必要があります。
  • SWP_NOREPOSITION SWP_NOOWNERZORDER と同じです。
  • SWP_NOSENDCHANGING ウィンドウが WM_WINDOWPOSCHANGING メッセージを受信しないようにします。
  • SWP_NOSIZE 現在のサイズを保持します (cx パラメータと cy パラメータを無視します)。
  • SWP_NOZORDER 現在の順序を保持します (pWndInsertAfter を無視します)。
  • SWP_SHOWWINDOW ウィンドウを表示します。
戻り値
TRUE成功.
FALSE失敗.

◆ ShowWindow()

BOOL ShowWindow ( int  nCmdShow)
inherited

[設定] ウィンドウ表示状態.

引数
nCmdShowCWnd を表示する方法を指定します。次の値のいずれかになります。
  • SW_HIDE このウィンドウを非表示にし、他のウィンドウをアクティブにします。
  • SW_MINIMIZE ウィンドウを最小化し、システムのリストのトップレベル ウィンドウをアクティブにします。
  • SW_RESTORE ウィンドウをアクティブにし、表示します。ウィンドウが最小化または最大化されている場合は、Windows によって元のサイズと位置に戻されます。
  • SW_SHOW ウィンドウをアクティブにし、現在のサイズと位置で表示します。
  • SW_SHOWMAXIMIZED ウィンドウをアクティブにし、最大表示します。
  • SW_SHOWMINIMIZED ウィンドウをアクティブにし、最小化して表示します。
  • SW_SHOWMINNOACTIVE ウィンドウを最小化して表示します。現在アクティブなウィンドウはアクティブなまま表示します。
  • SW_SHOWNA 現在の状態でウィンドウを表示します。現在アクティブなウィンドウはアクティブなまま表示します。
  • SW_SHOWNOACTIVATE ウィンドウを直前のサイズと位置で表示します。現在アクティブなウィンドウはアクティブなまま表示します。
  • SW_SHOWNORMAL ウィンドウをアクティブにし、表示します。ウィンドウが最小化または最大化されている場合は、Windows によって元のサイズと位置に戻されます。
戻り値
TRUE成功.
FALSE失敗.

◆ WindowProc()

virtual LRESULT WindowProc ( UINT  message,
WPARAM  wParam,
LPARAM  lParam 
)
protectedvirtual

[通知] for processing Windows messages.

メッセージ受信したらコールされます。

覚え書き
CWndのメソッドをオーバーライドしています。
引数
messageメッセージ
wParamWPARAM
lParamLPARAM
戻り値
リザルト。

CDragDrawingListCtrlで再実装されています。

TnbMfcDrag.h358 行目に定義があります。