我创建了一个SDI的窗口,
当使用,WS_CAPTION风格时,使用自己的最大化按钮时用ShowWindow(SW_SHOWMAXIMIZED),或者是AfxGetMainWnd()->SendMessage(WM_SYSCOMMAND , SC_MAXIMIZE , 0 );窗口会最大化,但桌面最下面的开始菜单条会显示出来。
可是一但我去掉WS_CAPTION时,用上面两个方法最大化窗口时,窗口就会最大到全屏模式。
不知道这是为什么?难道只要我不使用WS_CAPTION风格,也就是不想有标题栏,就不能使用上面的最大化方法吗?如果用就要重新计算整个桌面除了开始菜单条以外的区域?这怎么算呢?不知道菜单条在哪里,有多高和多宽。
还有一个问题,在一个帖子里有人说,在OnNcCalcSize中可以使caption为0,怎么做呢,如果真能这样好像也能解决我的问题。
请指教。
当使用,WS_CAPTION风格时,使用自己的最大化按钮时用ShowWindow(SW_SHOWMAXIMIZED),或者是AfxGetMainWnd()->SendMessage(WM_SYSCOMMAND , SC_MAXIMIZE , 0 );窗口会最大化,但桌面最下面的开始菜单条会显示出来。
可是一但我去掉WS_CAPTION时,用上面两个方法最大化窗口时,窗口就会最大到全屏模式。
不知道这是为什么?难道只要我不使用WS_CAPTION风格,也就是不想有标题栏,就不能使用上面的最大化方法吗?如果用就要重新计算整个桌面除了开始菜单条以外的区域?这怎么算呢?不知道菜单条在哪里,有多高和多宽。
还有一个问题,在一个帖子里有人说,在OnNcCalcSize中可以使caption为0,怎么做呢,如果真能这样好像也能解决我的问题。
请指教。
或者用OnGetMinMaxInfo来限制maximize?好怪啊,难道MFC自己的最大化按钮不挡taskbar也是这样计算的?60分归你了,能有更进一步的解答,就再加分,谢谢了,我自己刚才是用整个区域减去taskbar的大小来得到这个区域的。
为了实现我在WS_POP没有标题栏样式下,最大化时窗口不会挡住taskbar。我有两个实现的方法,不过都觉得有点别扭。
1。是用 cut9(切瓜玩)的方法得到desktop的工作区域,为窗口加上可调的边框样式,在OnGetMaxMinInfo的消息里进行限制,然后用maximize就OK了。这个问题是要加上可调边框,我又不怎么想要它的边框,当然可以做一些处理,但总是觉得不对劲,好麻烦啊。
2。是在每次maximize前先给窗口加上ws_caption的样式,然后maximize,接着再去掉窗口的ws_caption样式,这样也能实现,不过有点变态。有更好的方法吗?如果能指点一下,会再加分的。
背景是:我有个窗口P,里面有个按钮Button,当用户点Button的时候,我要把窗口挪到
屏幕的靠左边。但是窗口P的大小不调整。同时,创建一个新窗口C,这个新窗口
靠屏幕右边,窗口C的左边和P的右边紧紧的挨着。大致上的效果相当于在Word里头
点help菜单出来一个菜单窗口。 //move this window to top-left corner. 窗口P
RECT rc;
GetWindowRect(&rc);
MoveWindow(0,0,rc.right - rc.left, rc.bottom - rc.top); if (!m_pScanFile)
{
//窗口C
m_pScanFile = new CDlgScanFile();
m_pScanFile->Create(this);
int iRight = rc.right - rc.left; //move scanfile window to top - right corner
//我这儿没考虑taskbar,你替换成你的去掉taskbar的区域
int sx = GetSystemMetrics(SM_CXFULLSCREEN);
int sy = GetSystemMetrics(SM_CYFULLSCREEN); m_pScanFile->MoveWindow(iRight , 0, sx - iRight, sy);
} m_pScanFile->ShowWindow(SW_SHOW);
m_bScanFileShowed = true; m_oLabelScan.SetWindowText("<<");整个方法是这样的了,应该可以了吧?总之,不需要caption,maxmize等等,你MoveWindow就行了啊
void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
// TODO: Add your message handler code here and/or call default
if ( SC_MAXIMIZE == nID)
{
AfxMessageBox(_T("test"));
}// end if
CFrameWnd::OnSysCommand(nID, lParam);
}
wangk(倒之) 哥说的对啊,再谢谢cut9(切瓜玩) 。加分结了。