首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何将 CS_DROPSHADOW 应用于 CDialog 的子类

要将 CS_DROPSHADOW 应用于 CDialog 的子类,请遵循以下步骤:

  1. 在派生类的构造函数中,使用 WS_POPUP 和 WS_VISIBLE 样式创建一个新的窗口。
  2. 在派生类的构造函数中,使用 CreateEx 方法创建一个新的窗口,并将 WS_EX_TOPMOST 和 WS_EX_TOOLWINDOW 作为扩展样式。
  3. 在派生类的构造函数中,使用 ModifyStyleEx 方法将 WS_EX_LAYERED 和 WS_EX_TRANSPARENT 添加到窗口的扩展样式。
  4. 在派生类的构造函数中,使用 SetLayeredWindowAttributes 方法设置窗口的不透明度和颜色键。
  5. 在派生类的构造函数中,使用 SetWindowPos 方法将窗口置于其他窗口的顶部。
  6. 在派生类的 OnInitDialog 方法中,使用 SetWindowPos 方法将窗口置于其他窗口的顶部。
  7. 在派生类的 OnPaint 方法中,使用 FillSolidRect 方法绘制窗口的背景。
  8. 在派生类的 OnNcPaint 方法中,使用 DrawEdge 方法绘制窗口的边框。
  9. 在派生类的 OnNcActivate 方法中,使用 DefWindowProc 方法处理 WM_NCACTIVATE 消息。
  10. 在派生类的 OnNcCalcSize 方法中,使用 DefWindowProc 方法处理 WM_NCCALCSIZE 消息。
  11. 在派生类的 OnNcHitTest 方法中,使用 DefWindowProc 方法处理 WM_NCHITTEST 消息。
  12. 在派生类的 OnNcMouseMove 方法中,使用 DefWindowProc 方法处理 WM_NCMOUSEMOVE 消息。
  13. 在派生类的 OnNcLButtonDown 方法中,使用 DefWindowProc 方法处理 WM_NCLBUTTONDOWN 消息。
  14. 在派生类的 OnNcLButtonUp 方法中,使用 DefWindowProc 方法处理 WM_NCLBUTTONUP 消息。
  15. 在派生类的 OnNcRButtonDown 方法中,使用 DefWindowProc 方法处理 WM_NCRBUTTONDOWN 消息。
  16. 在派生类的 OnNcRButtonUp 方法中,使用 DefWindowProc 方法处理 WM_NCRBUTTONUP 消息。
  17. 在派生类的 OnNcPaint 方法中,使用 DrawFrameControl 方法绘制窗口的控件。

以下是一个示例代码:

代码语言:cpp
复制
class CMyDialog : public CDialog
{
public:
    CMyDialog(CWnd* pParent = NULL)
        : CDialog(IDD_MYDIALOG, pParent)
    {
        Create(NULL, _T("My Dialog"));
        ModifyStyle(0, WS_POPUP | WS_VISIBLE);
        ModifyStyleEx(0, WS_EX_TOPMOST | WS_EX_TOOLWINDOW);
        ModifyStyleEx(0, WS_EX_LAYERED | WS_EX_TRANSPARENT);
        SetLayeredWindowAttributes(0, 255, LWA_ALPHA);
        SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
    }

    // ...

    afx_msg void OnPaint();
    afx_msg void OnNcPaint();
    afx_msg BOOL OnNcActivate(BOOL bActive);
    afx_msg LRESULT OnNcCalcSize(WPARAM wParam, LPARAM lParam);
    afx_msg LRESULT OnNcHitTest(CPoint point);
    afx_msg void OnNcMouseMove(UINT nHitTest, CPoint point);
    afx_msg void OnNcLButtonDown(UINT nHitTest, CPoint point);
    afx_msg void OnNcLButtonUp(UINT nHitTest, CPoint point);
    afx_msg void OnNcRButtonDown(UINT nHitTest, CPoint point);
    afx_msg void OnNcRButtonUp(UINT nHitTest, CPoint point);

    DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
    ON_WM_PAINT()
    ON_WM_NCPAINT()
    ON_WM_NCACTIVATE()
    ON_WM_NCCALCSIZE()
    ON_WM_NCHITTEST()
    ON_WM_NCMOUSEMOVE()
    ON_WM_NCLBUTTONDOWN()
    ON_WM_NCLBUTTONUP()
    ON_WM_NCRBUTTONDOWN()
    ON_WM_NCRBUTTONUP()
END_MESSAGE_MAP()

void CMyDialog::OnPaint()
{
    CPaintDC dc(this);
    CRect rect;
    GetClientRect(rect);
    dc.FillSolidRect(rect, RGB(255, 255, 255));
}

void CMyDialog::OnNcPaint()
{
    CWindowDC dc(this);
    CRect rect;
    GetWindowRect(rect);
    rect.OffsetRect(-rect.left, -rect.top);
    dc.DrawEdge(rect, EDGE_RAISED, BF_RECT);
}

BOOL CMyDialog::OnNcActivate(BOOL bActive)
{
    return TRUE;
}

LRESULT CMyDialog::OnNcCalcSize(WPARAM wParam, LPARAM lParam)
{
    return 0;
}

LRESULT CMyDialog::OnNcHitTest(CPoint point)
{
    return HTCLIENT;
}

void CMyDialog::OnNcMouseMove(UINT nHitTest, CPoint point)
{
}

void CMyDialog::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
}

void CMyDialog::OnNcLButtonUp(UINT nHitTest, CPoint point)
{
}

void CMyDialog::OnNcRButtonDown(UINT nHitTest, CPoint point)
{
}

void CMyDialog::OnNcRButtonUp(UINT nHitTest, CPoint point)
{
}

这个示例代码将创建一个具有阴影效果的窗口,并且可以通过绘制窗口的控件来自定义窗口的外观。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • c语言基础学习11_项目实战:IDE(集成开发环境)

    ============================================================================= ============================================================================= 涉及到的知识点有: 一、c++基础知识01 二、c++基础知识02   1、c语言中,如何在调用main函数之前就执行一段代码? 三、类与结构的区别01 四、类与结构的区别02 五、类的继承概念   1、一个mfc程序的例子的核心代码:   2、破解MFC中按钮的例子。   3、MFC版的小小IDE:   4、MFC版的小小浏览器: ============================================================================= ============================================================================= 会用到两个界面工具:vs2017下的MFC和QT,它们都是基于图形的。所以有些知识我们还没有学习到。 它们本身的构架就是用c++来完成的。

    02

    After Effects 图层属性及属性组结构详解

    在 After Effects 的脚本开发中,图层的属性可被区分为三种类型:PROPERTY、INDEXED_GROUP 和 NAMED_GROUP 。通过使用app.project.item().layer().propertySpec.propertyType可以对属性的类型进行判断。在 AEGP 插件的开发中这些类型对应为 AEGP_StreamGroupingType_LEAF 、AEGP_StreamGroupingType_INDEXED_GROUP 和 AEGP_StreamGroupingType_NAMED_GROUP,通过调用 AEGP_DynamicStreamSuite 的AEGP_GetStreamGroupingType方法进行获取。 PROPERTY(LEAF)类型的属性为属性组中最底层的属性,即具有对应的值可供用户操作调整的属性;INDEXED_GROUP 类型的属性组中子级的名称可编辑,换言之 INDEXED_GROUP 类型的属性组中的子级是不固定的,可进行增删,如效果和蒙版都是这种类型;NAMED_GROUP 类型的属性组具有固定的子级属性,且子级属性的名称是不可更改的。 在脚本中直接输出 propertyType 时会输出一个数字,这是 ExtendScript 中定义的 PropertyType 枚举。

    03

    Sub-Category Optimization for Multi-View Multi-Pose Object Detection

    外观变化大的目标类别检测是计算机视觉领域的一个基本问题。由于类内部的可变性、视角和照明,目标类别的外观可能会发生变化。对于外观变化较大的目标类别,需要使用基于子类别的方法。本文提出了一种基于外观变化自动将一个目标类别划分成适当数量的子类别的子类别优化方法。我们没有使用基于领域知识或验证数据集的预定义的类内子分类,而是使用基于鉴别图像特征的非监督聚类来划分样本空间。然后利用子类别判别分析验证了聚类性能。基于无监督方法的聚类性能和子类别判别分析结果,确定了每个目标类别的最优子类别数。大量的实验结果显示使用两个标准和作者自己的数据库。比较结果表明,我们的方法优于最先进的方法。

    04
    领券