VC++深入详解 (chapter 5)

本文介绍如何在MFC应用程序中输出字符串并进行基本绘图操作,包括文本显示、字符串长度获取、背景颜色设置、插入符创建及定时器滑动显示效果。
 

#include "stdafx.h"
#include "chapter5.h"

#include "chapter5Doc.h"
#include "chapter5View.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CChapter5View

IMPLEMENT_DYNCREATE(CChapter5View, CView)

BEGIN_MESSAGE_MAP(CChapter5View, CView)
 //{{AFX_MSG_MAP(CChapter5View)
 ON_WM_CREATE()
 ON_WM_CHAR()
 ON_WM_LBUTTONDOWN()
 ON_WM_TIMER()
 //}}AFX_MSG_MAP
 // Standard printing commands
 ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
 ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
 ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CChapter5View construction/destruction

CChapter5View::CChapter5View()
{
 // TODO: add construction code here
 m_strLine = "";
 m_ptOrigin = 0;
 m_nWidth  = 0;

}

CChapter5View::~CChapter5View()
{
}

BOOL CChapter5View::PreCreateWindow(CREATESTRUCT& cs)
{
 // TODO: Modify the Window class or styles here by modifying
 //  the CREATESTRUCT cs

 return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CChapter5View drawing

//  实现字符串的输出

void CChapter5View::OnDraw(CDC* pDC)
{
 CChapter5Doc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 // TODO: add draw code for native data here
 //当这个函数被调用时,应用框架会构造一个CDC类对象指针并传递给这个函数,这给我们
 //提供了方便,在这个函数内部就不需要再去调用CDC类的对象,可以直接使用传递过来的
 //CDC对象指针去调用CDC类的成员函数,完成绘制的功能
 // 1 创建一个字符串
 CString str("MFC");
 // 2 显示一个字符串
 pDC->TextOut(50,100,str);
    // 3 得到一个字符串的信息
 // GetTextMetrics函数得到的是社别描述表中当前字体的度量信息
 // GetTextExtent函数得到的是某个特定字符串在窗口中显示时所占据的宽度和高度
 CSize sz = pDC->GetTextExtent(str);
    // 从string table中加载字符串
 str.LoadString(IDS_STRING61446);
 pDC->TextOut(50,150,str);
    // 创建路径层是利用CDC类提供的BeginPath和EndPath这两个函数实现的
 //首先利用前者在设备描述表中打开一个路径层,然后完成设备接口提供的绘图函数进行绘图操作
 // 最后在绘图操作完成之后,应用程序通过调用EndPath函数关闭这个路径层
 pDC->BeginPath();

 pDC->Rectangle(50,100,50+sz.cx,100+sz.cy);

 pDC->EndPath();

    //该函数的作用是把当前设置的路径层和设备描述表已有的裁剪区域按照
 //一种指定的模式进行一个操作
 pDC->SelectClipPath(RGN_DIFF);

 for (int i = 0;i <= 300; i+=10)
 {
  pDC->MoveTo(0,i);
  pDC->LineTo(300,i);
        //画横线
  pDC->MoveTo(i,0);
  pDC->LineTo(i,300);
  // 画竖线
 }


}

/////////////////////////////////////////////////////////////////////////////
// CChapter5View printing

BOOL CChapter5View::OnPreparePrinting(CPrintInfo* pInfo)
{
 // default preparation
 return DoPreparePrinting(pInfo);
}

void CChapter5View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
 // TODO: add extra initialization before printing
}

void CChapter5View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
 // TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CChapter5View diagnostics

#ifdef _DEBUG
void CChapter5View::AssertValid() const
{
 CView::AssertValid();
}

void CChapter5View::Dump(CDumpContext& dc) const
{
 CView::Dump(dc);
}

CChapter5Doc* CChapter5View::GetDocument() // non-debug version is inline
{
 ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CChapter5Doc)));
 return (CChapter5Doc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CChapter5View message handlers

int CChapter5View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CView::OnCreate(lpCreateStruct) == -1)
  return -1;
 
 // TODO: Add your specialized creation code here
 /*
 // 创建一个插入符
 // 1 创建一个设备描述表
 CClientDC dc(this);
 // 2 定义一个文本信息结构体变量
 TEXTMETRIC tm;
 // 3 获得设备描述表中的文本信息
 dc.GetTextMetrics(&tm);
 // 4 根据字体的大小,创建合适的插入符
 CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
 // 5 显示插入符
 ShowCaret();
 */
 // 创建一个位图插入符
 // 1 创建一个位图资源,注意其中可以用全局变量和静态成员变量
 //了解静态成员变量的含义以及在此处用到的含义
 static CBitmap m_bitmap;
    // 2 下载位图资源
 m_bitmap.LoadBitmap(IDB_BITMAP1);
    //创建位图插入符
 CreateCaret(&m_bitmap);
    //显示插入符
 ShowCaret();

 SetTimer(1,100,NULL);
 
 
 return 0;
}

void CChapter5View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
 // TODO: Add your message handler code here and/or call default

 

 CClientDC dc(this);

 CFont font;
//设置相关的字体信息
 font.CreatePointFont(300,"华文行楷",NULL);

 CFont* pOldFont = dc.SelectObject(&font);

 TEXTMETRIC tm;

 dc.GetTextMetrics(&tm);

 if(0x0d == nChar)
 {
     m_strLine.Empty();
  m_ptOrigin.y += tm.tmHeight;
 }
 else if (0x08 == nChar)
 {
  COLORREF clr = dc.SetTextColor(dc.GetBkColor());
  //获得背景颜色,并且设置文本的颜色
  dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
  //GetLength函数可以得到字符串中字符的个数
  //Left(int nCount)函数实现返回字符串左边指定数目的字符
  m_strLine = m_strLine.Left(m_strLine.GetLength()-1);
  dc.SetTextColor(clr);
 }
 else
 {
  m_strLine += nChar;
 }
 dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);

 CSize sz = dc.GetTextExtent(m_strLine);

 CPoint pt;

 pt.x = m_ptOrigin.x + sz.cx + tm.tmAveCharWidth;
 pt.y = m_ptOrigin.y;

 SetCaretPos(pt);

 dc.SelectObject(pOldFont);
 
 CView::OnChar(nChar, nRepCnt, nFlags);
}

void CChapter5View::OnLButtonDown(UINT nFlags, CPoint point)
{
 // TODO: Add your message handler code here and/or call default
 SetCaretPos(point);
    //清空字符串
 m_strLine.Empty();

 m_ptOrigin = point;
 
 CView::OnLButtonDown(nFlags, point);
}
//滑动显示
void CChapter5View::OnTimer(UINT nIDEvent)
{
 // TODO: Add your message handler code here and/or call default
   
    m_nWidth +=5;
 
 CClientDC dc(this);

 TEXTMETRIC tm;

 dc.GetTextMetrics(&tm);

 CRect rect;

 rect.left = 0;

 rect.top = 200;

 rect.right = m_nWidth;

 rect.bottom = rect.top + tm.tmHeight;

 dc.SetTextColor(RGB(255,0,0));

 CString str;

 str.LoadString(IDS_STRING61447);

 dc.DrawText(str,rect,DT_LEFT);

 CSize sz = dc.GetTextExtent(str);

 if(m_nWidth>sz.cx)
 {
  m_nWidth = 0;
  dc.SetTextColor(RGB(0,255,0));
  dc.TextOut(0,200,str);
 }

 
 CView::OnTimer(nIDEvent);
}

(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值