创建非模态对话框 shared_ptr<CFloatWin> m_pDlgFloat; m_pDlgFloat.reset (new CFloatWin ()); m_pDlgFloat->Create (IDD_FLOATWIN); m_pDlgFloat->ShowWindow (SW_SHOW); void CiPcPayTesterDlg::OnDestroy () { m_pDlgFloat->DestroyWindow (); m_pDlgWaite->DestroyWindow (); if (m_pDlgPayMain) { m_pDlgPayMain->DestroyWindow (); } m_sysIcon.deleteIcon (); CDialogEx::OnDestroy (); } DestroyWindow ();void CDlgFetchDataNotice::OnBnClickedOk () { ((CAlarmViewerDlg*)AfxGetMainWnd ())->abortFetchData (); DestroyWindow (); } void CDlgFetchDataNotice::PostNcDestroy () { CDialog::PostNcDestroy (); delete this ; }
实现客户区拖拽移动功能 说明:还有一种是重载WM_NCHITTEST事件,但是这样会无法响应WM_LBUTTONDOWN等鼠标消息。 因为在WM_NCHITTEST中处理了鼠标消息,把他定位成HTCAPTION,也就是鼠标在标题栏上,而标题栏属于非客户区(NC),非客户区的事件消息都是以WM_NC开头的,只能用WM_NCLBUTTONUP来处理。
目前看还是使用下面的方式比较好用。
在程序获得左键按下的状态时,发送以下任一系统消息都可以实现悬浮窗的拖拽。 1. SendMessage (WM_SYSCOMMAND, SC_MOVE | HTCAPTION, 0 );2. PostMessage (WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM (point.x,point.y));void CFloatWin::OnLButtonDown (UINT nFlags, CPoint point) { ::SetCursor (AfxGetApp ()->LoadStandardCursor (IDC_HAND)); PostMessage (WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM (point.x, point.y)); CDialog::OnLButtonDown (nFlags, point); }
回车,ESC程序退出问题 BOOL CnumberConverterDlg::PreTranslateMessage (MSG* pMsg) { if ( pMsg->message == WM_KEYDOWN ) { switch (pMsg->wParam) { case VK_ESCAPE: return TRUE; break ; case VK_RETURN: return TRUE; break ; } } return CDialog::PreTranslateMessage (pMsg); }
任务栏图标 ModifyStyleEx(0, WS_EX_APPWINDOW); // 恢复任务栏显示. ModifyStyleEx(WS_EX_APPWINDOW, 0);//从任务栏中去掉.
启动时最小化 BOOL CFSNProcDlg::OnInitDialog () { ... ModifyStyleEx (WS_EX_APPWINDOW, WS_EX_TOOLWINDOW); ... } LRESULT CFSNProcDlg::DefWindowProc (UINT message, WPARAM wParam, LPARAM lParam) { if (message == WM_NCPAINT) { ShowWindow (SW_HIDE); return 0 ; } return CDialogEx::DefWindowProc (message, wParam, lParam); }
启动时隐藏 这个方法好,启动没有白屏一闪的问题
private : BOOL m_visible; m_visible = FALSE; void CYourDialog::OnWindowPosChanging (WINDOWPOS FAR* lpwndpos) { if (!m_visible) { lpwndpos->flags &= ~SWP_SHOWWINDOW; } CDialog::OnWindowPosChanging (lpwndpos); } m_visible = TRUE; ShowWindow (SW_SHOW);
AfxMessageBox if (IDYES == AfxMessageBox (L"发现新版本,是否现在升级\r\n如果选No,可以稍后手动退出程序完成升级" , MB_YESNO)){ OnRmenuquit (); }
返回值
说明
IDABORT
The Abort button was selected.
IDCANCEL
The Cancel button was selected.
IDIGNORE
The Ignore button was selected.
IDNO
The No button was selected.
IDOK
The OK button was selected.
IDRETRY
The Retry button was selected.
IDYES
The Yes button was selected.