在客户区、非客户区和桌面画线

 

来自孙鑫《VC++深入详解》 
 
客户区:即视类窗口
非客户区:包括标题栏、菜单栏、工具栏和状态栏。
在画图之前,需要获取线图的起始点与终点。即鼠标左键按下是起始点,左键弹起是终点。
以下代码中的m_ptOrigin均记录在OnLButtonDown函数中,m_ptOrigin = point ;
 
一:利用Platform SDK函数实现客户区画线功能
void CTView::OnLButtonUp(UINT nFlags, CPoint point)
{
       //首先获得窗口的设备描述表
       HDC hdc;
       hdc = ::GetDC( m_hWnd );
   
       //移动到线条的起点
       MoveToEx( hdc, m_ptOrigin.x, m_ptOrigin.y, NULL );
       //画线
       LineTo( hdc, point.x, point.y );
    //释放设备描述表
       ::ReleaseDC( m_hWnd, hdc );
      
       CView::OnLButtonUp(nFlags, point);
}
 
二:利用MFC的CDC类在客户区实现画线功能
void CTView::OnLButtonUp(UINT nFlags, CPoint point)
{
       CDC *pDC = GetDC();
       pDC->MoveTo( m_ptOrigin );
       pDC->LineTo( point );
       ReleaseDC( pDC );
 
       CView::OnLButtonUp(nFlags, point);
}
 
三:利用MFC的CClientDC类在客户区实现画线功能
void CTView::OnLButtonUp(UINT nFlags, CPoint point)
{
       CClientDC dc(this);
       dc.MoveTo(m_ptOrigin);
       dc.LineTo(point);
       CView::OnLButtonUp(nFlags, point);
}
 
四:利用MFC的CWindowDC类在客户区实现画线功能
void CTView::OnLButtonUp(UINT nFlags, CPoint point)
{
       CWindowDC dc(this);
       dc.MoveTo(m_ptOrigin);
       dc.LineTo(point);
CView::OnLButtonUp(nFlags, point);
}
 
五:利用MFC的CClientDC类在非客户区实现画线功能
void CTView::OnLButtonUp(UINT nFlags, CPoint point)
{
       CClientDC dc(GetParent());
       dc.MoveTo(m_ptOrigin);
       dc.LineTo(point);
       CView::OnLButtonUp(nFlags, point);
}
注:视类窗口只有客户区(即视类窗口本身),而框架窗口既有客户区(即菜单栏以下部分),还有非客户区(标题栏、菜单栏、工具栏和状态栏)。视窗口的父窗口就是框架窗口即与CMainFrame类相关联的窗口
 
六:利用MFC的CWindowDC类在非客户区实现画线功能
void CTView::OnLButtonUp(UINT nFlags, CPoint point)
{
       CWindowDC dc( GetParent() );
       dc.MoveTo(m_ptOrigin);
       dc.LineTo(point);
    CView::OnLButtonUp(nFlags, point);
}
 
七:利用MFC的CWindowDC类在桌面区实现画线功能
void CTView::OnLButtonUp(UINT nFlags, CPoint point)
{
       CWindowDC dc(GetDesktopWindow());
       dc.MoveTo(m_ptOrigin);
       dc.LineTo(point);
    CView::OnLButtonUp(nFlags, point);
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
客户自绘wtl版本指的是在Windows模板库(WTL)基础上通过自主绘制客户来定制界面的版本。 WTL是一个开源的C++模板库,用于简化Windows桌面应用程序的开发。它相较于MFC更轻量级,更容易学习和使用。WTL提供了一系列的模板类和宏,可以快速开发具有Windows UI风格的应用程序。 在WTL中,客户(Non-Client Area)是指窗口边框以及标题栏、菜单栏、状态栏等装饰性的部分。传统上,这部分通常由操作系统负责绘制和管理。但是对于一些特殊需求,比如自定义的窗口样式、矩形窗口等,我们需要对客户进行自主绘制。 客户自绘wtl版本即是基于WTL框架,在需要自定义客户的情况下,通过手动绘制实现。这种方式需要重载WTL框架中的客户绘制相关的函数,比如`OnNcPaint()`、`OnNcCalcSize()`等,来处理客户的绘制逻辑。 客户自绘wtl版本的好处在于可以完全控制客户的外观。可以根据自己的需要,实现各种特殊的样式和效果,如渐变色、图案填充、自定义按钮等。这样可以使应用程序更加美观和独特,增强用户体验。 但是客户自绘wtl版本也存在一些挑战。首先,自绘客户需要较高的绘制技术和图形处理能力。其次,自绘客户还会涉及到一些与系统相关的问题,如窗口移动、窗口关闭等操作的处理。因此,需要对WTL框架有较深入的理解和熟练的编程技巧。 总之,客户自绘wtl版本是在WTL框架基础上,通过自主绘制实现自定义客户的一种方式。它可以让我们灵活控制客户的外观,提升应用程序的美观程度和用户体验。然而,也需要考虑到相关的技术和系统问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值