BCGControlBar之PropSheet使用时的笔记

本文介绍了在使用BCGControlBar的CMyPropertySheet时如何隐藏默认的确定、取消和帮助按钮。通过重写OnInitDialog()和消息映射,解决了回车和ESC键的默认行为。同时,详细说明了如何调整控件的位置,包括改变Toolbar和Tab区域的位置。为实现自绘标题栏,创建了一个静态控件并加载位图,但在切换标签时遇到位图被覆盖的问题,通过隐藏选项卡解决了。最后,实现了通过拖动假标题栏实现窗口移动的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BCGControlBar使用CMyPropertySheet的时候直接生成一个对话框包含一些控件。但是还会添加确定,取消,应用,帮助这几个按钮。跟步调试去看究竟是在哪生成的,看了很久还是没发现是在哪生成的,只好采取其他措施来删掉这几个按钮。


于是,我重写了CMyPropertySheet::OnInitDialog()。通过 GetDlgItem(IDOK)-> ShowWindow(SW_HIDE);来达到隐藏的效果。


但是程序运行后还有个问题,缺省情况下,按回车键会响应OnOk(),按ESC时会响应OnCacel();于是添加消息映射,重写掉这两个方法

ON_BN_CLICKED(IDOK, CMyPropertySheet::OnBnClickedOk)  

于是乎,这个问题就解决了。。


但是还有个问题,,BCG生成的控件大小位置都固定了。


改变左边的Toolbar的位置,可以通过this->m_wndOutlookBar.SetWindowPos(NULL,0,BAROFFSET,0,0,SWP_NOZORDER | SWP_NOSIZE|SWP_NOACTIVATE);

来改变,

而右边的tab区域则可以CTabCtrl *TabWnd =this->GetTabControl();
TabWnd->SetWindowPos(NULL,TABOFFSET,0,0,0,SWP_NOZORDER | SWP_NOSIZE|SWP_NOACTIVATE);

这样就可以随意改变控件的位置。


为了自绘标题栏,于是取消了原本的标题栏自己做个假的,将所有控件都下移一定距离,然后在上面预留的空间中贴位图


CStatic *m_pTile = new CStatic;
CRect rectTile = CRect(0,0,WIDTH,BAROFFSET);
m_pTile->Create(_T("HelloWorld"),WS_CHILD|WS_VISIBLE|SS_BITMAP|SS_CENTERIMAGE,rectTile,this,IDC_TITLE);
//获得位图句柄
m_hBitmap=LoadBitmap(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_BACK));
//设置静态控件的样式,使其可以使用位图,并试位标显示使居中
m_pTile->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);
//设置静态控件显示位图
m_pTile->SetBitmap(m_hBitmap); 


但是问题又出现了,在切换标签的时候,tabctrol的标签会在窗口重绘后再次出现,并且贴的位图就会被选项卡覆盖。

于是直接隐藏选项卡TabWnd->ShowWindow(SW_HIDE);


自绘标题栏的问题解决了,现在要开始实现拖动假标题栏移动,和关闭,最小化,这几个按钮


标题栏移动,可以重写OnNcHitTest(CPoint point) 然后判断点是否在控件上,其实应该自定义控件,自己派生一个控件来使用,这样可以方便很多操作,比如记录控件的RECT。但是我懒得重写了,就直接在对话框的程序里又加了个成员变量来存储控件的rect。

UINT CMyPropertySheet::OnNcHitTest(CPoint point)
{
UINT nHitTest = CWnd::OnNcHitTest(point);
if (nHitTest == HTCLIENT)
{

::ScreenToClient( this->GetSafeHwnd() , &point );
if (m_rectTile.PtInRect(point))
{
nHitTest = HTCAPTION;
}
}
return (nHitTest == HTCAPTION) ? HTCAPTION : nHitTest;
//return CBCGPPropertySheet::OnNcHitTest(point);
}


如果鼠标在假标题栏上 则把他当做是 HTCAPTION 于是就可以完成拖动移动了。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值