对话框中的小红线可以被移动的

一、类名是 CBinarizationDlg

二、定义两个变量
BOOL m_flag;
int nPos;
在构造函数初始化m_flag = false;nPos=256;
三、响应消息函数三个
afx_msg void OnPaint();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
四、代码加注释

void CBinarizationDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting

CPhotoMeterDoc* pDoc = (CPhotoMeterDoc*) ((CMainFrame*)AfxGetMainWnd())->GetActiveFrame()->GetActiveDocument();

CRect rect;
//GetDlgItem(IDC_STATIC_HISTO)->GetWindowRect(&rect);
//ScreenToClient(&rect);
GetDlgItem(IDC_STATIC_HISTO)->GetClientRect(&rect);
int width = rect.Width();
int height = rect.Height();

// Create a memory CDC
CDC memDC;
memDC.CreateCompatibleDC( &dc );
CBitmap bitmap;
bitmap.CreateCompatibleBitmap( &dc, width, height );
CBitmap* oldbitmap = memDC.SelectObject( &bitmap );

memDC.FillSolidRect( rect, RGB( 255, 255, 255 ) );

CPen axisPen(PS_SOLID,1,RGB(0,0,0));
CPen* pOldPen = dc.SelectObject(&axisPen);
memDC.MoveTo(rect.left+5,rect.bottom-4);
memDC.LineTo(rect.right-5,rect.bottom-4);
memDC.SelectObject(pOldPen);

// The frame
CBrush brh(RGB(0,0,0));
memDC.FrameRect(&rect,&brh);

//histogram
if (pDoc && pDoc->image) {

if (pDoc->m_hmax){
int ybase = rect.bottom-5;
float yratio = (ybase - rect.top)/(float)pDoc->m_hmax;

CPen grayPen(PS_SOLID, 1, RGB(84, 64, 64));
pOldPen = memDC.SelectObject(&grayPen);
//调整的界面刚好使rect.right-rect.left-10是512,即中间横线为512
for (int x=0 ; x<256; x++)
{
memDC.MoveTo(2*x+rect.left+5,ybase);
memDC.LineTo(2*x+rect.left+5, (int)(ybase-pDoc->m_hgray[x]*yratio));
}

memDC.SelectObject(pOldPen);
}else{
pDoc->m_hmax=pDoc->GetImage()->Histogram(pDoc->m_hr,pDoc->m_hg,pDoc->m_hb,pDoc->m_hgray);
if (pDoc->m_hmax) Invalidate();
}
}//end of histogram

CPen redpen(PS_SOLID,0, RGB(222,0,0));
pOldPen = memDC.SelectObject(&redpen);
if ((nPos >= rect.left+5) && (nPos < rect.right-5) )
{
memDC.MoveTo(nPos,rect.bottom-5);
memDC.LineTo(nPos,rect.top+4);
}
memDC.SelectObject(&pOldPen);

dc.BitBlt( 10, 10, width, height, &memDC, 0, 0, SRCCOPY );
memDC.SelectObject( oldbitmap );

}

void CBinarizationDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
CRect rect;
GetDlgItem(IDC_STATIC_HISTO)->GetClientRect(&rect);
  rect.left +=5;
  rect.right -=5;
rect.bottom +=5;

point.Offset(-10,-10);
if (rect.PtInRect(point) && (nPos == point.x))
{
m_flag = TRUE;
nPos = point.x ;
}
CDialog::OnLButtonDown(nFlags, point);
}

void CBinarizationDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
m_flag = FALSE;
Invalidate(FALSE);

CDialog::OnLButtonUp(nFlags, point);
}

void CBinarizationDlg::OnMouseMove(UINT nFlags, CPoint point)
{
//CDC *pDC = this->GetDC();
CRect rect;
GetDlgItem(IDC_STATIC_HISTO)->GetClientRect(&rect);
rect.left +=5;
rect.right -=5;
rect.bottom +=5;

point.Offset(-10,-10);
if (m_flag && rect.PtInRect(point))
{
nPos = point.x;
Invalidate(FALSE);
}
CDialog::OnMouseMove(nFlags, point);
//ReleaseDC(pDC);
}

说明:IDC_STATIC_HISTO是一个picture控件的ID,visible = false,这个只是用来辅助定位的咚咚咚

提问的帖子:http://topic.csdn.net/u/20111001/17/952edd78-cb91-48c8-861f-0eeebf81d75d.html

