VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 2620|回复: 26

[原创] mfc中改变控件的大小和位置

[复制链接]
79_avatar_middle
在线会员 发表于 2016-1-7 20:16:26 | 显示全部楼层 |阅读模式
用CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的大小和位置。
void MoveWindow(int x,int y,int nWidth,int nHeight);
void MoveWindow(LPCRECT lpRect);
第一种用法需给出控件新的坐标和宽度、高度;
第二种用法给出存放位置的CRect对象;
例:
CWnd *pWnd;
pWnd = GetDlgItem( IDC_EDIT1 );    //获取控件指针,IDC_EDIT1为控件ID号
pWnd->MoveWindow( CRect(0,0,100,100) );    //在窗口左上角显示一个宽100、高100的编辑控件

SetWindowPos()函数使用更灵活,多用于只修改控件位置而大小不变或只修改大小而位置不变的情况:
BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);
第一个参数我不会用,一般设为NULL;
x、y控件位置;cx、cy控件宽度和高度;
nFlags常用取值:
SWP_NOZORDER:忽略第一个参数;
SWP_NOMOVE:忽略x、y,维持位置不变;
SWP_NOSIZE:忽略cx、cy,维持大小不变;
例:
CWnd *pWnd;
pWnd = GetDlgItem( IDC_BUTTON1 );    //获取控件指针,IDC_BUTTON1为控件ID号
pWnd->SetWindowPos( NULL,50,80,0,0,SWP_NOZORDER | SWP_NOSIZE );    //把按钮移到窗口的(50,80)处
pWnd = GetDlgItem( IDC_EDIT1 );
pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER | SWP_NOMOVE );    //把编辑控件的大小设为(100,80),位置不变
pWnd = GetDlgItem( IDC_EDIT1 );
pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER );    //编辑控件的大小和位置都改变
以上方法也适用于各种窗口。

SetWindowPos()函数详解:

 SetWindowPos

头文件:

  winuser.h

函数原型:

  BOOL SetWindowPos
  (
  HWND hWnd, //窗口句柄
  HWND hWndInsertAfter, //排列顺序的句柄
  int X, //水平坐标
  int Y, //垂直坐标
  int cx, //宽
  int cy, //高
  UINT uFlags //窗口定位标识
  );

说明:

  这个函数能改变窗口的大小、位置和设置子窗口、弹出窗口或顶层窗口的排列顺序。
  返回值:

  BOOL,如果返回值非零表示成功,返回零表示失败。错误信息请参看GetLastError函数。

参数表:

  参数 类型及说明
  hwnd HWND,欲定位的窗口句柄
  hWndInsertAfter HWND,置于hwnd前面的窗口句柄。这个参数必须是窗口的句柄或是下面的值之一:    HWND_BOTTOM 将窗口置于其它所有窗口的底部
  HWND_NOTOPMOST 将窗口置于其它所有窗口的顶部,并位于任何最顶部窗口的后面。如果这个窗口非顶部窗口,这个标记对该窗口并不产生影响
  HWND_TOP 将窗口置于它所有窗口的顶部
  HWND_TOPMOST 将窗口置于其它所有窗口的顶部,并位于任何最顶部窗口的前面。即使这个窗口不是活动窗口,也维持最顶部状态

x: 
 
  int,指定窗口新的X坐标

Y:  

  int,指定窗口新的Y坐标

cx:  

  int,指定窗口新的宽度

cy:  

  int,指定窗口新的高度

wFlags:

  UINT,指定窗口状态和位置的标记。这个参数使用下面值的组合: SWP_DRAWFRAME 围绕窗口画一个框
  SWP_FRAMECHANGED 发送一条WM_NCCALCSIZE消息进入窗口,即使窗口的大小没有发生改变。如果不指定这个参数,消息WM_NCCALCSIZE只有在窗口大小发生改变时才发送
  SWP_HIDEWINDOW 隐藏窗口
  SWP_NOACTIVATE 不激活窗口
  SWP_NOCOPYBITS 屏蔽客户区域
  SWP_NOMOVE 保持当前位置(X和Y参数将被忽略)
  SWP_NOOWNERZORDER 不改变所有窗口的位置和排列顺序
  SWP_NOREDRAW 窗口不自动重画
  SWP_NOREPOSITION 与SWP_NOOWNERZORDER标记相同
  SWP_NOSENDCHANGING 防止这个窗口接受WM_WINDOWPOSCHANGING消息
  SWP_NOSIZE 保持当前大小(cx和cy会被忽略)
  SWP_NOZORDER 保持窗口在列表的当前位置(hWndInsertAfter将被忽略)
  SWP_SHOWWINDOW 显示窗口
备注:

  如果设置了SWP_SHOWWINDOW或SWP_HIDEWINDOW标记,这个窗口不发生移动或改变大小。窗口成为最顶级窗口后,它的所有子窗口也会进入最顶级。一旦将其设为非最顶级,则它的所有子窗口也会转为非最顶级。

