MFC基于对话框的代码OnPaint、OnQueryDragIcon、OnSysCommand

3.创建对话框的代码

3.1 OnPaint

void CDrawButtonDlg::OnPaint() //接收到绘图消息WM_PAINT时调用此函数!
{
	//是否为最小化窗口
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting 用于画图
		//图标背景删除
		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
		//把图标(icon)放到客户区中心位置
		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);//取得客户区 矩形大小
		//计算x,y 坐标
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;
		//用dc.DrawIcon 画 图标.
		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

当Windows或应用程序请求重画应用程序窗口的一部分时,框架调用这个成员函数。WM_PAINT在调用UpdateWindowRedrawWindow成员函数时发出。当设置了RDW_INTERNALPAINT标志并调用RedrawWindow成员函数时,窗口可能会接收到内部重画消息。在这种情况下,窗口可能没有更新区域。应用程序必须调用GetUpdateRect成员函数以确定窗口是否具有更新区域。如果GetUpdateRect返回0,则应用程序不应调用BeginPaintEndPaint成员函数。

应用程序负责检查是否需要内部重画或更新,这可通过查看每条WM_PAINT消息的内部数据结构来完成,因为一条WM_PAINT可能是由于一个无效区域或由于使用RDW_INTERNALPAINT标志调用了RedrawWindow成员函数而引起的。

Windows只发送一次内部WM_PAINT消息。在通过UpdateWindow成员函数向窗口发送了内部WM_PAINT消息以后,将不会再向窗口发送其它WM_PAINT消息,直到再次使用RDW_INTERNALPAINT标志调用了RedrawWindow成员函数。

============================================================================================

3.2 OnQueryDragIcon

在用户拖拉最小化窗口的时候为了显示光标调用这个函数。

// The system calls this function to obtain the cursor to display while the user drags

//  the minimized window.

HCURSOR CDrawButtonDlg::OnQueryDragIcon()

{

return static_cast<HCURSOR>(m_hIcon);

}
返回值
一个双字值,它在低位字中包含了光标或图标的句柄。光标和图标必须与显示器的分辨率匹配。如果应用程序返回NULL,则系统将显示缺省的光标。缺省的返回值是NULL。

如果应用程序 返回图标或光标的句柄,系统将它转换为黑与白。

这个句柄必须标识与显示设备分辨率相兼容的单色光标或图标。应用程序可以调用CWinApp::LoadCursor或CWinApp::LoadIcon成员函数以从它的可执行文件的资源中载入光标或图标并获得其句柄。

============================================================================================

3.3系统响应函数OnSysCommand主要是截获控制命令只是系统命令

afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

框架调用这个成员函数以允许你的应用程序处理一个windows消息。

应用程序可以在任何时候通过向OnSysCommand发送WM_SYSCOMMAND消息来执行任何系统命令。

这个函数响应系统控制菜单的命令.(即左上角图标处)。

OnSysCommand:The framework calls this member function when the user selects a command from the Control menu, or when the user selects the Maximize or the Minimize button.

可以用来获取最大化最小化关闭About等动作发出的系统消息,并可以进行重写。

使用MFC编程的人在函数里写自己的逻辑当然也有必要调用一下它的父类这个函数,以便让系统处理一些默认的功能,有如下伪代码表示这个意思:

void OnSysCommand(UINT nID, LPARAM lParam) 
{
    if("命令码" == 我要专门处理的命令码)
    {
        这个事儿我来做
    }else
    {
        这些个事儿还是系统来处理
        CMainFrame::OnSysCommand(nID, lParam) ;
    }
}


至于这个函数谁来调用,那是MFC内核的事情,会调到你自己写的这个重载函数,所以你只要把逻辑写入到这里面就可以了

不同于PreTranslateMessage--截获消息。

这里就要弄清:系统命令消息和一般的消息的区别了?

注意:类CCmdTarget是MFC类库中消息映射体系的一个基类。消息映射把命令或消息引导给用户为之编写的响应函数(命令是由菜单项命令按钮或者加速键产生的消息!!!)。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我是一个语言模型AI,无法提供实际编程的例子。不过,您可以通过以下步骤在MFC对话框项目中使用Basler相机: 1. 下载Basler相机SDK,安装并添加到您的工程中。 2. 在您的MFC对话框中添加一个Picture Control控件,用于显示相机采集的图像。 3. 在您的对话框类中添加一个成员变量,用于保存相机对象。 4. 在OnInitDialog函数中初始化相机对象,并打开相机。 5. 在OnPaint函数中获取相机图像并在Picture Control控件中显示。 6. 在OnDestroy函数中关闭相机。 以下是基本的代码示例: ```c++ #include "stdafx.h" #include "BaslerCamera.h" #include "afxdialogex.h" #include <pylon/PylonIncludes.h> using namespace Pylon; IMPLEMENT_DYNAMIC(CBaslerCameraDlg, CDialogEx) CBaslerCameraDlg::CBaslerCameraDlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_BASLERCAMERA_DIALOG, pParent) { } CBaslerCameraDlg::~CBaslerCameraDlg() { } void CBaslerCameraDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_PICTURE, m_PictureCtrl); } BEGIN_MESSAGE_MAP(CBaslerCameraDlg, CDialogEx) ON_WM_PAINT() ON_WM_DESTROY() END_MESSAGE_MAP() BOOL CBaslerCameraDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 初始化Pylon库 PylonInitialize(); try { // 创建相机对象 m_Camera.Attach(CTlFactory::GetInstance().CreateFirstDevice()); // 打开相机 m_Camera.Open(); // 启动相机 m_Camera.StartGrabbing(); // 启动定时器 SetTimer(1, 33, NULL); } catch (const GenericException& e) { AfxMessageBox(CString(e.GetDescription())); } return TRUE; } void CBaslerCameraDlg::OnPaint() { CPaintDC dc(this); // device context for painting try { CGrabResultPtr ptrGrabResult; // 获取相机图像 m_Camera.RetrieveResult(5000, ptrGrabResult, TimeoutHandling_ThrowException); // 将图像显示在Picture Control控件中 if (ptrGrabResult->GrabSucceeded()) { CRect rect; m_PictureCtrl.GetClientRect(rect); CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap bmp; bmp.CreateBitmap(ptrGrabResult->GetWidth(), ptrGrabResult->GetHeight(), 1, 8 * ptrGrabResult->GetPixelType()); dcMem.SelectObject(&bmp); dcMem.SetStretchBltMode(COLORONCOLOR); dcMem.SetBitmapBits(bmp.GetBitmapDataSize(), ptrGrabResult->GetBuffer()); dc.StretchBlt(rect.left, rect.top, rect.Width(), rect.Height(), &dcMem, 0, 0, ptrGrabResult->GetWidth(), ptrGrabResult->GetHeight(), SRCCOPY); } } catch (const GenericException& e) { AfxMessageBox(CString(e.GetDescription())); } } void CBaslerCameraDlg::OnDestroy() { CDialogEx::OnDestroy(); KillTimer(1); // 停止相机 m_Camera.StopGrabbing(); // 关闭相机 m_Camera.Close(); // 释放Pylon库 PylonTerminate(); } ``` 请注意,上述代码仅供参考,实际使用中需要根据您的具体需求进行修改和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值