自绘Dialog的两个有关问题
自绘Dialog的两个问题
我自绘Dialog,在PreSubclassWindow中调用了ModifyStyle(WS_CAPTION,0),之后,标题栏确实没了,但是对话框下面却多出了点,多出的这些该怎么除掉,如果在编辑对话框,右键属性里面去掉Title Bar属性后,运行窗口大小和原来的一样大,而第一种则不一样,下面长处了点,多出的大小等于标题栏的大小,这个问题该如何处理,也就是说想不然他多出这么些个东西,该如何处理呢
------解决方案--------------------
上移是正常的,因为改变窗口风格并不改变窗口坐标和尺寸,当去掉标题和边框之后,变成把客户区调整到原来整个窗口的位置和尺寸,所以看起来所有控件都上移了。可以这样处理:
RECT rt;
GetClientRect(&rt);
ClientToScreen(&rt);
ModifyStyle(WS_CAPTION ¦WS_BORDER, 0, SWP_NOREDRAW);
MoveWindow(&rt);
本篇文章来源于 IT者 | www.itzhe.cn 原文链接:http://www.itzhe.cn/news/20080620/159993.html
------解决方案--------------------
//放OnInitDialog()中就可以:
ModifyStyle(WS_CAPTION,0,SWP_FRAMECHANGED);
------解决方案--------------------
BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//
ModifyStyle(WS_CAPTION,0,SWP_FRAMECHANGED);
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
// 我试过的,完全可以
------解决方案--------------------
//明白了17楼的可以
void CAboutDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CRect rect;
GetClientRect(rect);
ClientToScreen(rect);
rect.InflateRect(2,2);
ModifyStyle(WS_CAPTION,0);//
MoveWindow(rect);
// Do not call CDialog::OnPaint() for painting messages
}
------解决方案--------------------
按常规窗口的话一般这样修改成无边框无标题栏即可:
我自绘Dialog,在PreSubclassWindow中调用了ModifyStyle(WS_CAPTION,0),之后,标题栏确实没了,但是对话框下面却多出了点,多出的这些该怎么除掉,如果在编辑对话框,右键属性里面去掉Title Bar属性后,运行窗口大小和原来的一样大,而第一种则不一样,下面长处了点,多出的大小等于标题栏的大小,这个问题该如何处理,也就是说想不然他多出这么些个东西,该如何处理呢
------解决方案--------------------
上移是正常的,因为改变窗口风格并不改变窗口坐标和尺寸,当去掉标题和边框之后,变成把客户区调整到原来整个窗口的位置和尺寸,所以看起来所有控件都上移了。可以这样处理:
RECT rt;
GetClientRect(&rt);
ClientToScreen(&rt);
ModifyStyle(WS_CAPTION ¦WS_BORDER, 0, SWP_NOREDRAW);
MoveWindow(&rt);
本篇文章来源于 IT者 | www.itzhe.cn 原文链接:http://www.itzhe.cn/news/20080620/159993.html
------解决方案--------------------
//放OnInitDialog()中就可以:
ModifyStyle(WS_CAPTION,0,SWP_FRAMECHANGED);
------解决方案--------------------
BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//
ModifyStyle(WS_CAPTION,0,SWP_FRAMECHANGED);
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
// 我试过的,完全可以
------解决方案--------------------
//明白了17楼的可以
void CAboutDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CRect rect;
GetClientRect(rect);
ClientToScreen(rect);
rect.InflateRect(2,2);
ModifyStyle(WS_CAPTION,0);//
MoveWindow(rect);
// Do not call CDialog::OnPaint() for painting messages
}
------解决方案--------------------
按常规窗口的话一般这样修改成无边框无标题栏即可:
- C/C++ code
ModifyStyle(WS_CAPTION | WS_THICKFRAME, 0, SWP_FRAMECHANGED);
------解决方案--------------------
上面是针对dialog的,更优雅更一般的方法是
- C/C++ code
DWORD dwStyle = GetStyle();//获取旧样式 DWORD dwNewStyle = WS_OVERLAPPED | WS_VISIBLE| WS_SYSMENU |WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_CLIPCHILDREN|WS_CLIPSIBLINGS; dwNewStyle&=dwStyle;//按位与将旧样式去掉 SetWindowLong(m_hWnd,GWL_STYLE,dwNewStyle);//设置成新的样式 DWORD dwExStyle = GetExStyle();//获取旧扩展样式 DWORD dwNewExStyle = WS_EX_LEFT |WS_EX_LTRREADING |WS_EX_RIGHTSCROLLBAR; dwNewExStyle&=dwExStyle;//按位与将旧扩展样式去掉 SetWindowLong(m_hWnd,GWL_EXSTYLE,dwNewExStyle);//设置新的扩展样式 SetWindowPos(NULL,0,0,0,0,SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED);//告诉windows:我的样式改变了,窗口位置和大小保持原来不变!