客户端
目前客户端的实现,不少大公司采用了较为新潮的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;