镂空窗体
VS2010,单文档,基类为CFormView.想在中间的对话框镂空处一个正方体出来,代码如下:
::GetWindowRect(m_hWnd,&m_rect);//镂空
//以下为不加ScreenToClient(&m_rect)
//width = m_rect.Width();//500
//height = m_rect.Height();//484
//int right = m_rect.right;//662
//int left = m_rect.left; //162
//int top = m_rect.top; //43
//int bottom = m_rect.bottom; //527
//以下为加ScreenToClient(&m_rect);坐标
ScreenToClient(&m_rect);
width = m_rect.Width();//500
height = m_rect.Height();//484
int right = m_rect.right;//492
int left = m_rect.left; //-8
int top = m_rect.top; //-50
int bottom = m_rect.bottom; //434
CRgn wndRgn;
//上半部
wndRgn.CreateRectRgn(0,0, m_rect.Width(),m_rect.top+230);//可赋值,这样可少画一个rgnTemp
CRgn rgnTemp; //保存临时region
//左半部
rgnTemp.CreateRectRgn(0,0, m_rect.left+40, m_rect.Height());
wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_OR);
rgnTemp.DeleteObject();
//右半部
rgnTemp.CreateRectRgn(m_rect.Width()-40, 0, m_rect.Width(),m_rect.Height());//有问题!!!
wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_OR);
rgnTemp.DeleteObject();
//下半部
rgnTemp.CreateRectRgn(0, m_rect.Height() - 140, m_rect.Width(),m_rect.Height());
wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_OR);
rgnTemp.DeleteObject();
//SetWindowRgn(static_cast<HRGN>(rgn1.GetSafeHandle()), TRUE);
SetWindowRgn(wndRgn,TRUE);//!!!
wndRgn.DeleteObject();
我现在遇到的问题是
1)窗体可以镂空,但是一拖右边的对话框的边放大,就会出现边缘不见的情况,尺寸大小也有问题。而拖左边则不会出现这种请况。
2)绘制了上半部后,我原来的标题栏那些都受到了影响,都变黑了,也覆盖了我标题栏上的一些按钮。我只是想在正中间镂空,不想影响其它地方。
求解
[解决办法]
"镂空处一个正方体"
镂空指透明?变黑?。。。
干什么用?
[解决办法]
SetWindowRgn?
[解决办法]
你应该把CreateRect放在OnWndMsg的WM_SIZE里面
[解决办法]
这样你试试
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
CRect rc;
GetWindowRect(&rc);
CRgn wndRgn;
wndRgn.CreateRectRgn(0,0, rc.Width(),rc.Height());
CRgn rgnTemp;
rgnTemp.CreateRectRgn(rc.Width()/4, rc.Height()/4, rc.Width()/2,rc.Height()/2);
wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_XOR);
SetWindowRgn(wndRgn,TRUE);
rgnTemp.DeleteObject();
wndRgn.DeleteObject();
}