text: #pragma once
  
  namespace nim_comp
  {
  /** @class MsgRecordForm
    * @brief 模仿系统拖拽功能的半透明窗体，因为使用了低级键盘钩子所以一些安全软件会拦截
    * @copyright (c) 2016, NetEase Inc. All rights reserved
    * @author Redrain
    * @date 2016/9/1
    */
  class BitmapControl;
  class DragForm : public nim_comp::WindowEx
  {
  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 std::wstring GetWindowId() 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_;
  };
  }