首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

镂空窗体,该怎么处理

2012-05-15 
镂空窗体VS2010,单文档,基类为CFormView.想在中间的对话框镂空处一个正方体出来,代码如下:::GetWindowRect

镂空窗体
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();
}

热点排行