文档章节

可移动窗口

N3verL4nd
 N3verL4nd
发布于 2017/03/25 10:20
字数 603
阅读 1
收藏 0

基于VS2013+WTL9.1实现

// MoveableWindowView.h : interface of the CMoveableWindowView class
//
/////////////////////////////////////////////////////////////////////////////

#pragma once
#include "MyWindow.h"
#include <GdiPlus.h>
using namespace Gdiplus;

class CMoveableWindowView : public CWindowImpl<CMoveableWindowView>, 
	public CDoubleBufferImpl<CMoveableWindowView>
{
public:
	DECLARE_WND_CLASS(NULL)

	CMoveableWindowView();
	~CMoveableWindowView();

	BOOL PreTranslateMessage(MSG* pMsg);

	BEGIN_MSG_MAP(CMoveableWindowView)
		//MESSAGE_HANDLER(WM_PAINT, OnPaint)
		CHAIN_MSG_MAP(CDoubleBufferImpl<CMoveableWindowView>)
		MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)
		MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)
		MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
		MESSAGE_HANDLER(WM_SETCURSOR, OnCurosr)
	END_MSG_MAP()

//  Handler prototypes (uncomment arguments if needed):
//	LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
//	LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
//	LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)

	//LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
	LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnCurosr(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	void DoPaint(CDCHandle dc);			//解决绘图频闪
	void setColor(int pen, int panel);	
private:
	GdiplusStartupInput gGdiInput;		//gdi+
	ULONG token;						//gdi+
	CMyWindow myWindow;					//自定义窗口类
	Point pushedPos;					//记录鼠标的上一个按下位置
	Point curPos;						//鼠标当前位置
	bool flag;							//标记鼠标左键是否按下
	Color penColor;						//画笔颜色
	Color panelColor;					//画刷颜色
};
// MoveableWindowView.cpp : implementation of the CMoveableWindowView class
//
/////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "resource.h"
#include "MoveableWindowView.h"
#include <atlstr.h>
#include <atltypes.h>
#pragma comment(lib, "GdiPlus.lib")

CMoveableWindowView::CMoveableWindowView() : myWindow(1, 60, 100, 100, 400, 400)
{
	token = 0;
	flag = false;
	pushedPos.X = 0;
	pushedPos.Y = 0;
	curPos.X = 0;
	curPos.Y = 0;
	GdiplusStartup(&token, &gGdiInput, NULL);
}

BOOL CMoveableWindowView::PreTranslateMessage(MSG* pMsg)
{
	pMsg;
	return FALSE;
}

void CMoveableWindowView::DoPaint(CDCHandle dc)
{

	CRect rectClient;
	GetClientRect(&rectClient);
	//设置窗口背景色为白色
	dc.FillSolidRect(rectClient, RGB(255, 255, 255));

	Graphics g(dc.m_hDC);
	Pen pen(Color(255, 0, 0, 255), 2.0f);
	Rect rectDraw(myWindow.getLeft(), myWindow.getTop(), myWindow.getWidth(), myWindow.getHeight());
	g.DrawRectangle(&pen, rectDraw);
	g.DrawLine(&pen, myWindow.getLeft(), myWindow.getTop() + myWindow.getTHeight(), myWindow.getLeft() + myWindow.getWidth(), myWindow.getTop() + myWindow.getTHeight());
}

LRESULT CMoveableWindowView::OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
	/**
	*  鼠标左击测试
	CString str;
	str.Format(TEXT("%d:%d"), GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
	MessageBox(str, TEXT("点击测试"));
	*/

	flag = true;
	pushedPos.X = GET_X_LPARAM(lParam);
	pushedPos.Y = GET_Y_LPARAM(lParam);
	myWindow.onPress(pushedPos.X, pushedPos.Y);
	return TRUE;
}

LRESULT CMoveableWindowView::OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
	curPos.X = GET_X_LPARAM(lParam);
	curPos.Y = GET_Y_LPARAM(lParam);
	
	//鼠标左键已按下
	if (wParam & MK_LBUTTON)
	{
		RECT rect;
		rect.left = myWindow.getLeft();
		rect.top = myWindow.getTop();
		rect.right = myWindow.getLeft() + myWindow.getWidth();
		rect.bottom = myWindow.getTop() + myWindow.getHeight();
		myWindow.onMove(curPos.X - pushedPos.X, curPos.Y - pushedPos.Y);
		
		//闪瞎狗眼
		InvalidateRect(NULL, true);

		pushedPos.X = curPos.X;
		pushedPos.Y = curPos.Y;
	}
	return TRUE;
}

