nim_duilib/examples/multi_browser/dragdrop/drag_form.h
jiajia_deng 4933d1f2bc Remove dependency on shared
Signed-off-by: jiajia_deng <2894220@gmail.com>
2019-09-20 16:27:58 +08:00

82 lines
1.9 KiB
C++

#pragma once
/** @class DragForm
* @brief 模仿系统拖拽功能的半透明窗体,因为使用了低级键盘钩子所以一些安全软件会拦截
* @copyright (c) 2016, NetEase Inc. All rights reserved
* @author Redrain
* @date 2019/3/20
*/
class BitmapControl;
class DragForm : public ui::WindowImplBase
{
public:
/**
* 低级键盘钩子的回调函数
* @param[in] nCode 操作码
* @param[in] wParam 附加参数
* @param[in] lParam 附加参数
* @return LRESULT 操作结果
*/
static LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam);
/**
* 创建自定义拖拽窗口
* @param[in] bitmap 拖拽效果位图
* @param[in] pt_offset 拖拽图像相对于鼠标的偏移
* @return void 无返回值
*/
static void CreateCustomDragImage(HBITMAP bitmap, POINT pt_offset);
/**
* 关闭自定义拖拽窗口
* @return void 无返回值
*/
static void CloseCustomDragImage();
public:
// 覆盖虚函数
virtual std::wstring GetSkinFolder() override;
virtual std::wstring GetSkinFile() override;
virtual std::wstring GetWindowClassName() const override;
virtual UINT GetClassStyle() const override;
/**
* 根据控件类名创建自定义控件
* @param[in] pstrClass 控件类名
* @return Control* 创建的控件的指针
*/
virtual ui::Control* CreateControl(const std::wstring& pstrClass) override;
/**
* 窗口初始化函数
* @return void 无返回值
*/
virtual void InitWindow() override;
private:
DragForm();
~DragForm(){};
/**
* 创建一个拖拽效果的窗口
* @param[in] bitmap 拖拽效果位图对象
* @param[in] pt_offset 拖拽图像相对于鼠标的偏移
* @return void 无返回值
*/
static DragForm* CreateDragForm(HBITMAP bitmap, POINT pt_offset);
/**
* 设置拖拽效果的位图
* @param[in] bitmap 拖拽效果位图对象
* @return void 无返回值
*/
void SetDragImage(HBITMAP bitmap);
public:
static const LPCTSTR kClassName;
private:
static HHOOK s_mouse_hook;
static DragForm *s_drag_form;
static POINT s_point_offset;
BitmapControl *bitmap_control_;
};