WEB开发网
开发学院软件开发VC QQ2006 界面编程之鸡蛋里挑骨头 阅读

QQ2006 界面编程之鸡蛋里挑骨头

 2007-03-15 21:46:11 来源:WEB开发网   
核心提示: void C**Dlg::OnShowWindow(BOOL bShow, UINT nStatus){CWnd::OnShowWindow(bShow, nStatus);// TODO: 在此处添加消息处理程序代码if(bShow){CRect rc;this->GetClien
void C**Dlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
 CWnd::OnShowWindow(bShow, nStatus);
 // TODO: 在此处添加消息处理程序代码
 if(bShow)
 {
  CRect rc;
  this->GetClientRect(&rc);
  CRgn rgnMain;
  rgnMain.CreateRoundRectRgn(0, 0, rcClient.Width(), rcClient.Height());
  ...
  SetWindowRgn( rgnMain, TRUE );
 }
}

二、手动做“Resizing对话框”

该思路启发于徐景周的精灵特效窗体。要想点击窗体客户区不放能移动窗体,传统的做法是模拟消息点击标题。

void C**Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
 // TODO: 在此添加消息处理程序代码
 PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,0);
 CDialog::OnLButtonDown(nFlags, point);
}

这样很方便实现效果。但不足是窗体被移到屏幕上方,大部分在屏幕所能显示以外以后放开鼠标,窗体会自动向下对齐。徐景周的精灵特效窗体用了SetTimer和MoveWindow结合使用,这样窗体想被移到哪里都可以。正因为如此,让我想到拖放窗体的好思路。当然我们完全可以利用窗体风格WS_THICKFRAME,让系统来为我们做事。

但是如果我们要指定窗体某个部位可以拖放窗体时,像QQ切换主题后,拖放很不方便。可以拖放的区域不是最左,最右,最上,最下,没有别的地方可以点击拖放窗体了。

如何实现,简单说就是在鼠标按下时判断是否点在规定区域内,是的话启动记时器。然后在记时器里面定时器里面对光标判断当前位置与之前位置,从而调用MoveWindow让窗体朝响应方向拉伸或收缩。代码较琐碎,请见例子。

void C**Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
 CRect rc(*,*,*,*);
 if(rc.PtInRect(point))
 {
  SetTimer(1,20,NULL);//启动记时器
  return;
 }
 CDialog::OnLButtonDown(nFlags, point);
}
void C**Dlg::OnTimer(UINT_PTR nIDEvent)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
 switch(nIDEvent)
 {
  case(1):
  {
   CRect rcW;
   POINT point;
   GetWindowRect(rcW);//
   //实现拖动时窗体跟着右下角拉伸
   ::GetCursorPos(&point); //得到“当前位置”
   if(point.y<rcW.bottom-400)
   {
    MoveWindow(m_rcCurRect.left ,point.y-m_ptCurPoint.y, rcW.Width(),
m_rcCurRect.bottom-(point.y-m_ptCurPoint.y), true);
    CRect rc;
    GetWindowRect(rc);
    m_rcCurRect = rc;//保存“之前位置”
   }
   Invalidate();
  }
  break;
   ...
  Default:
   break;
 }
 Dialog::OnTimer(nIDEvent);
}

代码在Visual2005下编译,在WindowXP运行通过。预览图如下:

预览图

上一页  1 2 

Tags:QQ 界面 编程

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接