中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > 综合文章
VC6模拟C#的Anchor
作者:未知 时间:2005-07-27 21:55 出处:CSDN 责编:chinaitpower
              摘要:VC6模拟C#的Anchor

用C#写Windows程序的时候,我们可以注意到里面有个很有意思并且很有用的东东“Anchor”。它可以被指定为“Top, Bottom, Left, Right”的组合。这个东西可以简化我们的界面上的很多工作,很多时候都可以不用对布局写代码。以下是我在VC6里给出的模拟解决方案:
#pragma warning(disable: 4786)
#include <map>
typedef enum anchor{
 AR_NONE   = 0,  
 AR_LEFT   = 1,  
 AR_TOP    = 2,  
 AR_RIGHT  = 4, 
 AR_BOTTOM = 8, 
 
 AR_FILL = AR_LEFT | AR_TOP | AR_RIGHT | AR_BOTTOM, 
 AR_LEFTTOP = AR_LEFT | AR_TOP, 
 AR_RIGHTTOP = AR_RIGHT | AR_TOP, 
 AR_LEFTBOTTOM = AR_LEFT | AR_BOTTOM,
 AR_RIGHTBOTTOM = AR_RIGHT | AR_BOTTOM
}anchor;
typedef std::map<CWnd*, UINT> anchorMap;
typedef std::map<UINT, UINT> anchorMapById;

。。。。。。

void baseDlg::registerAnchor(CWnd* child, UINT anchor /* = AR_NONE */)
{
 anchors[child] = anchor;
}
void baseDlg::unRegisterAnchor(CWnd* child)
{
 anchorMap::iterator iter = anchors.find(child);
 if (iter != anchors.end())
  anchors.erase(iter);
}

void baseDlg::registerAnchorById(UINT itemId, UINT anchor /* = AR_NONE */)
{
 anchorsById[itemId] = anchor;
}

void baseDlg::unRegisterAnchorById(UINT itemId)
{
 anchorMapById::iterator iter = anchorsById.find(itemId);
 if (iter != anchorsById.end())
  anchorsById.erase(iter);
}

void baseDlg::OnSize(UINT nType, int cx, int cy)
{
 CDialog::OnSize(nType, cx, cy);

 if (!IsWindowVisible())
  return;

 CRect rtClientNew;
 GetClientRect(&rtClientNew);
 int dx = rtClientNew.right - oldClient.right;
 int dy = rtClientNew.bottom - oldClient.bottom;

 if (rtClientNew.Width() < 2 || rtClientNew.Height() < 2)
  return;

 for (anchorMap::iterator iter = anchors.begin();
 iter != anchors.end();
 ++iter)
 {
  CWnd* child = iter->first;
  if (child == NULL || !IsWindow(child->m_hWnd))
   continue;

  UINT anchor = iter->second;
  static CRect rtOrign;
  child->GetWindowRect(&rtOrign);
  ScreenToClient(&rtOrign);

  static CRect rtNew;
  rtNew = rtOrign;
  if (anchor & AR_LEFT)
  {
   rtNew.left = rtOrign.left;
  }
  else
  {
   rtNew.left += dx / 2;
  }

  if (anchor & AR_TOP)
  {
   rtNew.top = rtOrign.top;
  }
  else
  {
   rtNew.top += dy / 2;
  }

  if (anchor & AR_RIGHT)
  {
   rtNew.right += dx;
   if (!(anchor & AR_LEFT))
    rtNew.left = rtOrign.left + dx;
  }
  else
  {
   rtNew.right += dx / 2;
   if (anchor & AR_LEFT)
    rtNew.right = rtNew.left + rtOrign.Width();
  }

  if (anchor & AR_BOTTOM)
  {
   rtNew.bottom += (dy);
   if (!(anchor & AR_TOP))
    rtNew.top = rtOrign.top + dy;
  }
  else
  {
   rtNew.bottom += dy / 2;
   if (anchor & AR_TOP)
    rtNew.bottom = rtNew.top + rtOrign.Height();
  }

  child->MoveWindow(&rtNew);
 }

 for (anchorMapById::iterator iterById = anchorsById.begin();
 iterById != anchorsById.end();
 ++iterById)
 {
  CWnd* child = GetDlgItem(iterById->first);
  if (child == NULL || !IsWindow(child->m_hWnd))
   continue;

  UINT anchor = iterById->second;
  static CRect rtOrign;
  child->GetWindowRect(&rtOrign);
  ScreenToClient(&rtOrign);

  static CRect rtNew;
  rtNew = rtOrign;
  if (anchor & AR_LEFT)
  {
   rtNew.left = rtOrign.left;
  }
  else
  {
   rtNew.left += dx / 2;
  }

  if (anchor & AR_TOP)
  {
   rtNew.top = rtOrign.top;
  }
  else
  {
   rtNew.top += dy / 2;
  }

  if (anchor & AR_RIGHT)
  {
   rtNew.right += dx;
   if (!(anchor & AR_LEFT))
    rtNew.left = rtOrign.left + dx;
  }
  else
  {
   rtNew.right += dx / 2;
   if (anchor & AR_LEFT)
    rtNew.right = rtNew.left + rtOrign.Width();
  }

  if (anchor & AR_BOTTOM)
  {
   rtNew.bottom += (dy);
   if (!(anchor & AR_TOP))
    rtNew.top = rtOrign.top + dy;
  }
  else
  {
   rtNew.bottom += dy / 2;
   if (anchor & AR_TOP)
    rtNew.bottom = rtNew.top + rtOrign.Height();
  }

  child->MoveWindow(&rtNew);
 }

 oldClient = rtClientNew;

 Invalidate();
}


关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有