VC创建圆角dialog的实现方法

 更新时间:2016年08月06日 17:20:43   作者:RascallySnake  
这篇文章主要介绍了VC创建圆角dialog的实现方法,结合实例形式分析了圆角dialog对话框的创建步骤与相关操作技巧,需要的朋友可以参考下

本文实例讲述了VC创建圆角dialog的实现方法。分享给大家供大家参考,具体如下:

我们有时候需要圆角的对话框,要实现这样的效果,一般包括两步工作,第一步:将原有对话框的直角裁剪掉,第二步:为对话框画上圆角或者为对话框贴上一个圆角的图片。

第一步:我们在OnCreate函数中来实现,代码量也不多。

int CTestDialog::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CDialog::OnCreate(lpCreateStruct) == -1)
      return -1;
    HRGN hRgn;
    RECT rect;
    ::GetWindowRect(hwnd, &rect);
    hRgn = CreateRoundRectRgn(0, 0, rect.right - rect.left + 1, rect.bottom - rect.top + 1, 5,5);
    ::SetWindowRgn(hwnd, hRgn, TRUE);
}

如果对话框还支持Resize的话,那么需要在OnSize函数中拷贝一份上面的代码。

第二步:因为圆角部分的重绘属于对话框的非客户区,所以我们需要响应WM_NCPAINT消息,在消息响应函数中实现贴圆角图片的功能或者画上圆角线。

Void CTestDialog::OnNcPaint()
{
  CWindowDC dc(this);
  CRect rcWindow;
  CRect rcClient;
  this->GetClientRect(rcClient);
  this->ClientToScreen(rcClient);
  this->GetWindowRect(rcWindow);
  CPoint point = rcWindow.TopLeft();
  rcClient.OffsetRect(-point);
  rcWindow.OffsetRect(-point);
  int windowWidth = rcWindow.Width();
  int windowHeight = rcWindow.Height();
  HDC hMemDC = ::CreateCompatibleDC(dc.m_hDC);
  HBITMAP hBmp = ::CreateCompatibleBitmap(dc.m_hDC, windowWidth, windowHeight);
  ::SelectObject(hMemDC, hBmp);
  Graphics graphics(hMemDC);
  graphics.Clear(Color(255, 255, 255, 255));
  graphics.SetSmoothingMode(SmoothingModeHighQuality);
  //TODO:使用GDI+的DrawImage函数来贴上圆角图片,或者使用RoundRect函数来为对话框画上圆角线
  #if 0 /*使用DrawImage来绘制圆角图片*/
  ImageAttributes ia;
  ia.SetWrapMode( WrapModeTileFlipXY );
  graphic.DrawImage(pImg_LTFrame,……….);
  #endif
  #if 0 /*使用RoundRect来绘制圆角线*/
  RoundRect(hMemDC, rcWindow.left, rcWindow.top, rcWindow.right,rc.bottom, 5, 5 );
  #endif
  dc.IntersectClipRect(rcWindow);
  dc.ExcludeClipRect(rcClient);
  ::BitBlt(dc.m_hDC, 0, 0, windowWidth, windowHeight, hMemDC, 0, 0, SRCCOPY);
  ::DeleteDC(hMemDC);
  ::DeleteObject(hBmp);
}

为了达到自己想要的效果,可能还要响应WM_NCACTIVE和WM_NOTIFY两个消息,在这两个消息响应函数中实现和OnNCPaint函数一样的功能。

还有一个重要的消息WM_NCCALCSIZE,在这个消息响应函数中,主要是重新计算对话框的非客户区的大小,这个函数中的LPNCCALCSIZE_PARAMS类型参数lpncsp的lpncsp->rgrc[0]设置的是客户区的大小,客户区的高度减小时,非客户区的高度就增加了,因为对话框的总高度是固定的。在创建圆角矩形后,可能会出现客户区区域大了或者小了,这时,就需要响应该消息,在这个消息响应函数中对非客户区的大小进行调整。

希望本文所述对大家VC程序设计有所帮助。

相关文章

  • 循环队列详解及队列的顺序表示和实现

    循环队列详解及队列的顺序表示和实现

    这篇文章主要介绍了循环队列详解及队列的顺序表示和实现的相关资料,需要的朋友可以参考下
    2016-12-12
  • C语言实现数独游戏

    C语言实现数独游戏

    这篇文章主要为大家详细介绍了C语言实现数独游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • OpenCV reshape函数实现矩阵元素序列化

    OpenCV reshape函数实现矩阵元素序列化

    reshape函数是OpenCV中一个很有用的函数,不仅可以改变矩阵的通道数,还可以对矩阵元素进行序列化。本文将主要介绍如何通过reshape实现矩阵元素序列化,需要的小伙伴可以参考一下
    2021-12-12
  • c++难以发现的bug(有趣)

    c++难以发现的bug(有趣)

    这篇文章主要介绍了c++难以发现的bug(有趣)的相关资料,需要的朋友可以参考下
    2017-10-10
  • 详解C++中的vector容器及用迭代器访问vector的方法

    详解C++中的vector容器及用迭代器访问vector的方法

    使用迭代器iterator可以更方便地解引用和访问成员,当然也包括vector中的元素,本文就来详解C++中的vector容器及用迭代器访问vector的方法,需要的朋友可以参考下
    2016-05-05
  • C++ pair的用法案例详解

    C++ pair的用法案例详解

    这篇文章主要介绍了C++ pair的用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • C语言实现简易计算器功能

    C语言实现简易计算器功能

    这篇文章主要为大家详细介绍了C语言实现简易计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • OpenCV和C++实现图像的翻转(镜像)、平移、旋转、仿射与透视变换

    OpenCV和C++实现图像的翻转(镜像)、平移、旋转、仿射与透视变换

    这篇文章主要给大家介绍了关于OpenCV和C++实现图像的翻转(镜像)、平移、旋转、仿射与透视变换的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-09-09
  • C++ DFS算法实现走迷宫自动寻路

    C++ DFS算法实现走迷宫自动寻路

    这篇文章主要为大家详细介绍了C++ DFS算法实现走迷宫自动寻路,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • c语言实现http下载器的方法

    c语言实现http下载器的方法

    这篇文章主要介绍了c语言实现http下载器的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07

最新评论