WideStudio Programming (4-1)
~ドロップ通知先の登録

WM_DROPFILESメッセージの配信先を登録するにはWindows API の DropAcceptFilesを発行します。またそのためには、WM_DROPFILESメッセージの配信先となるウィンドウのウィンドウハンドル(HWND)が必要です。

WideStudioではWSCbaseクラスがすべてのウィンドウパーツの基底クラスになっていますから、ウィンドウハンドルの情報もここにある筈です。WideStudioのソースコードを調べていくと、WSCbaseクラスのインスタンスと結びついているウィンドウハンドルは二種類有り、WSCbaseクラスのインスタンスが保持しているWSDdevクラスのインスタンスから、getSpecialResource() もしくは getWindowResource() のいずれかで得られることが分かりました。どちらを使うかは何に使うものかによります。ドラッグアンドドロップの実装(ウィンドウプロシージャの入れ替え)ではgetWindowResource()で得られる方を使うとうまくいくようです。

タンゴレンでは有効性のチェックも込みでこんな↓関数を作って使っています。

void* GetWindowHWND(WSCbase* win)
{
    if( win == NULL ) return NULL;
    WSDdev *dev = win->getdev();
    if( dev == NULL ) return NULL;
    HWND hwnd = reinterpret_cast<HWND>(dev->getWindowResource());
    if( !IsWindow(hwnd) ) return NULL;
    return reinterpret_cast<void*>(hwnd);
}

配信先のHWNDが得られれば、ドロップ通知先の登録自体は簡単です。

 HWND hwnd = reinterpret_cast<HWND>(GetWindowHWND(配信先のウィンドウのWSCbase*));
 DragAcceptFiles(hwnd,TRUE);

(続く)