首页 > REDM基础教程 > REDM基础教程9-消息分发练习1
2016十月31

REDM基础教程9-消息分发练习1

前面我们练习了主窗口消息分发,DUI子控件消息分发,DUI事件消息分发,这节我们来做点练习,

1.把我们前面重新编译好的MyRes资源包的关闭和最小化消息响应一下

2.把主窗口变成圆角矩形

原始的MyTest工程下载:

MyTest.zip

已被前面设计器改变的MyRes包下载:

MyRes.zip

    

修改后的MyTest工程下载:

MyTest.zip

编译后,把新的MyRes包替换原始的MyRes包,放在生成目录下,效果如下:

20.gif

可以看到,这时点击按钮是没有响应的

  

由REDM设计器教程9-复制,粘贴控件 这一节,我们知道close按扭的名字为closebtn,mini按钮的名字为minibtn,如果没有,请参考使用设计器添加一下

  

MainWnd.h:

1.把原始的事件代码删除掉吧,增加消息,事件分发宏定义

	DECLARE_MESSAGE_MAP()						// 仿MFC消息映射宏,也可以使用BEGIN_MSG_MAPT宏使消息处理在头文件
	DECLARE_EVENT_MAP()							// 事件分发映射宏,也可以使用BEGIN_EVENT_MAPT宏使事件处理在头文件

  

2.增加事件分发函数,分别用于关闭和最小化按钮事件

DMCode OnClose();
DMCode OnMinimize();

 

3.增加初始化窗口消息WM_INITDIALOG+WM_SIZE,其中WM_INITDIALOG消息是由Test.cpp中触发的

pMainWnd->SendMessage(WM_INITDIALOG);

MainWnd.h全部代码如下:(点击小三角展开代码)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once  
 
class CMainWnd : public DMHWnd
{
public:
	DECLARE_MESSAGE_MAP()						// 仿MFC消息映射宏,也可以使用BEGIN_MSG_MAPT宏使消息处理在头文件
	DECLARE_EVENT_MAP()							// 事件分发映射宏,也可以使用BEGIN_EVENT_MAPT宏使事件处理在头文件
 
	//---------------------------------------------------
	// Function Des: 消息分发系列函数
	//---------------------------------------------------
	BOOL OnInitDialog(HWND wndFocus, LPARAM lInitParam);
	void OnSize(UINT nType, CSize size);
 
	//---------------------------------------------------
	// Function Des: 事件分发系列函数
	//---------------------------------------------------
	DMCode OnClose();
	DMCode OnMinimize();
};

   

MainWnd.cpp:

1.增加主窗口消息宏

BEGIN_MSG_MAP(CMainWnd)
	MSG_WM_INITDIALOG(OnInitDialog)
	MSG_WM_SIZE(OnSize)
	CHAIN_MSG_MAP(DMHWnd)// 将未处理的消息交由DMHWnd处理
END_MSG_MAP()

 

2.增加DUI子控件消息事件宏

BEGIN_EVENT_MAP(CMainWnd)
	EVENT_NAME_COMMAND(L"closebtn",OnClose)// closebtn为关闭按钮的名称
	EVENT_NAME_COMMAND(L"minibtn", OnMinimize)// minibtn为最小化按钮的名字
END_EVENT_MAP()

  

3.我们让主窗口变成圆角矩形

BOOL CMainWnd::OnInitDialog(HWND wndFocus, LPARAM lInitParam)
{
	// todo
	return TRUE;
}

void CMainWnd::OnSize(UINT nType, CSize size)
{
	// 生成圆角矩形
	if (!IsIconic()) 
	{ 
		CRect rcWnd;
		::GetWindowRect(m_hWnd, &rcWnd);
		::OffsetRect(&rcWnd, -rcWnd.left, -rcWnd.top);  
		HRGN hWndRgn = ::CreateRoundRectRgn(0, 0, rcWnd.right, rcWnd.bottom,4,4);
		SetWindowRgn(hWndRgn, TRUE);
		::DeleteObject(hWndRgn); 
	}             
	SetMsgHandled(FALSE);  // 由DMHWnd继续处理OnSize消息
}

 

