OnNcCalcSize()函数修改窗口边框宽度没有成功,求帮助!

温柔_ 2014-04-20 10:44:19
环境:win7系统,vs2012,自绘窗口。
现在跟着视频做要利用OnNcCalcSize()改变窗口的边框宽度。


void CMainFrame::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
{
int nCxBorder = ::GetSystemMetrics(SM_CXFRAME);
int nCyBorder = ::GetSystemMetrics(SM_CYFRAME);
lpncsp->rgrc[0].left -= nCxBorder;
lpncsp->rgrc[0].right += nCxBorder;
lpncsp->rgrc[0].top -= nCyBorder;
lpncsp->rgrc[0].bottom += nCyBorder;
CWnd::OnNcCalcSize(bCalcValidRects, lpncsp);
}

函数中的意思是改变窗口边框的宽度为0,可是实际效果却不是这样的。





在调试的过程中发现现在left和top都成了负值了。怎么跟别人做的不一样,还是哪里写错了?
...全文
619 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
麦田IT 2016-05-14
  • 打赏
  • 举报
回复
win7为什么就不行哪?
lx121451 2016-04-11
  • 打赏
  • 举报
回复
我已经知道是哪个视频了都,我以为我写错了呢
温柔_ 2014-04-23
  • 打赏
  • 举报
回复
重新做了好几遍 vs2010 和vc6.0 也都重新做了一遍,发现在win7系统上都存在这个问题。 于是我将各自生成的程式分别放在XP系统上执行。出乎意料,竟然都达到了预期的效果,以上的问题也都消失了。 暂时还想不通为什么在win7上会出现这个问题。 还是谢谢大家的帮助!!
温柔_ 2014-04-22
  • 打赏
  • 举报
回复
引用 7 楼 WUYUAN2011WOAINI 的回复:
应该是属性的问题
可以看看是什么属性出的问题吗?
温柔_ 2014-04-22
  • 打赏
  • 举报
回复
引用 6 楼 schlafenhamster 的回复:
1. 4个点可能不够 改 6个点. 2. view的 style 要 去 WS_BORDER 和 WS_EX_CLIENTEDGE (即 cs. ) vc6 上试过的 , 没问题.
没有试过,我去试试。 我对照别人视频做的,人家使用的vs2003做出来就挺好,我用的2012就不行了。
kuankuan_qiao 2014-04-22
  • 打赏
  • 举报
回复
应该是属性的问题
schlafenhamster 2014-04-22
  • 打赏
  • 举报
回复
1. 4个点可能不够 改 6个点. 2. view的 style 要 去 WS_BORDER 和 WS_EX_CLIENTEDGE (即 cs. ) vc6 上试过的 , 没问题.
温柔_ 2014-04-21
  • 打赏
  • 举报
回复
引用 4 楼 schlafenhamster 的回复:
1. 4个点可能不够 改 6个点.
2. view的 style 要 去 WS_BORDER 和 WS_EX_CLIENTEDGE (即 cs. )


我试了试把CWnd::OnNcCalcSize(bCalcValidRects, lpncsp)函数去掉,执行后是这样的:


只是一旦窗口失去焦点就会变成这样:


加上CWnd::OnNcCalcSize(bCalcValidRects, lpncsp)函数后,不论怎么改都不会有作用;
用spy++查看 窗口信息是这样的:


程序本来初始化大小设置的550x320,。
创建窗口的函数:
BOOL CMyOwnerDrawApp::InitInstance()
{
CWinApp::InitInstance();
CMainFrame* pMainFrame = new CMainFrame();
pMainFrame->CreateEx(0,
_T("MAINFRAME"),
_T("自绘程序"),
WS_POPUPWINDOW | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_THICKFRAME,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL);
m_pMainWnd = pMainFrame;
pMainFrame->CenterWindow();
pMainFrame->ShowWindow(SW_SHOW);
pMainFrame->UpdateWindow();
return TRUE;
}


设计窗口的函数:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
HINSTANCE hInstance = (HINSTANCE)AfxGetInstanceHandle();
ASSERT(hInstance);

WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
BOOL bRet = GetClassInfoEx( hInstance, cs.lpszClass, &wcex);
if (bRet)
{
return TRUE;
}

wcex.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
wcex.lpfnWndProc = AfxWndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = (HICON)::LoadIcon(hInstance, MAKEINTRESOURCE(IDR_MAINFRAME));
wcex.hIconSm = (HICON)::LoadIcon(hInstance, MAKEINTRESOURCE(IDR_MAINFRAME));
wcex.hCursor = ::LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = cs.lpszClass;
bRet = RegisterClassEx(&wcex);
return bRet;
}
温柔_ 2014-04-21
  • 打赏
  • 举报
回复
引用 1 楼 allenhiman 的回复:
这只边框宽度为0? 那干嘛不直接去掉边框风格?
程序愿意是想改边框宽度为2,我只是简化了代码。 先将边框宽度重置为0,然后再+2。 可是这样做,根本没有出现想要的效果。 可能代码写的有错误,我刚学,不是很懂,没能找出哪里出的错。
allenhiman 2014-04-21
  • 打赏
  • 举报
回复
这只边框宽度为0? 那干嘛不直接去掉边框风格?
schlafenhamster 2014-04-21
  • 打赏
  • 举报
回复
1. 4个点可能不够 改 6个点. 2. view的 style 要 去 WS_BORDER 和 WS_EX_CLIENTEDGE (即 cs. )
温柔_ 2014-04-21
  • 打赏
  • 举报
回复
dingding,please dashen help me!

15,978

社区成员

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

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