调用这个函数的例子如下:
#001 //
#002 // 响应命令.
#003 // 蔡军生 2007/09/16 QQ:9073204
#004 //
#005 LRESULT CCaiWinMsg::OnCommand(int nID,int nEvent)
#006 {
#007   // 菜单选项命令响应:
#008   switch (nID)
#009   {
#010   case IDC_CREATEBTN:
#011         //显示一个按钮。
#012         if (!m_hBtn)
#013         {
#014                m_hBtn = CreateWindow(_T(“BUTTON”),_T(“按钮”),
#015                    WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON,
#016                    50,50,100,32,
#017                     m_hWnd,(HMENU)IDC_BTN,m_hInstance,NULL);
#018         }                                          
#019         break;
#020   case IDC_BTN:
#021         OutputDebugString(_T(“按钮按下\r\n”));
#022         {
#023               static bool bChangeText = true;
#024               if (bChangeText)
#025               {
#026                    //设置按钮的文字。
#027                    SetWindowText(m_hBtn,_T(“改变它”));
#028
#029                    //改变按钮窗口的位置和大小。
#030                    MoveWindow(m_hBtn,10,10,100,32,TRUE);
#031
#032                   //改变主窗口为最顶端窗口。
#033              SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
#034               }
#035               else
#036               {
#037                    //设置按钮的文字。
#038                    SetWindowText(m_hBtn,_T(“按钮”));
#039
#040                    //改变按钮窗口的位置和大小。
#041                    MoveWindow(m_hBtn,50,50,100,32,TRUE);
#042
#043                   //改变主窗口为普通窗口。
#044              SetWindowPos(m_hWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
#045               }
#046
#047               //每一次都改变。
#048               bChangeText = !bChangeText;
#049         }
#050         break;
#051   default:
#052         return CCaiWin::OnCommand(nID,nEvent);
#053   }
#054
#055   return 1;
#056 }

评分

参与人数 5驿站币 +7 热心值 +7 收起 理由
28_avatar_small 天下 + 1 + 1
65_avatar_small 编程者 + 2 + 2 赞一个!
11_avatar_small 饮水机 + 1 + 1 感谢分享!
16_avatar_small 阳光 + 1 + 1 赞一个!
88_avatar_small 寂寞江湖 + 2 + 2 写 的不错 给我很多启发

查看全部评分





上一篇:MFC中的_T宏
下一篇:想请假大家一个问题?一直不得起解!
75_avatar_middle
在线会员 发表于 2016-1-7 21:01:22 | 显示全部楼层
Set函数吧
以Set开头的函数
17_avatar_middle
在线会员 发表于 2016-1-8 09:18:03 | 显示全部楼层
先看一看。。。。。
82_avatar_middle
在线会员 发表于 2016-1-8 09:46:59 | 显示全部楼层
mfc中改变控件的大小和位置
08_avatar_middle
在线会员 发表于 2016-1-8 10:58:51 | 显示全部楼层
mfc中改变控件的大小和位置
47_avatar_middle
在线会员 发表于 2016-1-8 14:57:20 | 显示全部楼层
简单,easy
47_avatar_middle
在线会员 发表于 2016-1-8 14:59:43 | 显示全部楼层
简单,easy
47_avatar_middle
在线会员 发表于 2016-1-8 15:02:01 | 显示全部楼层
内存泄露
43_avatar_middle
online_vip 发表于 2016-1-8 17:08:15 | 显示全部楼层
SetWindowPos应该可以吧
34_avatar_middle
online_vip 发表于 2016-1-8 22:34:01 | 显示全部楼层
看一看,谢谢。
88_avatar_middle
online_vip 发表于 2016-1-20 17:56:21 | 显示全部楼层
学习i类 谢谢分享
55_avatar_middle
在线会员 发表于 2016-1-24 16:05:24 | 显示全部楼层
看一下,新手学习
96_avatar_middle
在线会员 发表于 2016-1-24 16:43:19 | 显示全部楼层
最近在学正好用到。
22_avatar_middle
在线会员 发表于 2016-1-26 17:34:05 | 显示全部楼层
mfc中改变控件的大小和位置mfc中改变控件的大小和位置mfc中改变控件的大小和位置
04_avatar_middle
在线会员 发表于 2016-1-27 12:35:14 | 显示全部楼层
mfc中改变控件的大小和位置
67_avatar_middle
在线会员 发表于 2016-1-28 12:31:58 | 显示全部楼层
共同学习。。。。
16_avatar_middle
在线会员 发表于 2016-2-6 13:34:46 | 显示全部楼层
mfc中改变控件的大小和位置
41_avatar_middle
在线会员 发表于 2016-2-16 11:57:27 | 显示全部楼层
mfc中改变控件的大小和位置
04_avatar_middle
在线会员 发表于 2016-2-16 12:43:35 | 显示全部楼层
正在找这个,谢谢分享
07_avatar_middle
online_vip 发表于 2016-2-16 15:21:52 | 显示全部楼层
mfc中改变控件的大小和位置
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-8-19 00:21

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表