精华内容
下载资源
问答
  • MFC设置窗口大小位置

    千次阅读 2016-03-18 14:00:44
    MFC设置窗口大小位置

    MFC中设置窗口大小位置



    第一种方法:使用SetWindowPos函数


    CWnd::SetWindowPosBOOL   SetWindowPos(const   CWnd*   pWndInsertAfter,int   x,int   y,int   cx,int   cy,UINT   nFlags);
    返回值如果函数成功,则返回非零值;否则返回0。

    实例:

    SetWindowPos(&wndTopMost, 100, 500, 0, 0,  SWP_NOSIZE /*| SWP_NOMOVE*/);//把窗口放到左下端

    说明   
        调用这个成员函数以改变子窗口、弹出窗口和顶层窗口的大小、位置和Z轴次序。窗口在屏幕上按照它们的Z轴次序排序。在Z轴次序上处于顶端的窗口将程序在所有其它窗口的顶部。子窗口的所有坐标都是客户坐标(相对于父窗口客户区的左上角)。窗口可以被移动到Z轴次序的顶部,既可以通过将pWndInsertAfter参数设为&wndTopMost,并确保没有设置SWP_NOZORDER标志,也可以通过设置窗口的Z轴次序使它位于所有现存的顶层窗口上方。当一个非顶层窗口被设为顶层窗口时,它拥有的窗口也被设为顶层的。它的拥有者不发生变化。如果顶层窗口被重新定位到Z轴次序的底部(&wndBottom)或任何非顶层窗口之后,则它将不再是顶层窗口。当顶层窗口被变为非顶层窗口时,它所有的拥有者和它拥有的所有窗口都被变为非顶层窗口。如果既没有指定SWP_NOACTIVE标志也没有指定SWP_NOZORDER标志(这意味着应用程序要求窗口被同时激活并放入指定的Z轴次序),则pWndInsertAfter参数中指定的值将只在下列环境下适用:l   在pWndInsertAfter参数中既没有指定&wndTopMost也没有指定&wndNoTopMost。   
        这个窗口不是活动窗口。应用程序不能激活一个非活动窗口但同时又不把它带到Z轴次序的顶部。应用程序可以没有任何限制地改变活动窗口的Z轴次序。非顶层窗口可能拥有一个顶层窗口,但是反之则不成立。任何被顶层窗口拥有的窗口(例如对话框)都将自己变为顶层窗口,以确保所有被拥有的窗口位于它们的拥有者上方。在Windows   3.1或更新的版本中,可以将窗口移动到Z轴次序的顶部,并通过设置它们的WS_EX_TOPMOST风格而将之锁定在那里。这种顶层窗口即使在失去活动状态以后也会保持顶层位置。例如,选择WinHelp的Always   On   Top命令会使帮助窗口变为顶层,并且在你返回应用程序之后它还保持可见。要创建一个顶层窗口,应在调用SetWindowPos的时候将pWndInsertAfter参数设为&wndTopMost,或者在创建窗口的时候设置WS_EX_TOPMOST风格。如果Z轴次序中包含了任何具有WS_EX_TOPMOST风格的窗口,则用&wndTopMost移动的窗口将被放到所有非顶层窗口的顶部,但是位于任何顶层窗口的下面。当应用程序激活一个不具有WS_EX_TOPMOST风格的非活动窗口时,该窗口将被移动到所有非顶层窗口的上方,但是位于所有顶层窗口的下方。如果在调用SetWindowPos的时候pWndInsertAfter参数被设为&wndBottom,并且CWnd是一个顶层窗口,则该窗口失去顶层状态(WS_EX_BOTTOM风格被清除),并且系统将窗口放在Z轴次序的底部 。
        
      参数pWndInsertAfter   
      标识了在Z轴次序上位于这个CWnd对象之前的CWnd对象。这个参数可以是指向CWnd对象的指针,也可以是指向下列值的指针:   
       wndBottom       将窗口放在Z轴次序的底部。如果这个CWnd是一个顶层窗口,则窗口将失去它的顶层状态;系统将这个窗口放在其它所有窗口的底部。   
       wndTop       将窗口放在Z轴次序的顶部。   
       wndTopMost       将窗口放在所有非顶层窗口的上面。这个窗口将保持它的顶层位置,即使它失去了活动状态。  
       wndNoTopMost       将窗口重新定位到所有非顶层窗口的顶部(这意味着在所有的顶层窗口之下)。这个标志对那些已经是非顶层窗口的窗口没有作用。有关这个函数以及这些参数的使用规则参见说明部分。   
        
     x指定了窗口左边的新位置。   
     y指定了窗口顶部的新位置。   
     cx指定了窗口的新宽度。   
     cy指定了窗口的新高度。   
        
     nFlags指定了大小和位置选项。这个参数可以是下列值的组合:   
       SWP_DRAWFRAME       围绕窗口画出边框(在创建窗口的时候定义)。   
       SWP_FRAMECHANGED       向窗口发送一条WM_NCCALCSIZE消息,即使窗口的大小不会改变。如果没有指定这个标志,则仅当窗口的大小发生变化时才发送WM_NCCALCSIZE消息。   
       SWP_HIDEWINDOW       隐藏窗口。   
       SWP_NOACTIVATE       不激活窗口。如果没有设置这个标志,则窗口将被激活并移动到顶层或非顶层窗口组(依赖于pWndInsertAfter参数的设置)的顶部。   
       SWP_NOCOPYBITS       废弃这个客户区的内容。如果没有指定这个参数,则客户区的有效内容将被保存,并在窗口的大小或位置改变以后被拷贝回客户区。   
       SWP_NOMOVE      保持当前的位置(忽略x和y参数)。   
       SWP_NOOWNERZORDER       不改变拥有者窗口在Z轴次序上的位置。   
       SWP_NOREDRAW       不重画变化。如果设置了这个标志,则不发生任何种类的变化。这适用于客户区、非客户区(包括标题和滚动条)以及被移动窗口覆盖的父窗口的任何部分。当这个标志被设置的时候,应用程序必须明确地无效或重画要重画的窗口和父窗口的任何部分。   
       SWP_NOREPOSITION       与SWP_NOOWNERZORDER相同。   
       SWP_NOSENDCHANGING       防止窗口接收WM_WINDOWPOSCHANGING消息。   
       SWP_NOSIZE       保持当前的大小(忽略cx和cy参数)。   
       SWP_NOZORDER       保持当前的次序(忽略pWndInsertAfter)。   
       SWP_SHOWWINDOW      显示窗口。


    第二种方法:使用MoveWindow函数

    void   CWnd::MoveWindow(   int   x,   int   y,   int   nWidth,   int   nHeight,   BOOL   bRepaint   =   TRUE   );   
    void   CWnd::MoveWindow(   LPCRECT   lpRect,   BOOL   bRepaint   =   TRUE   );  


    实例:

    MoveWindow(0,0,200,200);


    参数   
       
    x指定了CWnd的左边的新位置。   
        y指定了CWnd的顶部的新位置。   
        nWidth指定了CWnd的新宽度。   
        nHeight指定了CWnd的新高度。   
        bRepaint指定了是否要重画CWnd。如果为TRUE,则CWnd象通常那样在OnPaint消息处理函数中接收到一条WM_PAINT消息。如果这个参数为FALSE,则不会发生任何类型的重画操作。这应用于客户区、非客户区(包括标题条和滚动条)和由于CWnd移动而露出的父窗口的任何部分。当这个参数为FALSE的时候,应用程序必须明确地使CWnd和父窗口中必须重画的部分无效或重画。

     

       lpRectCRect对象或RECT结构,指定了新的大小和位置。说明这个函数改变窗口的位置和大小。对于顶层的CWnd对象,x和y参数是相对于屏幕的左上角的。对于子对象,它们是相对于父窗口客户区的左上角的。   
      MoveWindow函数发送一条WM_GETMINMAXINFO消息。处理这个消息时,CWnd得到一个改变最大和最小的窗口缺省值的机会。如果传递给MoveWindow成员函数的参数超过了这些值,则在WM_GETMINMAXINFO处理函数中可以用最小或最大值来代替这些值。








    展开全文
  • mfc 默认窗口大小和位置是如何设置的 默认窗口大小和位置是如何设置的 窗口最终是由Windows API 函数::CreateWindowEx创建,::CreateWindowEx需要窗口的信息,其中就有位置和大小,这些信息从哪里来?下面就分析一下...

    mfc 默认窗口大小和位置是如何设置的

    默认窗口大小和位置是如何设置的

    窗口最终是由Windows API 函数::CreateWindowEx创建,::CreateWindowEx需要窗口的信息,其中就有位置和大小,这些信息从哪里来?下面就分析一下:

    下面是CFrameWnd中Create函数的声明
    BOOL Create(LPCTSTR lpszClassName,
    LPCTSTR lpszWindowName,
    DWORD dwStyle = WS_OVERLAPPEDWINDOW,
    const RECT& rect = rectDefault,
    CWnd* pParentWnd = NULL, // != NULL for popups
    LPCTSTR lpszMenuName = NULL,
    DWORD dwExStyle = 0,
    CCreateContext* pContext = NULL);

    从onst RECT& rect = rectDefault,这就是窗口位置和大小参数 它有一个默认值,是Windows定义好的。

    我以创建的当文档应用程序Single为例说明 CFrame的Create函数的调用中间无关的函数都删掉了
    CSingleApp::InitInstance() ->CWinApp::ProcessShellCommand ->CDocTemplate::CreateNewFrame ->CFrameWnd::LoadFrame ->CFrameWnd::Create ->CWnd::CreateEx ->::CreateWindowEx
    这一串函数在调用CFrameWnd::Create是得到了窗口的位置和大小

    BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
    {
    if( !CFrameWnd::PreCreateWindow(cs) )
    return FALSE;
    // TODO: Modify the Window class or styles here by modifying
    // the CREATESTRUCT cs

    cs.cx=500;
    cs.cy=500;//修改默认矩形窗口rect的尺寸大小

    cs.x=0;
    cs.y=0;//修改默认窗口的位置

    ‍ return TRUE;
    }

    方法一: 在单文档‍CDonghuaApp::InitInstance()中修改

    BOOL CDonghuaApp::InitInstance()
    {
    AfxEnableControlContainer();

    。。。。。。

    // The one and only window has been initialized, so show and update it.

    HWND hWnd=GetDesktopWindow();//取得桌面窗口的句柄
    GetWindowRect(hWnd,&rect);//设置矩形对象参数
    m_pMainWnd->MoveWindow(rect.left,rect.top,rect.Width()/2,rect.Height()/2,TRUE);//设置框架窗口的显示位置和大小

    m_pMainWnd->ShowWindow(SW_SHOW);
    m_pMainWnd->UpdateWindow();

    return TRUE;
    }

    方法二:在 ‍CMainFrame::OnCreate()中修改

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    return -1;

    // TODO: Add your specialized creation code here
    CWnd *pWnd=GetDesktopWindow();//返回一个桌面窗口指针
    pWnd->GetWindowRect(&rect);//窗口指针指向矩形对象

    this->MoveWindow(rect.left+100,rect.top+100,rect.Width()/2,rect.Height()/2,TRUE);
    // this->MoveWindow(rect.left,rect.top,rect.Width()/2,rect.Height()/2,TRUE);
    // this->MoveWindow(0,0,600,600,TRUE);//设置窗口的位置和大小

    return 0;
    }

    ‍以一个sdi的工程举一个例子:

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    return -1;

    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
    | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
    TRACE0(“Failed to create toolbar/n”);
    return -1; // fail to create
    }

    if (!m_wndStatusBar.Create(this) ||
    !m_wndStatusBar.SetIndicators(indicators,
    sizeof(indicators)/sizeof(UINT)))
    {
    TRACE0(“Failed to create status bar/n”);
    return -1; // fail to create
    }

    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_wndToolBar);

    ::ShowWindow(this->m_hWnd,SW_SHOWMAXIMIZED);//代码在这里

    return 0;

    }
    对于MDI的窗口只要分别在主窗口的OnCreate函数和子窗口的PreCreateWindow函数中添加代码就可以

    或者在App类的InitInstance函数中改变显示主框架的m_nCmdShow参数如下:

    m_nCmdShow = SW_SHOWMAXIMIZED;
    pMainFrame->ShowWindow(m_nCmdShow);

    展开全文
  • mfc根据窗口大小自动调整所有控件大小,自己编的,希望对你有用
  • vs2010 如何设置MFC程序窗口大小

    千次阅读 2013-04-22 13:00:49
    vs2010 如何设置MFC程序窗口大小  在vs2010中建立的MFC单文档程序,无论是在CMainFrame里的PreCreateWindow函数中对cs进行修改,还是使用SetWindowPos或MoveWindow函数,都无法实现对窗口的修改。 现在的状态是...

    vs2010 如何设置MFC程序窗口大小  

    在vs2010中建立的MFC单文档程序,无论是在CMainFrame里的PreCreateWindow函数中对cs进行修改,还是使用SetWindowPos或MoveWindow函数,都无法实现对窗口的修改。 现在的状态是,如果给窗口加上可以调节大小这一style,那么窗口会自动保留上次更改后的大小,如果不加可调,那窗口就会按系统所固定的一个大小进行显示,根本无视我的所有设置,怎么办? BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWndEx::PreCreateWindow(cs) ) return FALSE; // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.cx=500; // cs.cy=500; //这两行完全无视 cs.style = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU ; return TRUE; } 尝试使用MoveWindow(50,50,500,500);与SetWindowPos(NULL, 0, 0, 500, 500, SWP_NOZORDER | SWP_NOMOVE); 却都没有任何效果。

        
    程序在注册表里保留了FRAME上次的状态,包括大小位置以及各工具类窗口的布局等.  解决方法有二,其中第一个简单, 第二更稳妥:  1.)在InitInstance(..)调用CleanState(_T("WorkSpace"));  2.)让MainFrame按它的习惯布局完了再调整大小, 在此之前让MainFrame不显示.关键点: WM_CREATE, WM_WINDOWPOSCHANGING  你可能还会发现FRAME有时候会闪一下, 看着不舒服, 用第二个方法同样管用.



    1  分享到:         
    阅读(1995) |  评论(2) |  转载  (1)  | 举报
    展开全文
  • mfc窗口固定大小

    2012-06-04 23:14:34
    mfc窗口固定大小
  • 禁止MFC改变窗口大小

    2020-07-11 12:45:46
    最简单的方法 不需要写任何代码禁止MFC改变窗口大小,只需要修改对话框外观的Border属性为Dialog Frame。

    最简单的方法

    方法1:

    不需要写任何代码禁止MFC改变窗口大小,只需要修改对话框外观Border属性为Dialog Frame

     

     

    方法2:

        代码实现:

    禁止窗口最大化等按钮
    在CMainFrame类中的PreCreateWindow()函数中添加代码如下:


          BOOL CWndMain::PreCreateWindow(CREATESTRUCT& cs)
      {
      if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE;
      cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
      cs.style &= ~WS_MAXIMIZEBOX; //禁止窗口最大化
      cs.style &= ~WS_MINIMIZEBOX; //禁止窗口最小化
      // cs.style &= ~WS_SYSMENU; //取消Title上的按钮
      cs.style &= ~WS_THICKFRAME;//使窗口不能用鼠标改变大小

     

            cs.cx=500; 

            cs.cy=500;  // 改变窗口大小
      cs.lpszClass = AfxRegisterWndClass(0);
      return TRUE;
      }
     

    展开全文
  • mfc更改窗口大小

    千次阅读 2013-06-27 11:29:11
    //可用于更改窗口大小,位置等 BOOL SetWindowPos( const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags ); 可使用函数2: //可用于更改窗口的位置,大小 void MoveWindow( int x...
  • 转载自:... vs2010 设置MFC程序窗口大小 问:BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {  if(!CFrameWnd::PreCreateWindow(cs))  {  return FALSE;
  • MFC获取窗口大小

    2019-07-27 08:19:06
    //下边两个函数获取的是显示屏幕的大小,但不包括任务栏等区域 int cx = GetSystemMetrics(SM_CXFULLSCREEN); int cy = GetSystemMetrics(SM_CYFULLSCREEN); //下边这两个函数获取的是真正屏幕的大小:屏幕分辨率 ...
  • MFC设置窗口大小位置

    千次阅读 2009-12-06 18:48:00
    窗口可以被移动到Z轴次序的顶部,既可以通过将pWndInsertAfter参数设为&wndTopMost,并确保没有设置SWP_NOZORDER标志,也可以通过设置窗口的Z轴次序使它位于所有现存的顶层窗口上方。当一个非顶层窗口被设为顶层窗口...
  • MFC 设置程序固定窗口大小

    千次阅读 2016-09-20 17:39:35
    在OnInitDialog 初始化函数中, 添加如下语句 ...// 窗口固定大小 ::SetWindowLong(m_hWnd, GWL_STYLE, WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX); WS_MINIMIZEBOX 最小化参数
  • mfc固定窗口大小

    万次阅读 2012-04-20 11:14:23
    有的时候为了美观,我们希望窗口保持自己设定的固定大小。 这时候我们就需要在 MainFrm.cpp 里的PreCreateWindow函数里加上 cs.style=cs.style&(~WS_THICKFRAME); 例如: BOOL CMainFrame::PreCreateWindow...
  • mfc 窗口大小随便变化

    2016-11-08 17:14:00
    mfc 窗口随便变化 内部空间相对大小不变
  • MFC多文档设置窗口大小

    千次阅读 2015-09-28 15:43:39
    在ChildFrm.cpp文件中修改PreCreateWindow函数如下: BOOL CChildFrame::PreCreateWindow...// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或样式 if( !CMDIChildWnd::PreCreateWindow(cs) ) return FALSE;
  • MFC 设置窗口置顶显示

    千次阅读 2019-12-04 14:03:16
    设置置顶显示 ::SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); 取消不置顶显示 ::SetWindowPos(hWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); 下面是更详细的说明: 函数名: ...
  • MFC设置窗口最小尺寸

    2020-01-13 16:10:18
    在对话框上添加事件 WM_GETMINMAXINFO 在生成的函数中,添加如下代码: void CXXDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI) { // TODO: 在此添加消息处理程序代码和/或调用默认值 lpMMI->ptMinTrackSize.x = ...
  • MFC窗口大小及位置设置方式

    千次阅读 2012-02-06 11:30:40
    ...在MFC怎么中设置窗口大小和位置? 2010-9-24 22:11 提问者:ttyyuubb|悬赏分:15|浏览次数:3049次 第一种方法:使用SetWindowPos函数 CWnd::SetWindowPosBOOL
  • MFC 设置窗口背景色

    千次阅读 2015-08-26 10:14:41
    A: OnEraseBkgnd是在窗口大小发生改变等情况下发生的,它将绘制窗口背景;  而OnCtlColor是当窗口的控件需要绘制时发生的,它将绘制窗口的控件。   Q:OnEraseBkgnd、OnPaint、OnCtlColor关系 A: ...
  • MFC根据图片大小设置窗口

    千次阅读 2013-05-05 17:14:59
    之前打算在Doc类中OnOpenDocument()中加载图片后就去设置窗口大小,但是无法正确得到子窗口的句柄。查了一下:子框架和视图被设为Active都发生在OnOpenDocument()或OnNewDocument()后。所以放到View类中重载...
  • WM_SIZE 消息是当窗口大小发生改变后发送的,所以如果要在这个窗口中限制窗口大小的话,你就需要重新计算窗口的大小信息,代码如下: void CMainFrame::OnSize(UINT nType, int cx, int cy) { CFrameWnd::OnSize...
  • WM_SIZE 消息是当窗口大小发生改变后发送的,所以如果要在这个窗口中限制窗口大小的话,你就需要重新计算窗口的大小信息,代码如下: 01 02 03 04 05 06 07 08 09 10 ...
  • 2、VS2013 MFC 对话框控件大小随窗口大小改变而改变详细教程
  • MFC中如何设置窗口的初始大小
  • vs2015,放在OnInitDialog()里面 ...设置置顶显示 ::SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); 取消不置顶显示 ::SetWindowPos(hWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_.
  • MFC设置对话框大小

    2015-10-28 14:18:49
    CRect temprect(0,0,550,400);  CWnd::SetWindowPos(NULL,0,0,temprect.Width(),temprect.Height(),SWP_NOZORDER|SWP_NOMOVE);

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,530
精华内容 11,812
关键字:

mfc如何设置窗口大小