VC,一条会被鼠标移动的直线的更多相关文章

  1. VC++ SetLayeredWindowAttributes 部分窗口透明鼠标穿透

    在初始化中使用下面两行代码 ModifyStyleEx(0, WS_EX_LAYERED); ::SetLayeredWindowAttributes(m_hWnd, RGB(1, 255, 0), ...

  2. Qt+Qgis二次开发:在状态条显示当前鼠标坐标

    1  概述 鼠标在地图上移动,需要实时获取当前坐标位置.2 原理 从当前位置获取视口坐标后,实时转换为地图坐标.3 方法 处理鼠标位置,必须获取鼠标的当前坐标.但是Qt的鼠标事件由QgsMapCanv ...

  3. VC++ 进度条更新方案

    在实际开发中,如果有耗时操作,一般会在工作线程处理数据,然后处理完成后把时间传递到UI线程进行显示,切记不要在工作线程对UI进行操作. 场景: 1. 很多程序需要根据处理业务的进度来更新进度条,进度条 ...

  4. VC++ 进度条的使用

    进度条控件封装在CProcessCtrl类中 1.SetRange和SetRange32方法来设置进度条显示范围. 语法格式: void SetRange(short nLower, short nU ...

  5. VC进度条的使用

    m_progress->GetPos(); //获取进度条的当前位置 m_progress->GetRange(int min,int max); //获取进度条控件的范围的下限和上限 m ...

  6. vc程序设计--对键盘与鼠标的响应(1)

    // WindowsProject2.cpp : 定义应用程序的入口点. // /** * 当按下CTRL键时输出信息:CTRL键被压下 * 当按下K键时输出信息:K键被压下 * 当按下CTRL+K键 ...

  7. C#绘图:带背景,拖鼠标画矩形和直线

    基于 Visual Studio 2012 .net framework 4.5 效果截图: 代码: https://download.csdn.net/download/talkwah/104828 ...

  8. 积累的VC编程小技巧之工具条和状态条

    1.工具条和状态条中控件的添加: 方法⑴.只能在ToolBar里创建控件:首先,在ToolBar中创建一个Button,其ID为ID_TOOL_COMBO(我们要将创建的控件放在该Button的位置上 ...

  9. OpenCV——图像的载入、显示、输出到文件和滑动条、鼠标操作

    图像的载入.显示.输出到文件和滑动条 滑动条 示例: 鼠标操作

随机推荐

  1. cocos2dx进阶学习之CCEGLView

    继承关系 CCEGLView-> CCEGLViewProtocol CCEGLView是窗口,在不同平台上有不同的实现,而CCEGLViewProtocol是CCEGLView定义的接口,所以 ...

  2. Shell脚本编程具体解释

    第12章 Shell脚本编程   l  Shell命令行的执行 l  编写.改动权限和运行Shell程序的步骤 l  在Shell程序中使用參数和变量 l  表达式比較.循环结构语句和条件结构语句 l ...

  3. Linux 下IOport编程訪问

    曾经写的一篇笔记.偶尔翻出来了,放在这里做个纪念 Linux 下IOport编程訪问 这里记录的方法是在用户态訪问IOport,不涉及驱动程序的编写. 首先要包括头文件 /usr/include/as ...

  4. Ubuntu 12.04 安装JDK 8和Eclipse

    Ubuntu 12.04 下安装 JDK8 方法一:(缺点是安装时附加openjdk等大量程序并无法去除,长处是安装简单) $ sudo apt-get install eclipse 方法二:(长处 ...

  5. 【BZOJ1132】【POI2008】Tro 计算几何 叉积求面积

    链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...

  6. C# 窗体在线2,8,16进制转换以及,在线更新时间

    class Program { static void Main(string[] args) { //十进制转二进制 Console.WriteLine(, )); //十进制转八进制 Consol ...

  7. 隐式意图-activity

    Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW);//设置动作 intent.setData(Uri.parse(& ...

  8. SICP中sqrt(开方)的实现(附C#实现)

    #lang racket (define (square x) (* x x)) (define (sqrt-iter guess x) (if (good-enough? guess x) gues ...

  9. TimeUnit

    转http://blog.csdn.net/hudashi/article/details/6936604 public enum TimeUnitextends Enum<TimeUnit&g ...

  10. mysql 结合keepalived测试

    vip:192.168.32.66 192.168.32.6 主库: mysql> show variables like '%read_only%'; +------------------+ ...