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 于是就可以完成拖动移动了。