求助:OnSize的使用问题。

菜鸟向高手学习 2013-11-06 08:33:49
最近有个项目,需要实现两个界面的切换,两个界面的大小不同,我使用了OnSize的处理方式,代码如下:
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CPicApp *pFjApp = (CPicApp*)AfxGetApp();
int SysScreenX = GetSystemMetrics(SM_CXSCREEN);
int SysScreenY = GetSystemMetrics(SM_CYSCREEN); //屏幕的像素
if(pFjApp->ScadaMode==1) //如果等于1,改变窗口
{
MoveWindow(0,84, SysScreenX,SysScreenY-84); //显示方式1
}
else //否则全屏显示
{
MoveWindow(0,0,SysScreenX,SysScreenY); //显示方式2,即全屏显示
}
}
在处理的过程中,如果初始化为全屏显示,再切换到方式1时,没有任何问题,但如果初始化为显示方式1,
再切换到方式2(即全屏)时,不能全屏显示,只是把方式1的屏幕向上移动了,下面空出一片空白。
我也单步跟踪了,像素的获取没有发生变化,感觉这时处理时,MoveWindow不能改变窗口大小,只能改变
位置,就算我把SysScreenY改的很大,也无济于事。
请各位高手给个解决方法,谢谢了!
...全文
125 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
昨夜无风 2013-11-08
  • 打赏
  • 举报
回复
引用 3 楼 caiyong61448 的回复:
回flydreamGG: 利用消息传递,如下: LRESULT CMainFrame::OnChangeMode(WPARAM wParam, LPARAM lParam) { CPicApp *pFjApp = (CPicApp*)AfxGetApp(); pFjApp->ScadaMode = wParam; //OnSize(0, 0, 0); this->PostMessage(WM_SIZE, 0, 0); }
改成: int SysScreenX = GetSystemMetrics(SM_CXSCREEN); int SysScreenY = GetSystemMetrics(SM_CYSCREEN); int SysScreenXY =MAKEWORD(SysScreenX, SysScreenY); this->PostMessage(WM_SIZE, 0, SysScreenXY );
lgxing 2013-11-07
  • 打赏
  • 举报
回复
你这样做就会让size消息死循环,不断的去movewindow 应该置一个标志如果标志有效,将标志去掉 再movewindow
打你屁屁 2013-11-07
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
TO lgxing: 我调试运行时,Onsize的消息不会一直收到,所以应该没有你说的问题。 To ffd2013: 你说的方法和我目前使用的是一样的,还是不能解决这个问题,呵呵,我快打算放弃了
  • 打赏
  • 举报
回复
该程序是一个多文档处理,包含如下代码: BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs // cs.style = WS_POPUP; cs.x = 0; cs.y = 0; cs.cx= 1920;//1024; 1024为正屏,1366为宽屏,现在宽屏用的比较多 cs.cy= 1080;//768; cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW, LoadCursor(NULL, IDC_ARROW), (HBRUSH)GetStockObject(BLACK_BRUSH),AfxGetApp()->LoadIcon(IDR_MAINFRAME)); cs.style = WS_POPUP|WS_DLGFRAME|WS_HSCROLL|WS_VSCROLL|WS_MAXIMIZE; return CMDIFrameWnd::PreCreateWindow(cs); } 试了很多方法,还是不行。。
  • 打赏
  • 举报
回复
我使用了 SetWindowPos(&CWnd::wndTop,0,0,SysScreenX,SysScreenY,SWP_NOZORDER); 和 ShowWindow(SW_SHOWMAXIMIZED); 都不能解决,还是不能全屏,感觉Y轴的长度被限定了
worldy 2013-11-06
  • 打赏
  • 举报
回复
引用 楼主 caiyong61448 的回复:
最近有个项目,需要实现两个界面的切换,两个界面的大小不同,我使用了OnSize的处理方式,代码如下: void CMainFrame::OnSize(UINT nType, int cx, int cy) { CPicApp *pFjApp = (CPicApp*)AfxGetApp(); int SysScreenX = GetSystemMetrics(SM_CXSCREEN); int SysScreenY = GetSystemMetrics(SM_CYSCREEN); //屏幕的像素 if(pFjApp->ScadaMode==1) //如果等于1,改变窗口 { MoveWindow(0,84, SysScreenX,SysScreenY-84); //显示方式1 } else //否则全屏显示 { MoveWindow(0,0,SysScreenX,SysScreenY); //显示方式2,即全屏显示 } } 在处理的过程中,如果初始化为全屏显示,再切换到方式1时,没有任何问题,但如果初始化为显示方式1, 再切换到方式2(即全屏)时,不能全屏显示,只是把方式1的屏幕向上移动了,下面空出一片空白。 我也单步跟踪了,像素的获取没有发生变化,感觉这时处理时,MoveWindow不能改变窗口大小,只能改变 位置,就算我把SysScreenY改的很大,也无济于事。 请各位高手给个解决方法,谢谢了!
SetWindowPos
  • 打赏
  • 举报
回复
在MoveWindow(0,0,SysScreenX,SysScreenY); //显示方式2,即全屏显示 中,如果修改SysScreenX,窗口会发生变化,但SysScreenY的设置不起作用,很奇怪。。。
  • 打赏
  • 举报
回复
回flydreamGG: 利用消息传递,如下: LRESULT CMainFrame::OnChangeMode(WPARAM wParam, LPARAM lParam) { CPicApp *pFjApp = (CPicApp*)AfxGetApp(); pFjApp->ScadaMode = wParam; //OnSize(0, 0, 0); this->PostMessage(WM_SIZE, 0, 0); }
昨夜无风 2013-11-06
  • 打赏
  • 举报
回复
你是怎么切换的?
  • 打赏
  • 举报
回复
在线等,谢谢各位高手!

15,978

社区成员

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

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