UG二次开发:用MFC对话框模拟UG对话框

本文介绍了如何在UG二次开发中使用MFC对话框来替代UG内置的对话框,以实现更丰富的界面功能。通过自定义CHsPMEButton类,模拟了UG对话框的圆角、焦点样式和键盘事件处理。同时,CHsPMEDialog类实现了类似UG对话框的后退、按钮风格和键盘钩子,确保在UG环境中MFC对话框的正常使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做过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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值