心得一:
怎样来更改复合控件背景的颜色:
在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;
}