4.处理子控件消息事件

DMCode CMainWnd::OnClose()
{
	DestroyWindow(); // 所有关闭窗口统一使用DestroyWindow,不要使用PostMessage(WM_QUIT)
	return DM_ECODE_OK;
}

DMCode CMainWnd::OnMinimize()
{
	SendMessage(WM_SYSCOMMAND,SC_MINIMIZE);
	return DM_ECODE_OK;
}

MainWnd.cpp全部代码如下:(点击小三角展开代码)

#include "StdAfx.h"
#include "MainWnd.h"

BEGIN_MSG_MAP(CMainWnd)
	MSG_WM_INITDIALOG(OnInitDialog)
	MSG_WM_SIZE(OnSize)
	CHAIN_MSG_MAP(DMHWnd)// 将未处理的消息交由DMHWnd处理
END_MSG_MAP()
BEGIN_EVENT_MAP(CMainWnd)
	EVENT_NAME_COMMAND(L"closebtn",OnClose)
	EVENT_NAME_COMMAND(L"minibtn", OnMinimize)
END_EVENT_MAP()

BOOL CMainWnd::OnInitDialog(HWND wndFocus, LPARAM lInitParam)
{
	// todo
	return TRUE;
}

void CMainWnd::OnSize(UINT nType, CSize size)
{
	// 生成圆角矩形
	if (!IsIconic()) 
	{ 
		CRect rcWnd;
		::GetWindowRect(m_hWnd, &rcWnd);
		::OffsetRect(&rcWnd, -rcWnd.left, -rcWnd.top);  
		HRGN hWndRgn = ::CreateRoundRectRgn(0, 0, rcWnd.right, rcWnd.bottom,4,4);
		SetWindowRgn(hWndRgn, TRUE);
		::DeleteObject(hWndRgn); 
	}             
	SetMsgHandled(FALSE);  // 由DMHWnd继续处理OnSize消息
}

DMCode CMainWnd::OnClose()
{
	DestroyWindow(); // 所有关闭窗口统一使用DestroyWindow,不要使用PostMessage(WM_QUIT)
	return DM_ECODE_OK;
}

DMCode CMainWnd::OnMinimize()
{
	SendMessage(WM_SYSCOMMAND,SC_MINIMIZE);
	return DM_ECODE_OK;
}

  

效果如下:

21.gif

     下一节教程:REDM设计器教程10-控件练习1

文章作者:hgy413
本文地址:https://hgy413.com/3651.html
版权所有 © 转载时必须以链接形式注明作者和原始出处!

5 Responses to “REDM基础教程9-消息分发练习1”

  1. #1 ylsoft 回复 | 引用 Post:2016-11-09 17:07

    楼主大大您好,我们准备在公司的项目中使用您的UI,现在就是有一个问题,我们看到UI里面没有托盘事件,是不是暂时没有这个功能?因为这个功能是很普遍的,我们希望还是能在ui里面加入这个功能。另外就是希望大大尽快更新下教程好让我们能更快上手,谢谢!祝您阖家欢乐幸福安康:)

  2. #2 hgy413 回复 | 引用 Post:2016-11-11 05:11

    @ylsoft
    托盘功能在QQDemo里已加了示例,有任何问题都可以直接M我QQ,谢谢

  3. #3 g would 回复 | 引用 Post:2020-06-10 18:23

    continuously i used to read smaller posts that also clear their motive, and that is also happening with this piece of writing
    which I am reading at this time.

  4. #4 find g 回复 | 引用 Post:2020-06-11 11:09

    This is the right blog for everyone who wants to understand this topic.
    You realize so much its almost hard to argue with you (not that
    I actually would want to…HaHa). You definitely put a fresh spin on a
    subject that’s been written about for decades. Excellent stuff, just wonderful!

  5. #5 http://leoch.in/ 回复 | 引用 Post:2020-06-14 12:42

    Hey There. I found your blog using msn. This is an extremely well written article.
    I’ll make sure to bookmark it and return to read more of your useful information. Thanks for the post.
    I’ll certainly comeback.

发表评论