MFC非模式对话框

创建非模态对话框

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()
{
// TODO: Add your control notification handler code here
((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)
{
// TODO: Add your specialized code here and/or call the base class

if ( pMsg->message == WM_KEYDOWN )
{
switch(pMsg->wParam)
{
case VK_ESCAPE:
return TRUE; //直接返回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)
{
// TODO: Add your specialized code here and/or call the base class
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.