MFC中CSTATIC控件双击全屏/双击恢复

双击全屏方法有两种
1.双击放大的时候调static控件的父句柄SerParent让控件的父句柄变成桌面,然后再提取桌面的分辨率用movewindow或者setwindowpos改变控件大小.恢复成原来的大小时把父句柄设置成对话框.
2.双击放大时调整对话框的大小,先把对话框变成全屏,再把控件变成全屏大小,其他控件可以先隐藏起来.双击恢复时先把对话框变小,再把控件变小.再显示其它控件.

这里只简单讲一下第二种方法,因为第一种方法我没成功

我是使用控件的事件来完成的双击操作.别人的我看有的是使用的重载这两个函数,
void OnLButtonDblClk(UINT nFlags, CPoint point)
virtual BOOL PreTranslateMessage(MSG* pMsg);
但是由于本人太菜,第一个做的会导致双击不是cstatic控件的地方也会全屏,其他按钮都点不了的结果,
第二锅是完全不会做,我做出来的只能全屏不能恢复成原来大小.

下面是我做的步骤:
先到资源视图里给这个控件添加这个双击事件函数
然后给static控件关联一个变量control类型的 m_ctrlPlayWnd 名字自己定.

void CXXXXDlg::OnStnDblclickStaticPrv(){
if(m_bIsFullScrean==FALSE)          //m_bIsFullScrean这个是类里面定义的判断目前是否是全屏的变量
{
CRect rect;                                                                                
//获取原控件窗口大小
m_ctrlPlayWnd.GetClientRect(m_Old_IDC);         //定义:CRect m_Old_IDC;  
m_ctrlPlayWnd.GetWindowPlacement(&m_Old_Place); //定义:WINDOWPLACEMENT m_Old_Place;
//获得原dlg大小位置
GetWindowRect(m_Dlg_IDD);                       //定义:CRect m_Dlg_IDD;

//rect用来获取桌面的分辨率
WINDOWPLACEMENT fullwnd;                           //fullwnd这个变量用来调整控件大小
GetDesktopWindow()->GetWindowRect(&rect);          //rect用来获取桌面的分辨率
ModifyStyle(WS_CAPTION, 0);               //去掉标题栏                        //测试的时候可以不加这个试试,全屏有点不好看
ModifyStyleEx(WS_EX_DLGMODALFRAME, 0);    //去掉边框          //看不出来啥
MoveWindow(&rect);                                                                //rect的利用,这里的MoveWindow是对主对话框产生效果,即使对话框全屏
fullwnd.flags=0;                                                                   //这里开始是对WINDOWPLACEMENT这个类型的结构体赋值,我用到的就这四项
fullwnd.length = sizeof(WINDOWPLACEMENT);
fullwnd.showCmd = SW_SHOWNORMAL;                             //这里的字段就是表示激活显示窗口,详细到百科搜WINDOWPLACEMENT
fullwnd.rcNormalPosition = rect;   
m_ctrlPlayWnd.SetWindowPlacement(&fullwnd);                   //用控件变量名加上系统自带的函数SetWindowPlacement后面再加上上面的WINDOWPLACEMENT变量就可以了
m_bIsFullScrean=TRUE;                                                          //表示全屏了 TRUE

}
else
{
//计算窗口还原位置
//注释:CRect m_Dlg_IDD;,int m_cx,int m_cy  这些变量是在类内定义的用来保存全屏前的窗口大小,在OnInitDialog里初始化
//int widthx = m_Dlg_IDD.Width();
//int heighty = m_Dlg_IDD.Height();
//m_Dlg_IDD.left = (m_cx - widthx)/2;
//m_Dlg_IDD.right = widthx + m_Dlg_IDD.left;
//m_Dlg_IDD.top = (m_cy - heighty)/2;
//m_Dlg_IDD.bottom = heighty + m_Dlg_IDD.top;

ModifyStyle(0,WS_CAPTION);                               //恢复标题栏  貌似这个函数就是前面加上0就是显示,后面加上0就是消去
ModifyStyleEx(0,WS_EX_DLGMODALFRAME);                    //去掉边框
MoveWindow(&m_Dlg_IDD);                                  //把对话框恢复原大小,但不是原位置,我计算的是屏幕中间,如何会到原位置求大神教我~~~ 根据大神指点已经是源位置了,看看评论
m_ctrlPlayWnd.SetWindowPlacement(&m_Old_Place);          //跟上面一样的操作,控件恢复原大小
m_bIsFullScrean=FALSE;                                        //表示非全屏
} 
ControlBar(m_bIsFullScrean); //这行是全屏时用来隐藏其他控件的末尾有实现代码,因为全屏时其他控件也会留在屏幕上,如何才能不这么麻烦全屏呢?求大神教我~~~
}

下面是OnInitDialog里初始化的东西
//获取播放控件窗口大小位置,
//定义:CRect m_Old_IDC;
//定义:WINDOWPLACEMENT m_Old_Place
m_ctrlPlayWnd.GetClientRect(m_Old_IDC);
m_ctrlPlayWnd.GetWindowPlacement(&m_Old_Place);

//获得原dlg大小位置, 定义CRect m_Dlg_IDD;
GetWindowRect(m_Dlg_IDD);

//电脑屏幕分辨率
m_cx = GetSystemMetrics(SM_CXSCREEN);
m_cy = GetSystemMetrics(SM_CYSCREEN);

//ControlBar函数里面
void CtaskdemoDlg::ControlBar(BOOL bFillscreen)
{
    int bshow = bFillscreen?SW_HIDE:SW_SHOW;
    m_ctrltreechnl.ShowWindow(bshow);

    GetDlgItem(IDC_STATIC_ip)->ShowWindow(bshow);
    GetDlgItem(IDC_STATIC_port)->ShowWindow(bshow);
    GetDlgItem(IDC_STATIC_ID)->ShowWindow(bshow);
    GetDlgItem(IDC_STATIC_pass)->ShowWindow(bshow);
    GetDlgItem(IDC_BUTTON_LOGIN)->ShowWindow(bshow);
    GetDlgItem(IDC_STATIC_frame)->ShowWindow(bshow);
    GetDlgItem(IDC_STATIC_frame2)->ShowWindow(bshow);
    GetDlgItem(IDC_COMBO_PIC)->ShowWindow(bshow);
}

希望对大家有帮助,嘿嘿其实我就是做个笔记自己看

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路途遥远gg

帮到你了就好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值