(MFC)在任意位置拖动窗口或弹出窗口菜单

来源:互联网 发布:php 获取请求url 编辑:程序博客网 时间:2024/05/16 01:53

在对话框任意位置拖动窗口

点击对话框=点击标题。


void CXXXDlg::OnLButtonDown(UINT nFlags, CPoint point){    SendMessage(WM_NCLBUTTONDOWN, HTCAPTION, 0);    // 也可以这样实现: PostMessage(WM_SYSCOMMAND, 0x0f012, 0);     // CDialog::OnLButtonDown(nFlags, point);}

在对话框任意位置弹出系统菜单

HMENU GetSystemMenu(HWND hWnd,BOOL bRevert);

此函数允许应用程序访问窗口菜单,如果bRevert为FALSE,返回值是当前窗口菜单的可修改的拷贝的句柄。如果此参数为TRUE,返回值是NULL,函数重置窗口菜单到缺省状态。

void CAlphaDialogDlg::OnRButtonDown(UINT nFlags, CPoint point){    CPoint pt;    GetCursorPos(&pt);    HMENU m = ::GetSystemMenu(GetSafeHwnd(), FALSE);    ::TrackPopupMenu(m, TPM_RIGHTBUTTON, pt.x, pt.y, 0, GetSafeHwnd(), NULL);        CDialog::OnRButtonDown(nFlags, point);}

对于标题栏的系统菜单,选择菜单项后,发送的是WM_SYSCOMMAND消息。但是自己取得系统菜单的句柄,并且用TrackPopupMenu弹出菜单,这时选择菜单后系统发出的是另外一个消息WM_COMMAND。所以程序不会自动响应,需要自己写代码来响应。

MFC项目的WM_COMMAND消息响应在OnCommand虚函数中添加。

BOOL CXXXDlg::OnCommand(WPARAM wParam, LPARAM lParam){    switch (wParam) {    case SC_ZOOM:    case SC_ICON:    case SC_MOVE:    case SC_SIZE:    case SC_CLOSE:    case SC_RESTORE:    SendMessage(WM_SYSCOMMAND, wParam, 0L);    default: break;    }    return CDialog::OnCommand(wParam, lParam);}

引用:CSDN:用API实现弹出 标题栏的系统菜单 ,但点击其具体的菜单项,程序却没响应!




1 0
原创粉丝点击