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

355 lines
10 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef UI_UTILS_WINIMPLBASE_H_
#define UI_UTILS_WINIMPLBASE_H_
#pragma once
namespace ui
{
#define UI_WNDSTYLE_FRAME (WS_VISIBLE | WS_OVERLAPPEDWINDOW)
#define UI_WNDSTYLE_DIALOG (WS_VISIBLE | WS_POPUPWINDOW | WS_CAPTION | WS_DLGFRAME | WS_CLIPSIBLINGS | WS_CLIPCHILDREN)
#define UI_CLASSSTYLE_FRAME (CS_VREDRAW | CS_HREDRAW)
#define UI_CLASSSTYLE_DIALOG (CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS | CS_SAVEBITS)
#ifndef WM_DPICHANGED
#define WM_DPICHANGED 0x02E0
#endif
class UILIB_API WindowImplBase : public Window, public IUIMessageFilter
{
public:
WindowImplBase();
virtual ~WindowImplBase();
/**
* @brief 当接收到窗口创建消息时被调用
* @return 无
*/
virtual void InitWindow(){}
/**
* @brief 当接收到窗口销毁消息时被调用
* @param[in] hWnd 要销毁的窗口句柄
* @return 无
*/
virtual void OnFinalMessage( HWND hWnd ) override;
/**
* @brief 获取窗口样式
* @return 返回窗口样式
*/
virtual LONG GetStyle();
/**
* @brief 获取窗口类样式
* @return 返回窗口类样式
*/
virtual UINT GetClassStyle() const;
/**
* @brief 待补充
* @param[in] 待补充
* @return 待补充
*/
virtual std::wstring GetResourceID() const;
/**
* @brief 当要创建的控件不是标准的控件名称时会调用该函数
* @param[in] pstrClass 控件名称
* @return 返回一个自定义控件指针,一般情况下根据 pstrClass 参数创建自定义的控件
*/
virtual Control* CreateControl(const std::wstring& pstrClass);
/**
* @brief 接收所有消息
* @param[in] uMsg 消息内容
* @param[in] wParam 消息附加参数
* @param[in] lParam 消息附加参数
* @param[out] bHandled 返回 true 则继续派发该消息,否则不再派发该消息
* @return 返回消息处理结果
*/
virtual LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
/**
* @brief 当收到窗口关闭消息时被调用
* @param[in] uMsg 消息内容
* @param[in] wParam 消息附加参数
* @param[in] lParam 消息附加参数
* @param[out] bHandled 返回 true 则继续派发该消息,否则不再派发该消息
* @return 返回消息处理结果
*/
virtual LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
/**
* @brief 当收到窗口被销毁消息时被调用
* @param[in] uMsg 消息内容
* @param[in] wParam 消息附加参数
* @param[in] lParam 消息附加参数
* @param[out] bHandled 返回 true 则继续派发该消息,否则不再派发该消息
* @return 返回消息处理结果
*/
virtual LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
/**
* @brief 当收到活动或非活动状态消息时被调用
* @param[in] uMsg 消息内容
* @param[in] wParam 消息附加参数
* @param[in] lParam 消息附加参数
* @param[out] bHandled 返回 true 则继续派发该消息,否则不再派发该消息
* @return 返回消息处理结果
*/
virtual LRESULT OnNcActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
/**
* @brief 当收到要计算客户区域大小消息时WM_NCCALCSIZE被调用
* @param[in] uMsg 消息内容
* @param[in] wParam 消息附加参数
* @param[in] lParam 消息附加参数
* @param[out] bHandled 返回 true 则继续派发该消息,否则不再派发该消息
* @return 返回消息处理结果
*/
virtual LRESULT OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
/**
* @brief 窗口位置或 Z 次序发生改变时被调用
* @param[in] uMsg 消息内容
* @param[in] wParam 消息附加参数
* @param[in] lParam 消息附加参数
* @param[out] bHandled 返回 true 则继续派发该消息,否则不再派发该消息
* @return 返回消息处理结果
*/
virtual LRESULT OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
/**
* @brief 当接收到绘制标题栏区域消息时被调用
* @param[in] uMsg 消息内容
* @param[in] wParam 消息附加参数
* @param[in] lParam 消息附加参数
* @param[out] bHandled 返回 true 则继续派发该消息,否则不再派发该消息
* @return 返回消息处理结果
*/
virtual LRESULT OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
/**
* @brief 当接收到标题栏区域双击消息时被调用
* @param[in] uMsg 消息内容
* @param[in] wParam 消息附加参数
* @param[in] lParam 消息附加参数
* @param[out] bHandled 返回 true 则继续派发该消息,否则不再派发该消息
* @return 返回消息处理结果
*/
virtual LRESULT OnNcLButtonDbClick(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
/**
* @brief 当接收到 WM_NCHITTEST 消息时被调用
* @param[in] uMsg 消息内容
* @param[in] wParam 消息附加参数
* @param[in] lParam 消息附加参数
* @param[out] bHandled 返回 true 则继续派发该消息,否则不再派发该消息
* @return 返回消息处理结果
*/
virtual LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
/**
* @brief 当接收到 WM_GETMINMAXINFO 消息时被调用
* @param[in] uMsg 消息内容
* @param[in] wParam 消息附加参数
* @param[in] lParam 消息附加参数
* @param[out] bHandled 返回 true 则继续派发该消息,否则不再派发该消息
* @return 返回消息处理结果
*/
virtual LRESULT OnGetMinMaxInfo(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
/**
* @brief 当接收到鼠标悬浮消息时被调用
* @param[in] uMsg 消息内容
* @param[in] wParam 消息附加参数
* @param[in] lParam 消息附加参数
* @param[out] bHandled 返回 true 则继续派发该消息,否则不再派发该消息
* @return 返回消息处理结果
*/
virtual LRESULT OnMouseWheel(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
/**
* @brief 当接收到窗口大小改变消息时被调用
* @param[in] uMsg 消息内容
* @param[in] wParam 消息附加参数
* @param[in] lParam 消息附加参数
* @param[out] bHandled 返回 true 则继续派发该消息,否则不再派发该消息
* @return 返回消息处理结果
*/
virtual LRESULT OnMouseHover(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
/**
* @brief 当接收到DPI改变消息时被调用只有在 Startup 中指定启用 DPI 适配后才会触发)
* @param[in] uMsg 消息内容
* @param[in] wParam 消息附加参数
* @param[in] lParam 消息附加参数
* @param[out] bHandled 返回 true 则继续派发该消息,否则不再派发该消息
* @return 返回消息处理结果
*/
virtual LRESULT OnDpiChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
/**
* @brief 当接收到窗口大小改变消息时被调用
* @param[in] uMsg 消息内容
* @param[in] wParam 消息附加参数
* @param[out] bHandled 返回 true 则继续派发该消息,否则不再派发该消息
* @return 返回消息处理结果
*/
virtual LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
/**
* @brief 当接收到字符按键消息时WM_CHAR被调用
* @param[in] uMsg 消息内容
* @param[in] wParam 消息附加参数
* @param[in] lParam 消息附加参数
* @param[out] bHandled 返回 true 则继续派发该消息,否则不再派发该消息
* @return 返回消息处理结果
*/
virtual LRESULT OnChar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
/**
* @brief 接收窗口控制命令消息时WM_SYSCOMMAND被调用
* @param[in] uMsg 消息内容
* @param[in] wParam 消息附加参数
* @param[in] lParam 消息附加参数
* @param[out] bHandled 返回 true 则继续派发该消息,否则不再派发该消息
* @return 返回消息处理结果
*/
virtual LRESULT OnSysCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
/**
* @brief 接收键盘按键按下消息时被调用
* @param[in] uMsg 消息内容
* @param[in] wParam 消息附加参数
* @param[in] lParam 消息附加参数
* @param[out] bHandled 返回 true 则继续派发该消息,否则不再派发该消息
* @return 返回消息处理结果
*/
virtual LRESULT OnKeyDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
/**
* @brief 接收失去焦点消息时被调用
* @param[in] uMsg 消息内容
* @param[in] wParam 消息附加参数
* @param[in] lParam 消息附加参数
* @param[out] bHandled 返回 true 则继续派发该消息,否则不再派发该消息
* @return 返回消息处理结果
*/
virtual LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
/**
* @brief 接收获取焦点消息时被调用
* @param[in] uMsg 消息内容
* @param[in] wParam 消息附加参数
* @param[in] lParam 消息附加参数
* @param[out] bHandled 返回 true 则继续派发该消息,否则不再派发该消息
* @return 返回消息处理结果
*/
virtual LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
/**
* @brief 接收到鼠标左键按下消息时被调用
* @param[in] uMsg 消息内容
* @param[in] wParam 消息附加参数
* @param[in] lParam 消息附加参数
* @param[out] bHandled 返回 true 则继续派发该消息,否则不再派发该消息
* @return 返回消息处理结果
*/
virtual LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
/**
* @brief 接收到鼠标左键弹起消息时被调用
* @param[in] uMsg 消息内容
* @param[in] wParam 消息附加参数
* @param[in] lParam 消息附加参数
* @param[out] bHandled 返回 true 则继续派发该消息,否则不再派发该消息
* @return 返回消息处理结果
*/
virtual LRESULT OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
/**
* @brief 接收到鼠标移动消息时被调用
* @param[in] uMsg 消息内容
* @param[in] wParam 消息附加参数
* @param[in] lParam 消息附加参数
* @param[out] bHandled 返回 true 则继续派发该消息,否则不再派发该消息
* @return 返回消息处理结果
*/
virtual LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
/**
* @brief 窗口消息的派发函数
* @param[in] uMsg 消息内容
* @param[in] wParam 消息附加参数
* @param[in] lParam 消息附加参数
* @param[out] bHandled 返回 true 则继续派发该消息,否则不再派发该消息
* @return 返回消息处理结果
*/
virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) override;
public:
/**
* @brief 激活窗口
* @return void 无返回值
*/
virtual void ActiveWindow();
/**
* @brief 设置窗口标题
* @param[in] title 窗口标题
* @return void 无返回值
*/
virtual void SetTaskbarTitle(const std::wstring &title);
/**
* @brief 置顶窗口
* @param[in] forever 是否一直置顶
* @return void 无返回值
*/
void ToTopMost(bool forever);
protected:
/**
* @brief 创建窗口时被调用,由子类实现用以获取窗口皮肤目录
* @return 子类需实现并返回窗口皮肤目录
*/
virtual std::wstring GetSkinFolder() = 0;
/**
* @brief 创建窗口时被调用,由子类实现用以获取窗口皮肤 XML 描述文件
* @return 子类需实现并返回窗口皮肤 XML 描述文件
*/
virtual std::wstring GetSkinFile() = 0;
/**
* @brief 创建窗口时被调用,由子类实现用以获取窗口唯一的类名称
* @return 子类需实现并返回窗口唯一的类名称
*/
virtual std::wstring GetWindowClassName(void) const = 0 ;
private:
/**
* @brief 收到窗口创建消息时被调用,请使用 InitWindow 接口来实现自定义需求
* @param[in] uMsg 消息ID
* @param[in] wParam 消息附加参数
* @param[in] lParam 消息附加参数
* @param[out] bHandled 消息是否已经被处理
* @return 返回消息处理结果
*/
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
/**
* @brief 窗口功能按钮被点击时调用
* @param[in] param 携带的参数
* @return 始终返回 true
*/
bool OnButtonClick(EventArgs* param);
};
}
#endif // UI_UTILS_WINIMPLBASE_H_