C/C++ MFC 折叠窗口的实现

2025-11-06 01:34:13

1、最终实现的效果, 通过一个按钮控制折叠:

这只是个思路,需要完整的请留言!

C/C++ MFC 折叠窗口的实现

C/C++ MFC 折叠窗口的实现

2、CPP:

// ShrinkDownDlg.cpp : 实现文件

//

#include "stdafx.h"

#include "ShrinkDown.h"

#include "ShrinkDownDlg.h"

#include "afxdialogex.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

// CShrinkDownDlg 对话框

 

CShrinkDownDlg::CShrinkDownDlg(CWnd* pParent /*=NULL*/)

: CDialogEx(IDD_SHRINKDOWN_DIALOG, pParent)

, iShow(TRUE)

{

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CShrinkDownDlg::DoDataExchange(CDataExchange* pDX)

{

CDialogEx::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CShrinkDownDlg, CDialogEx)

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_BTN_HIDE, &CShrinkDownDlg::OnBtnHide)

END_MESSAGE_MAP()

 

// CShrinkDownDlg 消息处理程序

BOOL CShrinkDownDlg::OnInitDialog()

{

CDialogEx::OnInitDialog();

OnBtnHide();

// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动

//  执行此操作

SetIcon(m_hIcon, TRUE); // 设置大图标

SetIcon(m_hIcon, FALSE); // 设置小图标

// TODO: 在此添加额外的初始化代码

return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE

}

// 如果向对话框添加最小化按钮,则需要下面的代码

//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,

//  这将由框架自动完成。

void CShrinkDownDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialogEx::OnPaint();

}

}

//当用户拖动最小化窗口时系统调用此函数取得光标

//显示。

HCURSOR CShrinkDownDlg::OnQueryDragIcon()

{

return static_cast<HCURSOR>(m_hIcon);

}

 

void CShrinkDownDlg::OnBtnHide()

{

CButton *btn_Hide = (CButton *)GetDlgItem(IDC_BTN_HIDE);

/* 得到IDC_BTN_HIDE按钮的位置 */

btn_Hide->GetWindowRect(&rectSmall);

if (iShow == 1)

{

/* 当前向下窗口是展开的,此时,可用来记录窗口的大小及位置 */

this->GetWindowRect(&rectLarge);

/* 将高度设为(窗口底部的y值 – 按钮底部的y值 + 25像素的边距) */

SetWindowPos(NULL, 0, 0, rectLarge.Width(), rectLarge.bottom - rectSmall.top + 25,

SWP_NOZORDER | SWP_NOMOVE);

/* 更新按钮状态及按钮显示文字 */

iShow = 0;

this->SetDlgItemText(IDC_BTN_HIDE, L"︾");

}

else

{

/* 当前向下窗口是不显示的,可直接还原为原来窗口大小,并更新按钮状态及文字 */

iShow = 1;

SetWindowPos(NULL, 0, 0, rectLarge.Width(), rectLarge.Height(), SWP_NOZORDER | SWP_NOMOVE);

this->SetDlgItemText(IDC_BTN_HIDE, L"︽");

}

}

3、.h:

// ShrinkDownDlg.h : 头文件

//

#pragma once

 

// CShrinkDownDlg 对话框

class CShrinkDownDlg : public CDialogEx

{

// 构造

public:

CShrinkDownDlg(CWnd* pParent = NULL); // 标准构造函数

// 对话框数据

#ifdef AFX_DESIGN_TIME

enum { IDD = IDD_SHRINKDOWN_DIALOG };

#endif

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

 

// 实现

protected:

HICON m_hIcon;

// 生成的消息映射函数

virtual BOOL OnInitDialog();

afx_msg void OnPaint();

afx_msg HCURSOR OnQueryDragIcon();

DECLARE_MESSAGE_MAP()

public:

BOOL iShow; //表示是否收缩的标志位

CRect rectSmall;  //收缩时显示最小化

CRect rectLarge; //扩展时显示最大化

afx_msg void OnBtnHide();

};

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