1.想鼠标在窗口客户区移动窗口,只需要在OnNcHitTest消息中,如果遇到HTCLIENT消息,则把它改为HTCAPTION消息即可。如SetWindowRgn设置窗体形状后,使用此消息。
LRESULT CShadeWindowDlg::OnNcHitTest(CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
UINT nHitTest=CDialog::OnNcHitTest(point);
return (nHitTest==HTCLIENT)?HTCAPTION:nHitTest;
}
2.可以使用CToolTipCtrl来管理按钮提示,很方便!
步骤1:声明CToolTipCtrl对象
步骤2: EnableToolTips(TRUE);父类允许使用
m_tipCtrl.Create(this);
m_tipCtrl.Activate(TRUE);
m_tipCtrl.SetDelayTime(200);// 设置延时
m_tipCtrl.AddTool(GetDlgItem(IDC_BUTTON),(LPCTSTR)“提示“);//给特定的按钮加提示
步骤3:重载PreTranslateMessage,在里面加上一句m_tipCtrl.RelayEvent(pMsg);
完了,挺方便。
3.Dialog中OnOK,OnCancel,OnClose,OnDestroy消息传到方向
1. 点“确定”、“取消”时的关闭路由为
OnOK()或OnCancel() ---> EndDialog() ---> DestroyWindow() ---> OnDestroy() ---> PostNcDestroy()
2. 点“关闭”标题栏按钮的关闭路由为
OnClose()---> DestroyWindow() ---> OnDestroy() ---> PostNcDestroy()
另外,在程序里面如果用一个函数去直接调用CDialog::OnClose(),也是不会关闭程序的。暂时还不知为什么。想关闭对话框,就SendMessage(WM_CLOSE)
4.任务栏添加图标
用到NOTIFYICONDATA 以及Shell_NotifyIcon。
typedef struct _NOTIFYICONDATA {
DWORD cbSize;//Size of this structure, in bytes.
HWND hWnd; //Handle to the window that receives notification messages
UINT uID; //Application-defined identifier of the taskbar icon
UINT uFlags; //which to contain valid data,NIF_ICON,NIF_MESSAGE,NIF_TIP
UINT uCallbackMessage; //uses this identifier for notification messages that it sends to the window identified in hWnd
HICON hIcon; //Handle to the icon to add, modify, or delete.
WCHAR szTip[64]; //ToolTip text to display for the icon.
} NOTIFYICONDATA, *PNOTIFYICONDATA;
按msdn要求,用设置好的pnid传入Shell_NotifyIcon就可以了。
5.CButton中设置bitmap,先在Create中加上BS_BITMAP, 然后构建一个CBitmap对象,使用LoadBitmap加载,在SetBitmap。注意CBitmap不能是局部变量,如果在函数中声明,超过作用域的时候会被栈清空,资源回收,在按钮上只能见到白白的一遍了。
msdn例子如下,不知为啥是行不通的。
myButton.SetBitmap( ::LoadBitmap(NULL, MAKEINTRESOURCE(OBM_CHECK)) );
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage, //NIM_ADD,NIM_DELETE,NIM_MODIFY
PNOTIFYICONDATA pnid
);
6.CListCtrl的最左一列只能按左对齐,如果想按右对齐,只能InsertColumn的nCol从1开始。很奇怪msdn没有的,高人指点,稍微记录备忘。