界面设计中。不能完成覆盖客户区,只占客户区的一半,要手动放大才占,满怎么办呢?

pleasechangegreat 2008-11-04 02:43:20
void CWorkSpaceBar2::OnSize(UINT nType, int cx, int cy)
{
CBCGPDockingControlBar::OnSize(nType, cx, cy);

// Tab control should cover a whole client area:
m_wndTree.SetWindowPos (NULL, nBorderSize, nBorderSize,
cx - 2 * nBorderSize, cy - 2 * nBorderSize,
SWP_NOACTIVATE | SWP_NOZORDER);
}
这是BCG中的代码,跟mfc差不多。

在线等,哪位高人帮解决下?
...全文
129 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
pleasechangegreat 2008-11-06
  • 打赏
  • 举报
回复
多谢大家啦。还是不行。
photosir 2008-11-06
  • 打赏
  • 举报
回复
用下面的代码试一下
void CWorkSpaceBar2::OnSize(UINT nType, int cx, int cy)
{
CBCGPDockingControlBar::OnSize(nType, cx, cy);
CRect rect;
GetWindowRect(&rect);
ScreenToClient(rect);
rect.DeflateRect(nBorderSize, nBorderSize);
rect.right = rect.left + rect.Width() / 2;
rect.bottom = rect.top + rect.Height() / 2;
m_wndTree.MoveWindow(rect);
}
pleasechangegreat 2008-11-05
  • 打赏
  • 举报
回复
上面兄弟说的不管用啊。还是不变。

下面这段代码是在MAINFORM.cpp中创建一个窗口的。
if (!m_wndWorkSpace2.Create (_T("计算机列表"), this, CRect (0, 0, 200, 200),
TRUE, ID_VIEW_WORKSPACE2,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI))
{
TRACE0("Failed to create Workspace bar 2\n");
return FALSE; // fail to create
}

将窗口移到文档区,就是正中间。
m_wndWorkSpace2.ConvertToTabbedDocument();

下面是m_wndWorkSpace2.cpp中。m_wndTree是CLISTTREE变量。
nt CWorkSpaceBar2::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CBCGPDockingControlBar::OnCreate(lpCreateStruct) == -1)
return -1;

CRect rectDummy;
rectDummy.SetRectEmpty ();
// Create tree windows.
// TODO: create your own tab windows here:
const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | TVS_HASLINES |
TVS_LINESATROOT | TVS_HASBUTTONS;

if (!m_wndTree.Create (dwViewStyle, rectDummy, this, 1))
{
TRACE0("Failed to create workspace view\n");
return -1; // fail to create
}

// Setup trees content:
HTREEITEM hRoot1 = m_wndTree.InsertItem (_T("Root 2"));
m_wndTree.InsertItem (_T("Item 1"), hRoot1);
m_wndTree.InsertItem (_T("Item 2"), hRoot1);

return 0;
}

void CWorkSpaceBar2::OnSize(UINT nType, int cx, int cy)
{
CBCGPDockingControlBar::OnSize(nType, cx, cy);

// Tab control should cover a whole client area:
m_wndTree.SetWindowPos (NULL, nBorderSize, nBorderSize,
cx - 2 * nBorderSize, cy - 2 * nBorderSize,
SWP_NOACTIVATE | SWP_NOZORDER);
}

void CWorkSpaceBar2::OnPaint()
{
CPaintDC dc(this); // device context for painting

CRect rectTree;
m_wndTree.GetWindowRect (rectTree);
ScreenToClient (rectTree);

rectTree.InflateRect (nBorderSize, nBorderSize);
dc.Draw3dRect (rectTree, ::GetSysColor (COLOR_3DSHADOW),
::GetSysColor (COLOR_3DSHADOW));
}

问题就是在正中间的窗口只显示一半,要手动放最大。
哪位高手帮解决下。

谁帮我解决另加100分。
photosir 2008-11-05
  • 打赏
  • 举报
回复
还有一种办法,不要使用传入的cx,cy。直接GetWindowRect,用得到矩形,修改一下参数就可以了
Show_Mike 2008-11-05
  • 打赏
  • 举报
回复
从你贴出的程序来看,可能情况如下:1.问题在nBorderSize的取值上,令其为0,窗口客户区位置在左面左上角;
2.窗口刷新问题:采用invalidate()激发onpaint()/ondraw()消息.
pleasechangegreat 2008-11-05
  • 打赏
  • 举报
回复
顶啊。怎么没人回啊

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