MFC浮动窗口

MFC窗口创建以及工具条的浮动 在上一篇博客的分析当中,主窗口的创建是在LoadFrame当中完成的。LoadFrame函数主要调用两个函数完成这个工作,第一步向系统注册相应的窗口信息,第二步创建相应的窗口。这正好符合WIN32的窗口创建过程。不过在调用者两个函数之前,LoadFrame会利用相应的资源ID得到窗口的标题,这个资源师string table当中的IDR_MAINFRAME标志的字符串,而主窗口的标题是这个字符串当 阅读详情

使用VS2008+SP1创建悬浮窗口的步骤:

1. 创建悬浮窗口类
每一个悬浮窗口都是一个CDockablePane的派生类的对象, 因此要为每一个悬浮窗口创建一个新类

1.1 添加类
通过菜单Project->Add Class...或者在类视图中工程名字处右键选择Add->Class...添加类
选择MFC Class, 点Add按钮进入下一步
Class name处写入新类的名字, 这里用CDock, 选择Base class为CDockablePane
按Finish按钮, 添加类完成.

1.2 添加消息处理函数
一般至少要处理两个消息, 一个是WM_CREATE, 一个是WM_SIZE, 具体步骤为:
(1) 头文件中添加函数声明(函数名及参数不可写错)
protected:
 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
 afx_msg void OnSize(UINT nType, int cx, int cy);
(2) cpp文件中添加消息映射
BEGIN_MESSAGE_MAP(CDock, CDockablePane)
 ON_WM_CREATE()
 ON_WM_SIZE()
END_MESSAGE_MAP()
这里BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏都是自动生成的, 只需要添加中间两行代码即可
(3) 添加函数实现部分
int CDock::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CDockablePane::OnCreate(lpCreateStruct) == -1)
  return -1;
 // 在这儿创建控件
 return 0;
}
void CDock::OnSize(UINT nType, int cx, int cy)
{
 CDockablePane::OnSize(nType, cx, cy);
 // 这儿添加代码
}

1.3 添加控件
现在创建的CDock类中由于没有任何控件, 因此如果现在创建该类的对象并显示, 该区域中由于全是垃圾数据, 故可能该窗口显示时为花屏. 如果程序运行期间出现类似花屏的问题, 大概会有几种可能性: 1. 没有创建控件 2. 已创建控件, 但控件位置不对或未覆盖整个的dockablePane 3. 控件虽然占据整个区域, 但不能自动刷新
这里以添加一个listBox为例:
(1) 在类的头文件中添加控件对象, 代码为:
protected:
 CListBox _listBox;
