做过UG二次开发的都知道,在UG里做二次开发的主要界面就是对话框了,UG自己定义了一套二次开发的界面接口,即所谓的UIStyler,对于我们用惯了MFC及Windows的消息机制来说,它那点简单的事件映射,仅有的几个控件(好像连常用的树控件都没有)让我们没有发挥的余地。于是使用MFC对话框代替UG的对话框是每个从MFC进入UG二次开发的人的首先想法。关于怎么在UG中使用MFC对话框已经有文章讲过了,我这里就不再讲了。但MFC对话框的一个很大的缺点就是与UG对框的风格不统一。UG的对话框都具有统一的风格,首先,按钮都具有自己的风格,比如它的四个角是圆角,鼠标移到上面会显示一个Focus的框。然后它的所有对话框都是一级一级弹出来的,比如点击OK按钮,可能会弹出下一个对话框,而上一级对话框会隐藏掉,按Back按钮会重新返回到上一个对话框。再有,一旦有另外一个对话框弹出,当前的对话框都会隐藏或销毁。
下面就给出我的仿UG对话框风格的对话框类CHsPMEDialog,它除了实现了上面的三点UG风格外,由于UG似乎对键盘消息做了截获,如果是普通的MFC对话框,在UG内使用时一些特殊的功能键就无效了,比如TAB键、回车键、ESC都无效了。为此在我的类中,还使用了键盘钩子截获这几个按键消息并做出处理。
//-----------------------------------------------------------------------------
// 描述:可实现类似UG风格OK、Cancel、Apply按钮风格的按钮类
// 该类来自网络,稍作修改,版权归原作者所有
//-----------------------------------------------------------------------------
class CHsPMEButton : public CButton
{
// Construction
public:
CHsPMEButton();
// Attributes
public:
// Operations
public:
inline void SetNormalTopColor(COLORREF color)
{
m_NormalColorTop = color;
}
inline void SetNormalBottomColor(COLORREF color)
{
m_NormalColorBottom = color;
}
inline void SetActiveTextColor(COLORREF color)
{
m_ActiveTextColor = color;
}
inline void SetNormalTextColor(COLORREF color)
{
m_NormalTextColor = color;
}
inline void SetSelectTextColor(COLORREF color)
{
m_SelectTextColor = color;
}
inline void SetFrameColor(COLORREF color)
{
m_FrameColor = color;
}
inline void SetActiveColor(COLORREF color)
{
m_ActiveColor = color;
}
// Overrides
// ClassWizard generated virtual function overrides
//{
{AFX_VIRTUAL(CHsPMEButton)
protected:
virtual void PreSubclassWindow();
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CHsPMEButton();
// Generated message map functions
protected:
//{
{AFX_MSG(CHsPMEButton)
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
//}}AFX_MSG
void DrawFace(COLORREF Top, COLORREF Bottom, CRect& rc, CRect CalRc, CDC* pDC);
void DrawFrame(COLORREF HeightLight, COLORREF ShadowLight, COLORREF FrameColor, CRect& rc, CDC* pDC);
void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );
LONG OnMouseLeave(WPARAM, LPARAM);
BOOL m_bIsMouseMove;
COLORREF m_FrameColor;
COLORREF m_ActiveColor;
COLORREF m_ActiveTextColor;
COLORREF m_NormalTextColor;
COLORREF m_SelectTextColor;
COLORREF m_FrameHeight;
COLORREF m_FrameShadow;
COLORREF m_NormalColorTop;
COLORREF m_NormalColorBottom;
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
// CHsPMEButton
CHsPMEButton::CHsPMEButton()
{
m_bIsMouseMove = 0;
m_NormalTextColor = RGB(0, 0, 0);
m_SelectTextColor = RGB(0, 0, 0);
m_ActiveTextColor = RGB(0, 0, 0);
//m_ActiveColor = RGB(250, 180, 80);
m_ActiveColor = RGB(255, 120, 80);
m_NormalColorTop = RGB(255, 255, 255); // 从UG对话框中取出的颜色
m_NormalColorBottom = RGB(213, 208, 196);
m_FrameColor = RGB(0, 64, 128);
m_FrameHeight = RGB(230, 230, 230);
m_FrameShadow = RGB(128, 128, 128);
}
CHsPMEButton::~CHsPMEButton()
{
}
BEGIN_MESSAGE_MAP(CHsPMEButton, CButton)
//{
{AFX_MSG_MAP(CHsPMEButton)
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CHsPMEButton message handlers
void CHsPMEButton::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
{
//*
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
DWORD nState = lpDrawItemStruct->itemState;
DWORD nAction = lpDrawItemStruct->itemAction;
CRect rc = lpDrawItemStruct->rcItem;
UINT uStyle = DFCS_BUTTONPUSH;
pDC->SetBkMode(TRANSPARENT);
CString strText;
GetWindowText(strText);
if( nState & ODS_SELECTED )
{
m_bIsMouseMove = 0;
DrawFace(m_NormalColorBottom, m_NormalColorTop, rc, rc, pDC);
DrawFrame(m_FrameShadow, m_FrameShadow, m_FrameColor, rc, pDC);
//pDC->Draw3dRect(rc, RGB(0,0,0), RGB(0,0,0));
pDC->SetTextColor(m_SelectTextColor);
}
else //Normal