解释下这段代码 LRESULT CMainDialog::OnPopDlgAlarm(WPARAM wParam, LPARAM lParam) { if(m_pDlgAlarmDetail != NULL) { CRect size1; GetWindowRect(&size1); size1.top = 0; size1.bottom = GetSystemMetrics( SM_CYFULLSCREEN ); if(m_pEDealer->getConfigDef().PopScreenNo() > 0) { size1.MoveToX(GetSystemMetrics( SM_CXFULLSCREEN ) * m_pEDealer->getConfigDef().PopScreenNo() + size1.left); } CRect size; m_pDlgAlarmDetail->GetWindowRect(&size); m_pDlgAlarmDetail->updateAlarm(); if (m_nFirstMove) { m_nFirstMove = false; m_pDlgAlarmDetail->MoveWindow(size1.left + (size1.Width() - size.Width()) / 2, size1.top - 30 + (size1.Height() - size.Height()) / 2, size.Width(), size.Height(), TRUE); } else { m_pDlgAlarmDetail->MoveWindow(size.left , size.top, size.Width(), size.Height(), TRUE); } m_pDlgAlarmDetail->ShowWindow(SW_SHOW); UpdateWindow(); } return 0; }
时间: 2024-04-06 22:28:55 浏览: 15
这是一个 MFC 框架下的对话框消息响应函数,函数名为 OnPopDlgAlarm,其返回值类型为 LRESULT。该函数的参数有两个,分别是 WPARAM 和 LPARAM。
在函数体内部,首先检查成员变量 m_pDlgAlarmDetail 是否为空指针。如果不为空,就获取当前对话框的窗口矩形区域,并将其设置为全屏高度,然后根据配置文件中的 PopScreenNo() 的值来调整对话框的位置,实现对话框在屏幕上的弹出效果。
接下来,获取对话框的窗口矩形区域,调用 updateAlarm() 函数更新对话框中的报警信息。然后根据是否是第一次移动对话框的标志位 m_nFirstMove 来选择对话框的移动方式,如果是第一次移动,则将对话框移动到屏幕中央,否则就按照之前的位置进行移动。最后,将对话框显示出来,并更新窗口。
最后,该函数返回 0,表示消息已经处理完毕。
相关问题
解释下这段代码 LRESULT CMainDialog::OnMsgBox(WPARAM wParam, LPARAM lParam) { CRect size; GetWindowRect(&size); size.top = 0; size.bottom = GetSystemMetrics( SM_CYFULLSCREEN ); CDialogInfo dlg(&size, (const char *)wParam, (int)(lParam), this); if(dlg.DoModal() != IDOK) { return 1; } return 0; }
这段代码是 CMainDialog 类的成员函数 OnMsgBox,它是一个处理自定义消息 WM_MSGBOX 的函数。该函数接收两个参数,一个是 WPARAM 类型的 wParam,一个是 LPARAM 类型的 lParam。函数返回值是 LRESULT 类型。
该函数首先通过 GetWindowRect 函数获取对话框的矩形框大小,然后将其上下边缘设置为屏幕的上下边缘,这样对话框就会占据整个屏幕。接着,通过创建一个 CDialogInfo 类的对象 dlg,并将对话框的大小、消息内容、消息类型和 CMainDialog 对象的指针传递给它。CDialogInfo 是一个对话框类,用于显示消息内容和提供两个按钮 OK 和 Cancel。如果用户单击了 OK 按钮,则 DoModal 函数返回 IDOK,否则返回其他值。
最后,如果 dlg.DoModal() 不等于 IDOK,则函数返回 1,否则返回 0。这样,就完成了对自定义消息 WM_MSGBOX 的处理。
编程实现单文档应用程序,满足以下要求: (1)MFC标准类型,经典菜单与不带工具栏; (2)单击鼠标左键,消息对话框中显示鼠标信息(鼠标左键+坐标); (3)单击鼠标左键+键盘Ctrl键,消息对话框中显示鼠标信息(鼠标左键+Ctrl键+坐标); (4)按下键盘任意字符键(至少识别三个功能键),客户区中显示按键信息(字符或功能键内容)
以下是实现代码:
MyApp.h
```
#pragma once
class CMyApp : public CWinApp
{
public:
CMyApp();
public:
virtual BOOL InitInstance();
private:
static BOOL CALLBACK MouseProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
static LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);
private:
static CWnd* m_pWnd;
};
```
MyApp.cpp
```
#include "stdafx.h"
#include "MyApp.h"
#include "MyFrameWnd.h"
#include <afxwin.h>
CWnd* CMyApp::m_pWnd = NULL;
CMyApp::CMyApp()
{
}
BOOL CMyApp::InitInstance()
{
CWinApp::InitInstance();
CMyFrameWnd* pFrameWnd = new CMyFrameWnd;
pFrameWnd->Create(NULL, _T("Single Document Application"), WS_OVERLAPPEDWINDOW, CRect(0, 0, 800, 600));
pFrameWnd->ShowWindow(SW_SHOW);
m_pMainWnd = pFrameWnd;
m_pWnd = pFrameWnd;
SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, AfxGetInstanceHandle(), 0);
HINSTANCE hInstance = AfxGetInstanceHandle();
SetWindowsHookEx(WH_MOUSE_LL, MouseProc, hInstance, 0);
return TRUE;
}
BOOL CALLBACK CMyApp::MouseProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == WM_LBUTTONDOWN)
{
CString strMsg;
strMsg.Format(_T("Mouse left button clicked at (%d, %d)"), LOWORD(lParam), HIWORD(lParam));
if (GetKeyState(VK_CONTROL) & 0x8000)
{
strMsg += _T(" Ctrl key pressed");
}
AfxMessageBox(strMsg);
}
return CallNextHookEx(NULL, message, wParam, lParam);
}
LRESULT CALLBACK CMyApp::KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
if (code == HC_ACTION)
{
CString strMsg;
if ((GetKeyState(VK_CONTROL) & 0x8000) && (wParam == 'A'))
{
strMsg = _T("Ctrl+A pressed");
}
else if ((GetKeyState(VK_CONTROL) & 0x8000) && (wParam == 'B'))
{
strMsg = _T("Ctrl+B pressed");
}
else if ((GetKeyState(VK_CONTROL) & 0x8000) && (wParam == 'C'))
{
strMsg = _T("Ctrl+C pressed");
}
else
{
strMsg.Format(_T("Key pressed: %c"), wParam);
}
m_pWnd->SetWindowText(strMsg);
}
return CallNextHookEx(NULL, code, wParam, lParam);
}
```
MyFrameWnd.h
```
#pragma once
class CMyFrameWnd : public CFrameWnd
{
public:
CMyFrameWnd();
virtual ~CMyFrameWnd();
protected:
DECLARE_MESSAGE_MAP()
};
```
MyFrameWnd.cpp
```
#include "stdafx.h"
#include "MyFrameWnd.h"
CMyFrameWnd::CMyFrameWnd()
{
}
CMyFrameWnd::~CMyFrameWnd()
{
}
BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd)
END_MESSAGE_MAP()
```