nim_duilib/samples/multi_browser/dragdrop/drag_form.cpp

131 lines
2.9 KiB
C++
Raw Normal View History

2019-04-19 17:19:57 +08:00
#include "drag_form.h"
#include "bitmap_control.h"
using namespace ui;
DragForm *DragForm::s_drag_form = NULL;
HHOOK DragForm::s_mouse_hook = NULL;
POINT DragForm::s_point_offset = { 0, 0 };
const LPCTSTR DragForm::kClassName = L"NimDragForm";
LRESULT CALLBACK DragForm::LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION)
{
if (wParam == WM_MOUSEMOVE &&::GetKeyState(VK_LBUTTON) < 0)
{
MOUSEHOOKSTRUCT *pMouseStruct = (MOUSEHOOKSTRUCT *)lParam;
if (NULL != pMouseStruct)
{
if (NULL != s_drag_form)
{
//ϵͳ<CFB5><CDB3>ק<EFBFBD><D7A7><EFBFBD>ڡ<EFBFBD><DAA1><EFBFBD><EFBFBD>⣺Drag<61><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SysDragImage<67><65>GWL_EXSTYLE:524456
//WS_EX_TOPMOST--WS_EX_TRANSPARENT--WS_EX_PALETTEWINDOW--WS_EX_LAYERED--WS_EX_TOOLWINDOW
ui::UiRect rc(pMouseStruct->pt.x - s_point_offset.x, pMouseStruct->pt.y - s_point_offset.y, 0, 0);
s_drag_form->SetPos(rc, false, SWP_NOSIZE);
}
}
}
}
return CallNextHookEx(s_mouse_hook, nCode, wParam, lParam);
}
void DragForm::CreateCustomDragImage(HBITMAP bitmap, POINT pt_offset)
{
ASSERT(NULL != bitmap);
s_mouse_hook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)DragForm::LowLevelMouseProc, GetModuleHandle(NULL), 0);
s_drag_form = DragForm::CreateDragForm(bitmap, pt_offset);
s_point_offset = pt_offset;
}
void DragForm::CloseCustomDragImage()
{
if (NULL != s_drag_form)
{
s_drag_form->Close();
s_drag_form = NULL;
}
if (NULL != s_mouse_hook)
{
UnhookWindowsHookEx(s_mouse_hook);
s_mouse_hook = NULL;
}
}
DragForm* DragForm::CreateDragForm(HBITMAP bitmap, POINT pt_offset)
{
DragForm *drag_form = new DragForm;
HWND hwnd = drag_form->Create(NULL, kClassName, UI_WNDSTYLE_FRAME, WS_EX_TOPMOST | WS_EX_TRANSPARENT | WS_EX_LAYERED | WS_EX_TOOLWINDOW);
ASSERT(hwnd != NULL);
drag_form->SetDragImage(bitmap);
POINT pt;
BITMAP bitmap_info;
::GetCursorPos(&pt);
GetObject(bitmap, sizeof(BITMAP), &bitmap_info);
// <20><><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD>λ<EFBFBD><CEBB>
UiRect rect;
rect.left = pt.x - pt_offset.x;
rect.top = pt.y - pt_offset.y;
rect.right = rect.left + bitmap_info.bmWidth;
rect.bottom = rect.top + bitmap_info.bmHeight;
drag_form->SetPos(rect, false, SWP_SHOWWINDOW);
return drag_form;
}
DragForm::DragForm()
{
bitmap_control_ = NULL;
}
std::wstring DragForm::GetSkinFolder()
{
return L"multi_browser";
}
std::wstring DragForm::GetSkinFile()
{
return L"drag_form.xml";
}
ui::Control* DragForm::CreateControl(const std::wstring& pstrClass)
{
if (pstrClass == L"BitmapControl")
{
return new BitmapControl;
}
return NULL;
}
std::wstring DragForm::GetWindowClassName() const
{
return kClassName;
}
UINT DragForm::GetClassStyle() const
{
return (UI_CLASSSTYLE_FRAME);
}
void DragForm::InitWindow()
{
bitmap_control_ = static_cast<BitmapControl*>(FindControl(L"bitmap"));
ASSERT(NULL != bitmap_control_);
// <20><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD>
bitmap_control_->SetAlpha(128);
this->SetFocus(bitmap_control_);
}
void DragForm::SetDragImage(HBITMAP bitmap)
{
ASSERT(NULL != bitmap);
bitmap_control_->SetBitmapImage(bitmap);
}