VC,一条会被鼠标移动的直线

对话框中的小红线可以被移动的
一、类名是 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,一条会被鼠标移动的直线的更多相关文章
- VC++ SetLayeredWindowAttributes 部分窗口透明鼠标穿透
在初始化中使用下面两行代码 ModifyStyleEx(0, WS_EX_LAYERED); ::SetLayeredWindowAttributes(m_hWnd, RGB(1, 255, 0), ...
- Qt+Qgis二次开发:在状态条显示当前鼠标坐标
1 概述 鼠标在地图上移动,需要实时获取当前坐标位置.2 原理 从当前位置获取视口坐标后,实时转换为地图坐标.3 方法 处理鼠标位置,必须获取鼠标的当前坐标.但是Qt的鼠标事件由QgsMapCanv ...
- VC++ 进度条更新方案
在实际开发中,如果有耗时操作,一般会在工作线程处理数据,然后处理完成后把时间传递到UI线程进行显示,切记不要在工作线程对UI进行操作. 场景: 1. 很多程序需要根据处理业务的进度来更新进度条,进度条 ...
- VC++ 进度条的使用
进度条控件封装在CProcessCtrl类中 1.SetRange和SetRange32方法来设置进度条显示范围. 语法格式: void SetRange(short nLower, short nU ...
- VC进度条的使用
m_progress->GetPos(); //获取进度条的当前位置 m_progress->GetRange(int min,int max); //获取进度条控件的范围的下限和上限 m ...
- vc程序设计--对键盘与鼠标的响应(1)
// WindowsProject2.cpp : 定义应用程序的入口点. // /** * 当按下CTRL键时输出信息:CTRL键被压下 * 当按下K键时输出信息:K键被压下 * 当按下CTRL+K键 ...
- C#绘图:带背景,拖鼠标画矩形和直线
基于 Visual Studio 2012 .net framework 4.5 效果截图: 代码: https://download.csdn.net/download/talkwah/104828 ...
- 积累的VC编程小技巧之工具条和状态条
1.工具条和状态条中控件的添加: 方法⑴.只能在ToolBar里创建控件:首先,在ToolBar中创建一个Button,其ID为ID_TOOL_COMBO(我们要将创建的控件放在该Button的位置上 ...
- OpenCV——图像的载入、显示、输出到文件和滑动条、鼠标操作
图像的载入.显示.输出到文件和滑动条 滑动条 示例: 鼠标操作
随机推荐
- [置顶] Java套接字Socket编程
1)概念 网络编程基本模型就客户端到服务器的模型,也就是我们常见的C/S模型.简单的说就是两个进程间相互通信的过程.即通信双方一方作为服务器等待客户端提出请求并给以回应,另一方作为客户端向服务器提出请 ...
- ListView中加入Button后,Button的点击事件和ListView的点击事件冲突
1.在ItemView配置的xml文件里的根节点加入属性android:descendantFocusability="blocksDescendants" 2.在要加入事件的控件 ...
- jz2440烧写开发板uboot,内核和文件系统等的相关命令
下载文件{ftpget -u 1 -p 1 192.168.2.110 a.out a.outnfs 30000000(destination) 192.168.2.109:/home/fs/work ...
- Mockito简介(转)
Mockito 是目前 java 单测中使用比较流行的 mock 工具.其他还有 EasyMock,JMock,MockCreator,Mockrunner,MockMaker 及 PowerMock ...
- mysql备份数据库几种方法
方法一 cmd 到mysql bin文件夹下用 例如以下命令 mysqldump --opt -h192.168.0.156 -uusername -ppassword --skip-lock-tab ...
- Django的url解析
Django中采用正则表达式来匹配所请求的url,这个叫做URLconf,作为MVC中的C(控制器), 这样再调用相应的试图,达到控制器控制试图的显示的效果. 看一下Django的url解析过程 第一 ...
- 业余写的一个播放器SDK,求点意见
好久没写博客了 现大致花了半年时间私下写一个音频SDK,想请csdn的达人提点意见,看看还需要增加哪些功能 我对这个的定位如下: 可以在游戏开发中播放音乐,作为一般的音频播放器后端,作为音频编辑器后端 ...
- Unity UGUI——遮罩效果(Mask)
Show Mask Graphic
- javascript每日一练(五)——BOM
一.BOM打开,关闭窗口 window.open(); window.close(); <!doctype html> <html> <head> <meta ...
- 教师简介 (Alma Del Tango的小站)
教师简介 (Alma Del Tango的小站) Esteban Peng (TT) & Emilia Jia (Amy) TT和Amy是北京极具影响力的专业舞者,他们从07年开始推广阿根廷探 ...