LRESULT CMoveableWindowView::OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{

	flag = false;
	curPos.X = GET_X_LPARAM(lParam);
	curPos.Y = GET_Y_LPARAM(lParam);
	pushedPos.X = 0;
	pushedPos.Y = 0;
	myWindow.onRelease(curPos.X, curPos.Y);
	SetCursor(LoadCursor(NULL, IDC_ARROW));
	return TRUE;
}

LRESULT CMoveableWindowView::OnCurosr(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
	//鼠标左键按下则不再去更改鼠标外形
	if (flag)
	{
		return FALSE;
	}
	int flag = myWindow.checkPos(curPos.X, curPos.Y);
	switch (flag)
	{
	case CMyWindow::OTHER:
		SetCursor(LoadCursor(NULL, IDC_ARROW));
		break;
	case CMyWindow::TITLE:
		SetCursor(LoadCursor(NULL, IDC_HAND));
		break;
	case CMyWindow::TOP:
	case CMyWindow::BOTTOM:
		SetCursor(LoadCursor(NULL, IDC_SIZENS));
		break;
	case CMyWindow::LEFT:
	case CMyWindow::RIGHT:
		SetCursor(LoadCursor(NULL, IDC_SIZEWE));
		break;
	}
	return TRUE;
}

CMoveableWindowView::~CMoveableWindowView()
{
	GdiplusShutdown(token);
}

相比于MFC,WTL还是很清晰的,至少可以知道自己在做什么。

虽然得自己手写消息映射=。=

完整代码:

http://img.ask.csdn.net/upload/201610/16/1476620294_424880.png

改为RAR即可打开


© 著作权归作者所有

N3verL4nd
粉丝 1
博文 379
码字总数 481243
作品 0
朝阳
私信 提问
我的电脑出现多个可移动磁盘该怎么删除?

我的电脑出现很多个可移动磁盘如何解决?单位有台联想台式电脑在不插任何U盘、MP4和手机的情况下,在我的电脑中出现很多个可移动磁盘,双击又打不开。插上个U盘什么的,很难分辨到底是哪一个...

野小疯
02/11
19
0
VIM多窗口功能

:sp [filename] 开启一个新窗口,如果有加filename,表示在新窗口卡其一个新文件,否则表示两个窗口的文件为一个文件内容 [ctrl] + w +j 按键的按发是:先按下[ctrl]不放,在按下w后放开所有...

蜗牛奔跑
2016/09/21
7
0
使用UltraISO制作U盘启动盘

1、鼠标右键“以管理员身份运行”UltraISO图标 2、打开UltraISO的窗口后依次点击左上角的“文件”-“打开” 3、浏览到存放镜像文件的目录,选中该目标文件,点击“打开”按钮 4、然后再次回到...

北海vs
2016/03/31
15
0
Windows使用UltraISO制作U盘启动盘

1.。鼠标右键“以管理员身份运行”UltraISO 2.。打开UltraISO的窗口后依次点击左上角的“文件”-“打开”,打开准备的ISO文件。 3.。然后再次回到UltraISO窗口,点击菜单栏中的“启动”选“写...

krircc
2014/11/23
79
0
Android仿酷狗桌面悬浮歌词效果

引言 该悬浮歌词功能是乐乐音乐中的一个模块,主要是APP在后台运行时,在手机的桌面上出现一个歌词窗口,方便用户可以随时随地地查看歌词及操作APP,除了通知栏外,多提供了一个操作APP界面,...

只有一条尾巴的猫
2018/05/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
12分钟前
3
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
今天
8
0
详解箭头函数和普通函数的区别以及箭头函数的注意事项、不适用场景

箭头函数是ES6的API,相信很多人都知道,因为其语法上相对于普通函数更简洁,深受大家的喜爱。就是这种我们日常开发中一直在使用的API,大部分同学却对它的了解程度还是不够深... 普通函数和...

OBKoro1
今天
4
0
轻量级 HTTP(s) 代理 TinyProxy

CentOS 下安装 TinyProxy yum install -y tinyproxy 启动、停止、重启 # 启动service tinyproxy start# 停止service tinyproxy stop# 重启service tinyproxy restart 相关配置 默认...

Anoyi
今天
0
0
Linux创建yum仓库

第一步、搞定自己的光盘 #创建文件夹 mkdir -p /media/cdrom #挂载光盘 mount /dev/cdrom /media/cdrom #编辑配置文件使其永久生效 vim /etc/fstab 第二步,编辑yun源 vim /ect yum.repos.d...

究极小怪兽zzz
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部