第一次制作ATL控件心得!!!FontColor控件!!

来源:互联网 发布:sql having语法 编辑:程序博客网 时间:2024/04/27 13:23

心得一:

怎样来更改复合控件背景的颜色:

在wizard中选择BackGroundColor属性

选择了这个属性之后,向导会给我们的代码中添加m_clrBackColor成员,OnBackColorChanged详细响应函数(应该是虚函数),在我们的背景色改变的时候,会调用他,但是当我们拦截了WM_CTLCOLORDLG消息之后,就不调用这个了,应该是基类中的WM_CTLCOLORDLG消息响应函数调用的他。

1.初始化复合控件的背景色

LRESULT CColorFont::OnCtlColorDlg(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
 ATLTRACE(_T("OnCtlColorDlg/n"));
 ::DeleteObject(m_hbrBackground);
 HBRUSH hbrush = ::CreateSolidBrush(m_clrBackColor);
 m_hbrBackground =hbrush;
 return (LRESULT)hbrush;
}

返回的画刷用于绘制对话框的背景色,每当对话框颜色改变的时候都会发出这个消息。

 


 

2.快捷键解决办法。

对于快捷键有两种办法解决,对于WM_KeyDown,不能响应,解决办法,就是在PreTranslateAccelerators里面来做文章。或者是通过钩子来实现,当然对于后者最好少用,迫于无赖再用!


 

3.BUG经验,对于HOOK过程,一定要注意消息是否继续传递下去,如果已经处理了,特别对于窗口(如果把窗口销毁了),如果继续传递下去很可能出现错误.


 

4.对于内存泄露的一点体会:

内存泄露,也就是通过new出来的对象在程序结束之后没有被释放,这样导致的结果就是,当你的程序用了很多存储空间而又不释放,导致内存被耗尽!!!最后当机!!!!!

在一个析构函数里面类似这样

if(!pWnd)

   delete *itFont;

调试的时候发现每次都没有delete掉,改成这样就可以了

if(pWnd == NULL)

  delete *itFont;


 

5.关于实现拖动static控件,可以通过这样来实现,当我点击static控件的时候响应 STN_CLICKED(Static要有SS_NOTIFY样式!),然后获取其句柄 并SetFocus()  m_bDown = TRUE,然后让对话框捕获鼠标消息SetCapture(m_hWnd),在MouseMove里面通过MoveWindow来移动Static,在判断m_bDown == TRUE,然后MoveWindow ,

最后MouseUp里面将m_bDown == FALSE;

具体代码如下:


LRESULT CColorFont::OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
 LONG lx,ly;
 POINT ptMouse;
 lx = GET_X_LPARAM(lParam);
 ly = GET_Y_LPARAM(lParam);
 ptMouse.x = lx;
 ptMouse.y = ly;
 if(m_bDown == TRUE && m_ptNew.x != lx && m_ptNew.y != ly && ::IsWindow(m_hCurrStatic))
 {
  RECT rect,dlgRect;
  LONG lStaticWidth, lStaticHeight;
  memset(&dlgRect,0,sizeof(RECT));
  memset(&rect,0,sizeof(RECT));
  ATLASSERT(m_hCurrStatic != NULL);
  ::GetWindowRect(m_hWnd,&dlgRect);
  ::GetWindowRect(m_hCurrStatic,&rect);
  ScreenToClient(&dlgRect);
  ScreenToClient(&rect);
  POINT ptRB;
  lStaticWidth = rect.right - rect.left;
  lStaticHeight = rect.bottom - rect.top;
  ptRB.x = lStaticWidth + ptMouse.x;
  ptRB.y = lStaticHeight + ptMouse.y;
  if(!::PtInRect(&dlgRect,ptMouse) || !::PtInRect(&dlgRect,ptRB))//防止超出边界到达边界就不移动直接返回
  {
   return 0;
  }
  else
  {
   ::MoveWindow(m_hCurrStatic,
    GET_X_LPARAM(lParam),
    GET_Y_LPARAM(lParam),
    lStaticWidth,
    lStaticHeight,
    TRUE);
   RECT rc;
   ::GetWindowRect(m_hCurrStatic,&rc);
   ScreenToClient(&rc);
   InvalidateRect(&rc);
  }
  Fire_OnGetStaticPosition(lx,ly);
  bHandled = TRUE;
 }
 bHandled = FALSE;
 return 0;
}

 

 

/响应点击static控件的消息
LRESULT CColorFont::OnStaticNotify(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
 if(wNotifyCode == STN_CLICKED)
 {
  m_hCurrStatic = hWndCtl;
  ATLTRACE("m_hCurrStatic:%d/n",m_hCurrStatic);
  RECT rect;
  ::SetFocus(m_hCurrStatic);
  ::GetWindowRect(hWndCtl,&rect);
  ScreenToClient(&rect);
  ::SendMessage(m_hWnd,WM_LBUTTONDOWN,(WPARAM)MK_LBUTTON,MAKELPARAM(rect.left,rect.top));
 }
 return 0;
}

 

 

 

 

原创粉丝点击