`
huozheleisi
  • 浏览: 1234251 次
文章分类
社区版块
存档分类
最新评论

用按钮调整工作区的大小

 
阅读更多

现在很多软件都采用按钮调整工作区大小,使用起来十分方便,这里我自己设计了一个示例程序,与大家共享。

实现思路是:当我们单击按钮时,在按钮的单击响应函数中修改控件的位置和大小,从而达到调整的目的(如图所示),所以实现这个功能的核心是调节控件的位置和大小。


图1


图2

这里我采用了CWnd类的SetWindowPos()函数,使用该函数之前必须先获得控件的指针,我使用GetDlgItem()来做到这一点。两个函数的原型如下:

CWnd* GetDlgItem(int nID)const;

返回值:指向给定控件或子窗口的指针;

参数:nID为控件或子窗口的ID值。

BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);

功能:改变窗口的大小、位置和Z次序;

参数:

第一个参数是改变窗口的Z次序,这里不用,可设为NULL;

x、y:窗口新位置;cx、cy:窗口新宽度和高度;

nFlags常用取值:

SWP_NOZORDER:忽略第一个参数;

SWP_NOMOVE:忽略x、y,维持位置不变,在只调整大小时使用;

SWP_NOSIZE:忽略cx、cy,维持大小不变,在只调整位置时使用;

这样,当需要重新设定某控件位置时,可采用:

CWnd*pWnd;//窗口指针,用于指向控件
pWnd=GetDlgItem(IDC_EDIT1);//获取控件指针,IDC_EDIT1为控件ID号
pWnd->SetWindowPos(NULL,x,y,0,0,SWP_NOZORDER|SWP_NOSIZE);//把控件移到窗口的(x,y)处,大小不变

当需要重新设定某控件大小时,可采用:

pWnd=GetDlgItem(IDC_EDIT1);
pWnd->SetWindowPos(NULL,0,0,cx,cy,SWP_NOZORDER|SWP_NOMOVE);//把控件的大小改为(cx,cy),位置不变

当采用:

pWnd=GetDlgItem(IDC_EDIT1);
pWnd->SetWindowPos(NULL,x,y,cx,cy,SWP_NOZORDER);

则控件的大小和位置都会改变。

我制作了一个基于对话框的示例程序,在对话框中,我放置了一个编辑控件(IDC_EDIT1)作为工作区,四个按钮控件放在编辑控件四周(如图1),按钮采用了自画的CPluckButton按钮。按钮的位置是通过计算设置的,所以在放置时只需把大小调整合适,位置可以随意放置。在编辑控件周围画了一个深颜色的圆角矩形背景把编辑控件与按钮整合在一起。当单击按钮控件时,我用上述方法调整编辑控件的大小和位置,同时调整按钮的位置并重画背景,这样工作区就得到调整。

在程序中,我设定了一组常量表示当前工作区的状态:

#defineWS_NORMAL0
#defineWS_LEFT1
#defineWS_LEFT_UP2
#defineWS_LEFT_UP_RIGHT3
#defineWS_LEFT_UP_RIGHT_DOWN4
#defineWS_LEFT_DOWN5
#defineWS_LEFT_RIGHT_DOWN6
#defineWS_LEFT_UP_DOWN7
#defineWS_LEFT_RIGHT8
#defineWS_UP9
#defineWS_UP_RIGHT10
#defineWS_UP_RIGHT_DOWN11
#defineWS_UP_DOWN12
#defineWS_RIGHT13
#defineWS_RIGHT_DOWN14
#defineWS_DOWN15

WS_NORMAL表示工作区为最初的正常状态(如图1),WS_LEFT表示工作区向左伸展,其余类推。(例如图2的工作区状态为WS_UP_RIGHT)。

另外,我定义了一个CRect数组m_Rect[16],存放编辑控件在不同状态下的位置,用一个变量m_start表示工作区的当前状态。数组值在初始化函数OnInitDialog()中计算出来:

BOOLCPluckBoxDlg::OnInitDialog()
{
CDialog::OnInitDialog();

…………

m_start=WS_NORMAL;//窗口初始状态(正常)

CWnd*pWnd=GetDlgItem(IDC_EDIT1);//求编辑框尺寸和正常时的位置
pWnd->GetWindowRect(&m_Rect[WS_NORMAL]);
ScreenToClient(&m_Rect[WS_NORMAL]);

CRectm_ClientRect;
this->GetClientRect(&m_ClientRect);//获取客户区尺寸

//求各状态下工作区坐标:
//工作区向左伸展
m_Rect[WS_LEFT].SetRect(8,m_Rect[WS_NORMAL].top,
m_Rect[WS_NORMAL].right,m_Rect[WS_NORMAL].bottom);
//工作区向左、向上伸展
m_Rect[WS_LEFT_UP].SetRect(8,8,
m_Rect[WS_NORMAL].right,m_Rect[WS_NORMAL].bottom);
//工作区向左、向上、向右伸展
m_Rect[WS_LEFT_UP_RIGHT].SetRect(8,8,
m_ClientRect.right-8,m_Rect[WS_NORMAL].bottom);
//工作区向四周伸展
m_Rect[WS_LEFT_UP_RIGHT_DOWN].SetRect(8,8,
m_ClientRect.right-8,m_ClientRect.bottom-8);
//工作区向下伸展
m_Rect[WS_LEFT_DOWN].SetRect(8,m_Rect[WS_NORMAL].top,
m_Rect[WS_NORMAL].right,m_ClientRect.bottom-8);
//工作区向下、向右伸展
m_Rect[WS_LEFT_RIGHT_DOWN].SetRect(8,m_Rect[WS_NORMAL].top,
m_ClientRect.right-8,m_ClientRect.bottom-8);
//工作区向下、向左、向右伸展
m_Rect[WS_LEFT_UP_DOWN].SetRect(8,8,
m_Rect[WS_NORMAL].right,m_ClientRect.bottom-8);
//工作区向左、向右伸展
m_Rect[WS_LEFT_RIGHT].SetRect(8,m_Rect[WS_NORMAL].top,
m_ClientRect.right-8,m_Rect[WS_NORMAL].bottom);
//工作区向上伸展
m_Rect[WS_UP].SetRect(m_Rect[WS_NORMAL].left,8,
m_Rect[WS_NORMAL].right,m_Rect[WS_NORMAL].bottom);
//工作区向上、向右伸展
m_Rect[WS_UP_RIGHT].SetRect(m_Rect[WS_NORMAL].left,8,
m_ClientRect.right-8,m_Rect[WS_NORMAL].bottom);
//工作区向上、向右、向下伸展
m_Rect[WS_UP_RIGHT_DOWN].SetRect(m_Rect[WS_NORMAL].left,8,
m_ClientRect.right-8,m_ClientRect.bottom-8);
//工作区向上、向下伸展
m_Rect[WS_UP_DOWN].SetRect(m_Rect[WS_NORMAL].left,8,
m_Rect[WS_NORMAL].right,m_ClientRect.bottom-8);
//工作区向右伸展
m_Rect[WS_RIGHT].SetRect(m_Rect[WS_NORMAL].left,m_Rect[WS_NORMAL].top,
m_ClientRect.right-8,m_Rect[WS_NORMAL].bottom);
//工作区向右、向下伸展
m_Rect[WS_RIGHT_DOWN].SetRect(m_Rect[WS_NORMAL].left,m_Rect[WS_NORMAL].top,
m_ClientRect.right-8,m_ClientRect.bottom-8);
//工作区向下伸展
m_Rect[WS_DOWN].SetRect(m_Rect[WS_NORMAL].left,m_Rect[WS_NORMAL].top,
m_Rect[WS_NORMAL].right,m_ClientRect.bottom-8);

returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}

在函数OnPaint()中,根据工作区状态调整编辑控件和按钮的位置:

voidCPluckBoxDlg::OnPaint()
{
CPaintDCdc(this);//devicecontextforpainting

…………

DrawWorkings(&dc);//绘制工作区
}

其中DrawWorkings()函数为:

voidCPluckBoxDlg::DrawWorkings(CPaintDC*pdc)
{
CWnd*pWnd=GetDlgItem(IDC_EDIT1);//调整编辑框位置
pWnd->SetWindowPos(NULL,m_Rect[m_start].left,m_Rect[m_start].top,
m_Rect[m_start].Width(),m_Rect[m_start].Height(),SWP_NOZORDER);

CBrushBrush;//画深色边框
Brush.CreateSolidBrush(RGB(97,120,140));
pdc->SelectObject(&Brush);
pdc->RoundRect(m_Rect[m_start].left-9,m_Rect[m_start].top-9,
m_Rect[m_start].right+9,m_Rect[m_start].bottom+9,10,10);

//以下根据编辑框坐标调整各按钮位置
pWnd=GetDlgItem(IDC_BUTTONLEFT);//调整左边按钮位置
pWnd->SetWindowPos(NULL,m_Rect[m_start].left-9,
m_Rect[m_start].CenterPoint().y-30,0,0,SWP_NOSIZE|SWP_NOZORDER);
pWnd=GetDlgItem(IDC_BUTTONUP);//调整上边按钮位置
pWnd->SetWindowPos(NULL,m_Rect[m_start].CenterPoint().x-30,
m_Rect[m_start].top-9,0,0,SWP_NOSIZE|SWP_NOZORDER);
pWnd=GetDlgItem(IDC_BUTTONRIGHT);//调整右边按钮位置
pWnd->SetWindowPos(NULL,m_Rect[m_start].right,
m_Rect[m_start].CenterPoint().y-30,0,0,SWP_NOSIZE|SWP_NOZORDER);
pWnd=GetDlgItem(IDC_BUTTONDOWN);//调整下边按钮位置
pWnd->SetWindowPos(NULL,m_Rect[m_start].CenterPoint().x-30,
m_Rect[m_start].bottom,0,0,SWP_NOSIZE|SWP_NOZORDER);
}

OnPaint()函数在初建对话框和用Invalidate()函数刷新对话框时自动执行,所以在单击按钮时,先根据当前状态调整出新状态,再重绘对话框即可。

以下为按钮的单击响应函数:

//单击下边按钮

voidCPluckBoxDlg::OnButtondown()
{
switch(m_start)//更改位置
{
caseWS_NORMAL:m_start=WS_DOWN;break;
caseWS_LEFT:m_start=WS_LEFT_DOWN;break;
caseWS_LEFT_UP:m_start=WS_LEFT_UP_DOWN;break;
caseWS_LEFT_UP_RIGHT:m_start=WS_LEFT_UP_RIGHT_DOWN;break;
caseWS_LEFT_UP_RIGHT_DOWN:m_start=WS_LEFT_UP_RIGHT;break;
caseWS_LEFT_DOWN:m_start=WS_LEFT;break;
caseWS_LEFT_RIGHT_DOWN:m_start=WS_LEFT_RIGHT;break;
caseWS_LEFT_UP_DOWN:m_start=WS_LEFT_UP;break;
caseWS_LEFT_RIGHT:m_start=WS_LEFT_RIGHT_DOWN;break;
caseWS_UP:m_start=WS_UP_DOWN;break;
caseWS_UP_RIGHT:m_start=WS_UP_RIGHT_DOWN;break;
caseWS_UP_RIGHT_DOWN:m_start=WS_UP_RIGHT;break;
caseWS_UP_DOWN:m_start=WS_UP;break;
caseWS_RIGHT:m_start=WS_RIGHT_DOWN;break;
caseWS_RIGHT_DOWN:m_start=WS_RIGHT;break;
caseWS_DOWN:m_start=WS_NORMAL;break;
}
Invalidate();//重绘对话框
}

//单击左边按钮

voidCPluckBoxDlg::OnButtonleft()
{
switch(m_start)
{
caseWS_NORMAL:m_start=WS_LEFT;break;
caseWS_LEFT:m_start=WS_NORMAL;break;
caseWS_LEFT_UP:m_start=WS_UP;break;
caseWS_LEFT_UP_RIGHT:m_start=WS_UP_RIGHT;break;
caseWS_LEFT_UP_RIGHT_DOWN:m_start=WS_UP_RIGHT_DOWN;break;
caseWS_LEFT_DOWN:m_start=WS_DOWN;break;
caseWS_LEFT_RIGHT_DOWN:m_start=WS_RIGHT_DOWN;break;
caseWS_LEFT_UP_DOWN:m_start=WS_UP_DOWN;break;
caseWS_LEFT_RIGHT:m_start=WS_RIGHT;break;
caseWS_UP:m_start=WS_LEFT_UP;break;
caseWS_UP_RIGHT:m_start=WS_LEFT_UP_RIGHT;break;
caseWS_UP_RIGHT_DOWN:m_start=WS_LEFT_UP_RIGHT_DOWN;break;
caseWS_UP_DOWN:m_start=WS_LEFT_UP_DOWN;break;
caseWS_RIGHT:m_start=WS_LEFT_RIGHT;break;
caseWS_RIGHT_DOWN:m_start=WS_LEFT_RIGHT_DOWN;break;
caseWS_DOWN:m_start=WS_LEFT_DOWN;break;
}
Invalidate();
}

//单击右边按钮

voidCPluckBoxDlg::OnButtonright()
{
switch(m_start)
{
caseWS_NORMAL:m_start=WS_RIGHT;break;
caseWS_LEFT:m_start=WS_LEFT_RIGHT;break;
caseWS_LEFT_UP:m_start=WS_LEFT_UP_RIGHT;break;
caseWS_LEFT_UP_RIGHT:m_start=WS_LEFT_UP;break;
caseWS_LEFT_UP_RIGHT_DOWN:m_start=WS_LEFT_UP_DOWN;break;
caseWS_LEFT_DOWN:m_start=WS_LEFT_RIGHT_DOWN;break;
caseWS_LEFT_RIGHT_DOWN:m_start=WS_LEFT_DOWN;break;
caseWS_LEFT_UP_DOWN:m_start=WS_LEFT_UP_RIGHT_DOWN;break;
caseWS_LEFT_RIGHT:m_start=WS_LEFT;break;
caseWS_UP:m_start=WS_UP_RIGHT;break;
caseWS_UP_RIGHT:m_start=WS_UP;break;
caseWS_UP_RIGHT_DOWN:m_start=WS_UP_DOWN;break;
caseWS_UP_DOWN:m_start=WS_UP_RIGHT_DOWN;break;
caseWS_RIGHT:m_start=WS_NORMAL;break;
caseWS_RIGHT_DOWN:m_start=WS_DOWN;break;
caseWS_DOWN:m_start=WS_RIGHT_DOWN;break;
}
Invalidate();
}

//单击上边按钮

voidCPluckBoxDlg::OnButtonup()
{
switch(m_start)
{
caseWS_NORMAL:m_start=WS_UP;break;
caseWS_LEFT:m_start=WS_LEFT_UP;break;
caseWS_LEFT_UP:m_start=WS_LEFT;break;
caseWS_LEFT_UP_RIGHT:m_start=WS_LEFT_RIGHT;break;
caseWS_LEFT_UP_RIGHT_DOWN:m_start=WS_LEFT_RIGHT_DOWN;break;
caseWS_LEFT_DOWN:m_start=WS_LEFT_UP_DOWN;break;
caseWS_LEFT_RIGHT_DOWN:m_start=WS_LEFT_UP_RIGHT_DOWN;break;
caseWS_LEFT_UP_DOWN:m_start=WS_LEFT_DOWN;break;
caseWS_LEFT_RIGHT:m_start=WS_LEFT_UP_RIGHT;break;
caseWS_UP:m_start=WS_NORMAL;break;
caseWS_UP_RIGHT:m_start=WS_RIGHT;break;
caseWS_UP_RIGHT_DOWN:m_start=WS_RIGHT_DOWN;break;
caseWS_UP_DOWN:m_start=WS_DOWN;break;
caseWS_RIGHT:m_start=WS_UP_RIGHT;break;
caseWS_RIGHT_DOWN:m_start=WS_UP_RIGHT_DOWN;break;
caseWS_DOWN:m_start=WS_UP_DOWN;break;
}
Invalidate();
}

完整代码参见示例程序。

本文所用MFC函数速查:

CBrush::CreateSolidBrush
CDC::RoundRect
CDC::SelectObject
CRect::SetRect
CWnd::GetClientRect
CWnd::GetDlgItem
CWnd::GetWindowRect
CWnd::Invalidate
CWnd::ScreenToClient
CWnd::SetWindowPos

http://221.199.150.103/jsj/Html/vc/wen/vcwen06.htm

分享到:
评论

相关推荐

    用按钮调整工作区大小

    可以用按钮来调整工作区的大小,各个方向。

    VC++ 用按钮推拉展开工作区的大小

     ①在对话框中放置一个按钮控件,清除其文本,把形状调整为细条状;  ②为按钮定义变量,类型改为CPluckButton;  ③在对话框的OnInitDialog()函数中用SetPluckButStyle()函数设置按钮初始风格。

    105个常用宏.xlsm

    将A列最后数据行以上的所有B列图片大小调整为所在单元大小 将所选区域文本插入新建文本框 批量插入地址批注 批量插入统一批注 不连续区域插入当前文件名和表名及地址 不连续区域录入当前单元地址 连续区域录入当前...

    drag-sizeable-gui:这是一个gui,可以使用按钮完全调整大小并移动。阅读自述文件以获取更多信息

    拖动大小的图形用户界面 这是一个gui,可以使用按钮完全调整大小并移动。 将rbxm拖到工作区中 要将内容放入ui的中间,请进入:/ drag-gui / Drag / Works /(//在此处放置UI) 由lrd14

    Excel VBA实用技巧大全 附书源码

    04162自动调整工作表全部单元格的大小 04163设置单元格的大小(以磅为单位) 04164设置单元格的大小(以cm为单位) 04165设置单元格的大小(以in为单位) 04166锁定单元格、解除单元格锁定 04167隐藏单元格的公式 ...

    QListWidget控件应用示例

    有一个splitter,运行时可以分割调整两个组件的大小。 创建Actions,用Actions设计主工具栏,用Action关联QToolButton按钮。 使用QTooIButton按钮,设置与Action关联,设计具有下拉菜单功能的ToolButton按钮, 在主...

    VBA常用技巧

    技巧92移除工作表的最小最大化和关闭按钮216 技巧93在工具栏上添加下拉列表框217 技巧94屏蔽工作表的复制功能219 技巧95禁用工具栏的自定义220 技巧96屏蔽所有的命令栏223 技巧97恢复Excel的命令栏224 第8章控件与...

    TXT;JAR;UMD手机书阅读器

    15.支持使用窗口分割条来动态调整工作区和阅读区的窗口大小; 16.在鼠标按钮的默认设置模式下:用鼠标左键点击窗口分割条上的箭头按钮,支持窗口分割条快速伸缩;用鼠标右键点击窗口分割条上的箭头按钮,支持调整...

    MooBook-魔书(手机书PC阅读器) V0.0.0.9Beta

    15.支持使用窗口分割条来动态调整工作区和阅读区的窗口大小; 16.在鼠标按钮的默认设置模式下:用鼠标左键点击窗口分割条上的箭头按钮,支持窗口分割条快速伸缩;用鼠标右键点击窗口分割条上的箭头按钮,支持调整...

    VBA编程技巧大全

    技巧92 移除工作表的最小最大化和关闭按钮 218 技巧93 在工具栏上添加下拉列表框 219 技巧94 屏蔽工作表的复制功能 221 技巧95 禁用工具栏的自定义 222 技巧96 屏蔽所有的命令栏 225 技巧97 恢复Excel的命令栏 226 ...

    MooBook-魔书(手机书阅读器) V0.0.0.9Beta

    15.支持使用窗口分割条来动态调整工作区和阅读区的窗口大小; 16.在鼠标按钮的默认设置模式下:用鼠标左键点击窗口分割条上的箭头按钮,支持窗口分割条快速伸缩;用鼠标右键点击窗口分割条上的箭头按钮,支持调整...

    软件界面设计工具_3款合集

    这样,设计者在调整控件大小或者位置时(包括控件与控件,控件与窗体边缘等的距离等情况),工作变得很简单。 图六、使用UIDesigner制作原型—自动对齐功能  第三步:几分钟后,所有的控件都放到窗体并设置好...

    魔书手机书阅读器(在PC上打开手机电子书)

    15.支持使用窗口分割条来动态调整工作区和阅读区的窗口大小; 16.在鼠标按钮的默认设置模式下:用鼠标左键点击窗口分割条上的箭头按钮,支持窗口分割条快速伸缩;用鼠标右键点击窗口分割条上的箭头按钮,支持调整...

    resize

    RESIZE 应用允许 DefWindowProc() 来处理消息, 但然后检查以确定是否将鼠标置于某个在工作区或调整转角。 为了简化调整操作, RESIZE 不让调整从窗口角, 以便 HTTOPRIGHT 点击测试代码并返回 HTBOTTOM 或 HTTOP 替代...

    Excel抽奖程序(春节抽奖)

    4、一般地,修改《抽奖》工作表布局可以通过调整第一行的行高或第一列的列宽来实现。如果你要对控件进行详细布局设计(例如改变控件大 小),你可以通过控件设计模式来实现。具体方法:“视图”-“工具栏”-“退出...

    VFP数据库系统Visual-FoxPro常用的表单控件.pdf

    第十章 常用的表单控件 VFP在面向对象开发环境中,是通过在表 单上放置控件来完成信息的输入设计工作的。 在设计表单时可以使用两类控件:与表中数据 捆绑的控件和不与数据捆绑的控件。所谓捆绑 控件是指当输入或...

    ppt2010培训教程.docx

    窗口控制按钮标题栏窗口控制菜单图标选项卡 窗口控制按钮 标题栏 窗口控制菜单图标 选项卡 快速访问工具栏幻灯片、大纲选项卡功能区 快速访问 工具栏 幻灯片、大纲 选项卡 功能区 备注窗格状态栏工作区 备注窗格 ...

    用EXCEL套打表格

    启动Excel 2003,单击菜单栏的“格式/工作表/背景…”,打开工作表背景对话框,找到刚才保存的表格图像,设定为背景。单击工具栏上显示比例的下拉列表框,在框中直接输入105后回车,把显示比例设定为105%。 注意:...

    TinyMCE 4.7.13.zip

    TinyMCE是一个轻量级的基于浏览器的所见即所得编辑器,由JS写成,它...修正了在调整某些表格大小时未正确更新样式的问题;从默认菜单配置添加缺少的代码菜单项;添加新的对齐按钮,将单独的对齐按钮组合到菜单按钮中。

Global site tag (gtag.js) - Google Analytics