MFC在鼠标自定义的一定的范围内实现拖动窗口移动、错误:不支持尝试执行的操作、实现进度条颜色的渐变或者背景和前景色的改变

模拟自己设计的窗口上面的客户部分鼠标点击可以实现移动

这部分是MFC的对话框中Border选中None

将对话框的上面一部分设定为客户区,采用下面代码模拟客户区

首先在对话框的类向导中添加事件:MouseMove()、activite()、LButtonDown()、LButtonUp()

在头文件中添加

//添加了两个成员变量,一个用来标记移动状态,一个用来记录鼠标按下时的坐标
	CPoint m_point;
	BOOL m_bIsMoving;


void CDfuCtrlServiceToolDlg::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	if (m_bIsMoving)
	{
		//偏移量
		//int dx = point.x - m_point.x;
		//int dy = point.y - m_point.y;

		////如果窗口闪烁,可以使dx,dy大于1再移动
		////if(abs(dx)>2||abs(dy)>2)....
		//CRect rect = { 0 };
		//GetWindowRect(&rect);
		//OffsetRect(&rect, dx, dy);//整个窗口偏移dx,dy
		//MoveWindow(&rect);//移动窗口
	if (m_point.x<700&& m_point.x>0&& m_point.y>0&& m_point.y<45)//这部分指定了鼠标所点击的位置后发生移动,如果不需要,只采用上面的即可。
	{
		int dx = point.x - m_point.x;
		int dy = point.y - m_point.y;

		//如果窗口闪烁,可以使dx,dy大于1再移动
		//if(abs(dx)>2||abs(dy)>2)....
		CRect rect = { 0 };
		GetWindowRect(&rect);
		OffsetRect(&rect, dx, dy);//整个窗口偏移dx,dy
		MoveWindow(&rect);//移动窗口
	}
	else
	{
		
	}

	}

	CDialogEx::OnMouseMove(nFlags, point);
}


void CDfuCtrlServiceToolDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
	CDialogEx::OnActivate(nState, pWndOther, bMinimized);

	if (nState == WA_INACTIVE && m_bIsMoving)
	{
		m_bIsMoving = FALSE;
		ReleaseCapture();
	}

	// TODO: 在此处添加消息处理程序代码
}


void CDfuCtrlServiceToolDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	m_bIsMoving = TRUE;
	SetCapture();//捕获鼠标消息,就算鼠标超过窗口也可以捕获到
	m_point = point;//记录按下时的坐标
	CDialogEx::OnLButtonDown(nFlags, point);
}


还有一个

void CDfuCtrlServiceToolDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	if (m_bIsMoving)
	{
		m_bIsMoving = FALSE;
		ReleaseCapture();
	}
	CDialogEx::OnLButtonUp(nFlags, point);
}

1、MFC中出现不执行尝试的操作

这个问题是我添加了两个控件,后来不需要直接删除掉,但是并没有将其变量在代码中挨个删除;所以需要将其对应的代码一一删除干净;

2、改变进度条的颜色http://www.codefans.net/articles/1454.shtml

3、使用方法

1.将三个文件添加到工程
2.在对话框上添加一个进度条;
新建一个类CGradientProgressCtrl,其基类为CProgressCtrl
3.为进度条添加变量,变量类型CGradientProgressCtrl
4.
应用:
m_process1.SetRange(0, 100);
m_process1.ShowPercent(TRUE);
m_process1.SetStartColor(RGB(0, 0, 255));
m_process1.SetEndColor(RGB(255, 255, 0));
m_process1.SetTextColor(RGB(0, 0, 255));
m_process1.SetBkColor(RGB(125, 125, 125));
m_process1.SetPos(50);//设置百分比

4、其中GradientProgressCtrl.h

#if !defined(AFX_ENHPROGRESSCTRL_H__12909D73_C393_11D1_9FAE_8192554015AD__INCLUDED_)
#define AFX_ENHPROGRESSCTRL_H__12909D73_C393_11D1_9FAE_8192554015AD__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
// EnhProgressCtrl.h : header file

// GradientProgressCtrl.h : header file

#include "MemDC.h"

/////////////////////////////////////////////////////////////////////////////
// CGradientProgressCtrl window

class CGradientProgressCtrl : public CProgressCtrl
{
// Construction
public:
	CGradientProgressCtrl();

// Attributes
public:
// Attributes
	
	void SetRange(int nLower, int nUpper);
	void SetRange32( int nLower, int nUpper );
	int SetPos(int n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚努力的程序猿

0.01是对我的肯定

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值