IM 开源项目 客户端UI框架 Direct UI

本文探讨了如何在IM项目中使用Direct UI技术来构建客户端UI。由于微软未提供现成的Direct UI封装,项目团队决定自行设计和实现这一框架,包括抽象窗口、控件自绘制和消息循环等核心功能。CWinWnd类用于注册和创建主窗口,其他控件都绘制在其上。CUIBuilder则负责解析配置文件并构建窗体控件。
摘要由CSDN通过智能技术生成

客户端

       目前客户端的实现,不少大公司采用了较为新潮的Direct UI技术,本项目中也考虑使用Direct UI,但可惜微软并没有提供可使用的Direct UI 封装,因此我们自己设计实现Direct UI,并在此基础上实现客户端UI部分的功能。

       Direct UI 框架的实现并不复杂,就是繁琐,如抽象窗口,控件自绘制,设计完成消息循环与映射,资源管理...

      

       CWinWnd: 注册创建主窗口,也是唯一具备Win 窗口句柄的窗口,其他一切控件子窗口,均绘制在此窗口上,维持逻辑存在。

       具体实现如下:

       头文件:

#ifndef H_WINWND_H
#define H_WINWND_H
#include "CTypeDef.h"
#include "UIStructDef.h"
#include "UIMSGMgr.h"
#include <map>

class CWinWnd : public IWinWnd
{
public:
	CWinWnd(void);
	virtual ~CWinWnd(void);

	BOOL RegWinClass( HINSTANCE hInstance = NULL);														// 注册窗口类

	
	HWND Create(HWND ahwndParent, LPCTSTR apstrName, DWORD adwStyle, DWORD adwExStyle,					// 创建窗口
				const RECT arc, HMENU ahMenu = NULL, HINSTANCE hInstance = NULL);
	
	HWND Create(HWND ahwndParent, LPCTSTR apstrName, DWORD adwStyle, DWORD adwExStyle,					// 创建窗口
				int ax = CW_USEDEFAULT, int ay = CW_USEDEFAULT, int acx = CW_USEDEFAULT, 
				int acy = CW_USEDEFAULT, HMENU ahMenu = NULL, HINSTANCE hInstance = NULL);

	void SetWndInfo(HINSTANCE ahInstance, ULong aulStyle,ULong aulStyleEx, int aiXVertex, int aiYVertex, int aiWeigth, int aiHeigth, HMENU ahMenu = NULL);				// 设置大小信息


	void ShowWindow(BOOL bShow /*= true*/, BOOL bTakeFocus /*= false*/);								// 显示窗口
	static LRESULT CALLBACK 
		__WndProc(HWND ahWnd, UINT auMsg, WPARAM awParam, LPARAM alParam);								// 消息回调 
	HWND Subclass(HWND hWnd);																			// 子类化
	void Unsubclass(void);																				// 反子类化
	void SetIcon(UINT nRes);																			// 设置图标
	void CenterWindow(void);																			// 居中
	void Close(UINT nRet);																				// 关闭
	UINT ShowModal(void);																				// ???
	
//protected:
protected:
	virtual LRESULT 
		HandleMessage(UINT auMsg, WPARAM awParam, LPARAM alParam);										// 消息处理
	virtual void 
		OnFinalMessage(HWND ahWnd);																		// 退出
	virtual void 
		SetWinClassName(TCHAR* apClassName);															// 设置注册类名称
	virtual LPCTSTR 
		GetWinClassName(void) const;																	// 获得注册类名称
	virtual void 
		SetWinName(TCHAR* apClassName);																	// 设置窗口名称
	virtual LPCTSTR 
		GetWinName(void) const;																			// 获得窗口名称
	virtual void																						
		SetXmlFile(TCHAR* apXmlFile);																	// 设置Xml文件名称
	virtual LPCTSTR																						
		GetXmlFile(void) const;																			// 获得Xml文件名称

protected:
	HWND			m_hWnd;																				// 窗口句柄
	WNDPROC			m_OldWndProc;																		// 旧的消息回调
	bool			m_bSubclassed;																		// 子窗口
	TCHAR			m_lszRegClassName[MAX_PATH+1];														// 窗口注册类名称
	TCHAR			m_lszWndName[MAX_PATH+1];															// 窗口名称
	TCHAR			m_szXmlFile[MAX_PATH+1];																// 界面配置文件名称

	TCHAR			m_lszInstancePath[MAX_PATH+1];														
	TCHAR			m_lszCurPath[MAX_PATH+1];														

	CMSGMgr			m_oMsgMgr;							
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值