(2) 在OnCreate()中添加创建控件窗口的代码:
这里必须要注意, 需要先调用基类的函数OnCreate()
int CDock1::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CDockablePane::OnCreate(lpCreateStruct) == -1)
  return -1;

 // 在这儿创建控件
 // nID为该控件的ID, 可以自行设置, 如果对ID不感兴趣, 也可以选择传递0让系统做处理
 if (!_listBox.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 0, 0), this, nID))
 {
  TRACE0("创建listbox失败");
  return -1;
 }

 return 0;
}
(3) 在OnSize中设置各个控件的位置
这里要注意的是, 需要将控件布满整个窗口. 这里只有一个listBox, 故可以直接用listBox覆盖窗口.
同理, 必须要先调用基类函数CDockablePane::OnSize(nType, cx, cy)
void CDock::OnSize(UINT nType, int cx, int cy)
{
 CDockablePane::OnSize(nType, cx, cy);
 // 这儿添加代码
 if (GetSafeHwnd() == NULL)
 {
  return;
 }

 if (_listBox.GetSafeHwnd() != NULL)
 {
  CRect rectClient;
  GetClientRect(rectClient);
  _listBox.SetWindowPos(NULL, rectClient.left, rectClient.top, rectClient.Width(), rectClient.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
 }

}

 

2. 在程序中添加悬浮窗口对象
上面一步只是给工程添加了一个悬浮窗口类, 但并没生成该类的实例. 这里创建该实例(在CMainFrame类中)

2.1 在主框架类声明中添加对象, 代码为:
protected:  
 CDock m_wndDock;

2.2 创建dockablePane的窗口, 在主框架的OnCreate()函数中
(注: 这里我建议在OnCreate函数中自动生成代码EnableAutoHidePanes(CBRS_ALIGN_ANY)的后面添加)
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 ...
 EnableAutoHidePanes(CBRS_ALIGN_ANY);
 // 利用这里的CBRS_RIGHT来设置最初的窗口停靠的位置, 可以的取值是
 // CBRS_NOALIGN, CBRS_LEFT, CBRS_TOP, CBRS_RIGHT, CBRS_BOTTOM
 DWORD style = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_RIGHT | CBRS_FLOAT_MULTI;
 if (!wndDock1.Create(
  // 该dock窗口的标题(如果可以有的话...)
  _T("Dock1"),
  // 该dock窗口的parent, 设置为this
  this,
  //  窗口的大小, 注意是"悬浮"的情况下的大小, 处于dock状态时大小与该值无关
  CRect(0, 0, 200, 200),
  // 该dock窗口是否有标题, 如果为FALSE, 则第一个字符串参数显示不出来
  TRUE,
  // 该dock窗口的ID值. 注意: 如果希望dock窗口的状态可以保存在注册表中(这样下次启动程序时仍保持该状态),  则该值必须的唯一的
  nID,
  // 
  style))
 {
  return FALSE;
 }
 ...
}

2.3 给悬浮窗口添加icon, 暂时省略.

 

3. 设置窗口悬浮方式, 令窗口悬浮

3.1 设置窗口悬浮位置
这部分代码也应该在MainFrame类的OnCreate函数中, 而且紧跟创建悬浮窗口的后面.
设置悬浮位置只需要调用CDockablePane::EnableDocking即可
 m_wndDock.EnableDocking(CBRS_ALIGN_ANY);
其中, 参数可以是CBRS_ALIGN_TOP, CBRS_ALIGN_RIGHT, CBRS_ALIGN_BOTTOM, CBRS_ALIGN_ANY

3.2 令窗口悬浮
欲使一个CDockablePane对象悬浮, 只需要调用框架类的DockPane函数即可:
 DockPane(&m_wndDock);
但是若有另外一个悬浮窗口的对象需要和m_wndDock在一起显示, 构成一个组(就像VS的资源视力和类视图), 那么第二个悬浮窗口需要使用CDockablePane类的AttchToTabWnd函数, 代码如下:
 DockPane(&m_wndDock);
 CDockablePane *pTabbedBar = NULL;
 m_wndDock2.AttachToTabWnd(&m_wndDock, DM_SHOW, FALSE, &pTabbedBar);

转自:http://hi.baidu.com/zll2117/blog/item/29f697ee44ef9325adafd532.html

MFC基础知识(五)——创建停靠窗口 本文主要介绍:在MFC中创建停靠窗口。 一、创建停靠窗口类 创建后的ObjectWnd.h和ObjectWnd.cpp文件如下: #pragma once #include "afxdockablepane.h" class CObjectWnd : public CDockablePane { public: CObjectWnd(void); ~CObjectWnd(void); 阅读详情

相关推荐

MFC中利用CDockablePane实现悬浮窗

MFC中利用CDockablePane实现悬浮窗

sam的博客 1326

mfc 浮动窗口窗口自动停靠浮动

窗口自动停靠浮动

MFC实现悬浮子窗口(附完整源码)

