,打开“资源视 图”,添加ID为IDD_HISTOGRAM的对话框资源并按照图9-5完成设计。
然后为其创建对话框类CHistogramDlg并按照表9-1关联对 应变量。
图9-5 灰度直方图对话框的设计 表9-1 灰度直方图对话框资源与变量的关系 1 图片控件 IDC_HISTOGRAM CStatic m_stiHistogram 2 文本框 IDC_LIMIT_LOWER int m_nLimitLow 3 文本框 IDC_LIMIT_UP int m_nLimitUp 4 静态文本 IDC_STATIC_GRAY int M_nGray 5 静态文本 IDC_STATIC_PER float M_dPer 下面结合灰度直方图的基本原理一步一步剖析对话框 的实现过程。
1)各级灰度数量的统计 统计数据是绘制灰度直方图的依据。
该对话框在初始 化时,也就是在OnInitDialog函数中完成统计工作。
正如前面介绍的一样,MagicHouse将图像保存在一个线性数组中,图像的每个像素都统 一采用32位形式存储,故8位灰度图的一个像素也会占用32位。
为方便统计,对话框默认当前处理图像为灰度图,即RGB,故每次只需要统计其中一种颜 色的数量。
2)灰度直方图重绘过程 绘制工作主要由Refresh函数完成,它完成了 以下功能。
l 双缓存的创建 以双缓存模式绘制直方图,防止闪烁。
l 绘制直方图的坐标系和刻度 l 查找所有灰度中最多的出现次数 该次数会显示在Y轴的旁边,拥有该 次数灰度值的直方图最高。
l 以相对高度绘制直方图 其余灰度值的高度由其出现次数与最大出现次数的比 值决定。
l 利用鼠标操作改变显示灰度的上下限 灰度上下限在对话框中以两条蓝色的虚线表示,用户 可以通过鼠标操作改变两条虚线的位置来改变显示灰度的上下限。
用户在单击鼠标左键时程序会根据当前鼠标的位置, 判断鼠标是否在上下限虚线的范围内。
如果在上限虚线的范围中,则将m_nIsDraging变量赋值为DT_UP,如果在下限虚线的范围中,则赋值为 DT_LOW,否则赋值为DT_NULL。
用户在移动鼠标时如果m_nIsDraging不 为DT_NULL,则表示用户此时正在拖动上限或者下限的虚线,此时就需要更改上下限的值,并将其限定在合法的取值范围中。
下面列出HistogramDlg.h的代码清 单: pragma once include afxwin.h // CHistogramDlg 对话框 class CHistogramDlg : public CDialog DECLARE_MESSAGE_MAP DECLARE_DYNAMICCHistogramDlg public: CStatic m_stiHistogram // 直方图显示区域 int m_nLimitLow // 显示灰度的下限 int m_nLimitUp // 显示灰度的上限 long m_lCounts256 // 各级灰度出现的个数 long m_nPixelCount // 图像像素总数 CPoint m_psMove // 记录拖动时的鼠标位置 int m_nIsDraging // 鼠标是否正在拖动 int m_nGray // 当前鼠标位置的灰度级数 float m_dPer // 出现概率 CHistogramDlgCWnd pParent NULL // 标准构造函数 virtual CHistogramDlg afx_msg void OnEnChangeLimitLower // 灰度下限改变的响应函数 afx_msg void OnEnChangeLimitUp // 灰度上限改变的响应函数 afx_msg void OnPaint // 绘制对话框 virtual BOOL OnInitDialog // 对话框初始化时计算各级灰度数量 afx_msg void OnMouseMoveUINT nFlags CPoint point // 鼠标移动时响应拖动动作 afx_msg BOOL OnSetCursorCWnd pWnd UINT nHitTest UINT message // 拖动时改变鼠标光标 afx_msg void OnLButtonDownUINT nFlags CPoint point // 鼠标按下时判断是否在灰度上下限直线范围中 afx_msg void OnLButtonUpUINT nFlags CPoint point // 释放鼠标的响应函数 // 对话框数据 enum IDD IDD_HISTOGRAM protected: virtual void DoDataExchangeCDataExchange pDX // DDX/DDV 支持 private: void Refreshvoid // 刷新直方图 // 拖动枚举 enum DragingType DT_NULL // 无拖动 DT_LOW // 拖动下限 DT_UP // 拖动上限 下面列出HistogramDlg.h的核心代码清单: // HistogramDlg.cpp : 实现文件 include stdafx.h include MagicHouse.h include HistogramDlg.h include Mainfrm.h include MagicHouseDoc.h include MagicHouseView.h // CHistogramDlg 消息处理程序 / 作用: 对话框初始化时计算各级灰度数量 / BOOL CHistogramDlg::OnInitDialog CDialog::OnInitDialog CMainFrame pMain CMainFrameAfxGetMainWnd CMagicHouseView pView CMagicHouseViewpMain-GetActiveView for UINT i 0 i pView-m_nPicWidth pView-m_nPicHeight i int value pView-m_pImageTempBufferi 4 m_lCountsvalue // 计算像素总个数 m_nPixelCount pView-m_nPicWidth pView-m_nPicHeight return TRUE // return TRUE unless you set the focus to a control // 异常:OCX 属性页应返回 FALSE / 作用: 刷新直方图 备注: 双缓存绘制方法 / void CHistogramDlg::Refresh CDC pDC m_stiHistogram.GetDC CRect rect CDC memDC CBitmap MemBitmap // 获取绘图区域 m_stiHistogram.GetClientRectrect // 设备描述表初始化 memDC.CreateCompatibleDCNULL // 建立与屏幕显示兼容的内存显示设备 MemBitmap.CreateCompatibleBitmappDC rect.Width rect.Height // 选取空白位图 memDC.SelectObjectMemBitmap memDC.FillSolidRect0 0 rect.Width rect.Height RGB255255255 Graphics graphmemDC.GetSafeHdc // 使用白色背景 graph.FillRectanglesSolidBrushColor::White Rect0 0 rect.Width rect.Height 1 // 绘制y轴 graph.DrawLinePenColor::Black 10 10 10 280 graph.DrawLinePenColor::Black 10 10 5 15 graph.DrawLinePenColor::Black 10 10 15 15 // 绘制x轴 graph.DrawLinePenColor::Black 10 280 290 280 graph.DrawLinePenColor::Black 290 280 285 285 graph.DrawLinePenColor::Black 290 280 285 275 // 绘制坐标原点 CString strNum Font fontL宋体 10 strNum L0 graph.DrawStringstrNum -1 font PointF8 290 SolidBrushColor::Black for int i 0 i 256 i 5 if i 50 0 graph.DrawLinePenColor::Black 10 i 280 10 i 286 else if i 10 0 graph.DrawLinePenColor::Black 10 i 280 10 i 283 // 绘制x轴刻度 strNum L50 graph.DrawStringstrNum -1 font PointF53 290 SolidBrushColor::Black strNum L100 graph.DrawStringstrNum -1 font PointF100 290 SolidBrushColor::Black strNum L150 graph.DrawStringstrNum -1 font PointF150 290 SolidBrushColor::Black strNum L200 graph.DrawStringstrNum -1 font PointF200 290 SolidBrushColor::Black strNum L255 graph.DrawStringstrNum -1 font PointF255 290 SolidBrushColor::Black // 绘制当前灰度区域 Pen penColor::Blue pen.SetDashStyleDashStyleDash graph.DrawLinepen 10 m_nLimitLow 280 10 m_nLimitLow 10 graph.DrawLinepen 10 m_nLimitUp 280 10 m_nLimitUp 10 long lMax 0 REAL dHeight 0.0 // 查找最大值 for int i m_nLimitLow i 0 if offset m_nLimitLow 3 absx - m_nLimitLow 3 m_nIsDraging DT_NULL // 如果鼠标在直方图区域中 if rect.PtInRectpoint if x m_nLimitLow x
上一篇:
vc 端口映射源代码
下一篇:
某八层框架宾馆、旅馆毕业设计参考资料