MFC 常用技巧整理
1,RADIO按钮的分组使用:
CTRL+D 调整想分成一组的RADIO在连续的Z序上。直到遇到另一个非RADIO控件或GROUP属性为TRUE 的RADIO控件。
2,对话框非标题条拖动:
LBUTTONDOWN消息响应中加一句:
PostMessage( WM_SYSCOMMAND, SC_MOVE | HTCAPTION, 0); //只需要发送一个消息,点在窗口中就可移动窗口。
3,弹出对话框设置透明度:OnInitDialog()中:
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^WS_EX_LAYERED);
::SetLayeredWindowAttributes(m_hWnd,RGB(1,0,0),150,LWA_COLORKEY|LWA_ALPHA);
4,STATIC或EDIT控件背景透明,改变字体颜色:OnCtlColor中,STATIC为例如下
if (nCtlColor == CTLCOLOR_STATIC)
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(0,0,255));
return (HBRUSH)GetStockObject(NULL_BRUSH);
}
5,得到鼠标离开控件的消息:在OnMouseMove中添加:
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE;
_TrackMouseEvent(&tme);
有人愿意使用SetCapture/ReleaseCapture组合,个人使用感觉判断控件组的离开消息时,只能使用上面后方法处理。
6,有时需要将一些消息如WM_LBUTTONDOWN消息传递出去,一般将消息机制需要的参数补齐如下即可发出。
PostMessage(WM_LBUTTONDOWN,MK_LBUTTON, MAKELONG(pMsg->pt.x, pMsg->pt.y) );
7,有时需要让一个控件或对话框能跟随鼠标移动,这时鼠标消息在控件内接收,但移动要在父窗口中,否则可能会闪烁或不流畅。
8,加载图片最好使用CImage其内部使用GDI+,可以让您不用关心图片类型:
#include <atlimage.h>
CImage img;
img.Load(m_cstrPicPath);
if (img.IsNull())
{
return ;
}
m_hBmpPic = img.Detach();
img.Destroy();
9,GDI显示图片时StretchBlt有时缩放效果不好,大多数情况下须修改模式为:
pDC->SetStretchBltMode(HALFTONE);
10,显示多个控件刷新时或控件内数据改变较多时(如LIST,TREE等)可能会闪烁,这时使用LockWindowUpdate()/UnlockWindowUpdate()组合应该会有效果。