如何做出精美的ppt用VS2010的MFC做出比较精美...

VS2010&MFC制作悬浮窗口
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 _listB&
(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)&
if (_listBox.GetSafeHwnd() != NULL)&
CRect rectC&
GetClientRect(rectClient);&
_listBox.SetWindowPos(NULL, rectClient.left, rectClient.top,
rectClient.Width(), rectClient.Height(), SWP_NOACTIVATE |
SWP_NOZORDER);&}
2. 在程序中添加悬浮窗口对象&上面一步只是给工程添加了一个悬浮窗口类, 但并没生成该类的实例.
这里创建该实例(在CMainFrame类中)
2.1 在主框架类声明中添加对象, 代码为:&
protected:&CDock m_wndD
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&
// 窗口的大小, 注意是"悬浮"的情况下的大小, 处于dock状态时大小与该值无关&
CRect(0, 0, 200, 200),&
// 该dock窗口是否有标题, 如果为FALSE, 则第一个字符串参数显示不出来&
// 该dock窗口的ID值. 注意: 如果希望dock窗口的状态可以保存在注册表中(这样下次启动程序时仍保持该状态),
则该值必须的唯一的&
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);
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(9807)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'VS2010 MFC窗体的大小设置',
blogAbstract:'1.单文档窗体大小的设置。\r\n在CxxxApp中的InitInstance中加入如下代码:\r\nm_pMainWnd-&SetWindowPos(NULL,0,0,950,680,SWP_NOMOVE);& //此句为添加代码,用于改变窗体的大小\r\n&m_pMainWnd-&ShowWindow(SW_SHOW);&m_pMainWnd-&UpdateWindow();&// 仅当具有后缀时才调用 DragAcceptFiles&//& 在 SDI 应用程序中,这应在 ProcessShellCommand 之后发生&return TRUE;\r\n&\r\n2.对话框窗体大小的设置。\r\n',
blogTag:'对话框,窗体,大小,mfc',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:8,
publishTime:4,
permalink:'blog/static/',
commentCount:1,
mainCommentCount:1,
recommendCount:2,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'-1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

参考资料

 

随机推荐