MFC实现悬浮子窗口(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 736

MFC 悬浮窗口

http://hi.baidu.com/zll2117/blog/item/29f697ee44ef9325adafd532.html 使用VS2008+SP1创建悬浮窗口的步骤: (自己写的文档, 以备以后使用) 1. 创建悬浮窗口类 每一个悬浮窗口都是一个CDockablePane的派生类的对象, 因此要为每一个悬浮窗口创建一个新类 1.1 添加类 通过菜单Pro...

a65783305的博客 832

MFC模拟360悬浮窗加速球窗口

1,目标 实现类似360悬浮窗口这样的效果,当窗口在屏幕边缘时,鼠标移开,就自动向边缘隐藏,鼠标移动上去,就又显示出来。 2,原理 首先是实现圆角或椭圆这种不规则形状的窗口,可以参考另一篇文章: MFC实现不规则窗口  然后需要给没有标题栏的窗口增加拖拽移动的功能,这个就是自己手动发送一个消息,使windows认为鼠标在标题条上 对于

逆枫 -- C++/Qt工程师、创业者 1万+

MFC创建可停靠与浮动窗口

MFC创建可停靠与浮动窗口浮动和可停靠的窗口类似与VS2008  IDE界面里的属性窗口,工程管理窗口,输出窗口等等。研究了好长时间,发现VS2008 SP1版本以及上才有一个叫做CDockablePane的类,可以建立这样的窗口。而且调试了好久才发现使用这个类的话主框架必须是CFrameEx的派生类而不是CFrame。(后者debug会出现莫名的中断)。而且要在stdafx.h下i

学习雷锋好榜样 7144

MFC浮动窗口使用方法和注意事项

转自:http://www.cnblogs.com/gudu0723/archive/2012/09/07/2675233.html 标题:MFC浮动窗口使用方法和注意事项 使用VS2008+SP1创建悬浮窗口的步骤: 1. 创建悬浮窗口类 每一个悬浮窗口都是一个CDockablePane的派生类的对象, 因此要为每一个悬浮窗口创建一个新类 1.1 添加类

Hugoo_Hu 雨夜星空 1579

MFC如何将对话框嵌入浮动窗口

MFC浮动窗口的中创建对话框

qq_19272431的博客 3451

MFC浮动窗口的创建

MFC悬浮窗口的设置

qq_19272431的博客 3224

mfc 浮动窗口

参考。

weixin_45672157的博客 978

窗口-》子窗口,子窗口-》浮动窗口MFC

        一直很羡慕QQ的远程协助的画面,由原来吸附在主画面的窗口点击浮动窗口后,独立了!不知道实现的方法,今天测试在编写让窗口包含子窗口的时候实现了。 让窗口包含子窗口的方法:1、首先要建立一个style为下层窗口,然后取消全部勾勾。 2、在OnInitDialog()中输入 GetWindowRect(rcFrame); //得到主窗口的大小 m_child.

kingdog的专栏 1794

MFC创建浮动工具条

void CControlBar::EnableDocking(DWORD dwDockStyle) { ASSERT((dwDockStyle & ~(CBRS_ALIGN_ANY|CBRS_FLOAT_MULTI)) == 0); // CBRS_SIZE_DYNAMIC toolbar cannot have the CBRS_FLOAT_MULTI style ASSERT(((dw

dayenglish的专栏 3617

浮动抓图的实现

首先,上张刚出炉的抓图程序截图。 新建基于对话框MFC窗口程序,在主窗口上摆上控件。 添加资源,新建IDD_DIALOG1并设置属性。 基于控件资源IDD_DIALOG1,新建类CCoverDlg。CCoverDlg.h代码。 `#pragma once #include “atltypes.h” // CCoverDlg 对话框 class CCoverDlg : public CDialogEx { DECLARE_DYNAMIC(CCoverDlg) public: CCoverDlg(CW

whatfox140的博客 394

vs2013环境下mfc里添加浮动窗口并贴上对话框

1.打开一个MFC工程,新建一个类命名为ControlPane继承于CDockablePane新建好后再ControlPane.h里有class ControlPane : public CDockablePane 2.在MainFrm.h里新建一个ControlPane的对象,m_ControlPane ControlPane m_ControlPane;//创建对象 3.在MainF

pudongdong的博客 3680
上一篇: 一个简单的XML Schema的例子
下一篇: list control的用法
ZXGIS
博客等级 码龄17年 135粉丝 22原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值