求教一个关于动态生成子窗口&&按钮的问题

lastrobber 2012-05-28 10:41:51
RT,小弟在做一个单文档的工程,要求根据设置的个数动态创建带有颜色的客户区,并且在每个客户区内动态创建四个按钮。
现在解决了初步的问题,可以动态创建出子窗口,并且可以动态创建出来四个按钮,问题就是,只在第一个子窗口内可以显示,其他的都没有显示。调试了一下午,只能解决到这步了,故求教各位。

下面是我的代码:

if(bIsDraw == true)
{
delete []m_wndUnit; //子窗口指针数组
delete []m_btnUnit; //按钮指针数组
}

CRect rect ;
GetClientRect(rect);

int nTop = rect.top;
int nLeft = rect.left + 20;

int nEquipNum = atoi(m_strEquipNum);
int nRight = rect.right/(nEquipNum) - 20;
int nButtom = rect.bottom/(nEquipNum) - 20;
int nTemp = nRight;
int nbtnNum = 0; //按钮计数

m_wndUnit = new CCreateUnit[nEquipNum]; //nEquipNum为外部传入的客户区数量
m_btnUnit = new CButton[nEquipNum * 4];

for(int i = 0; i < nEquipNum; i++)
{
//画子客户区
CRect rectUnit(nLeft, nTop, nRight, nButtom);
DWORD dwStyle = WS_CHILD | WS_BORDER | WS_TABSTOP | WS_VISIBLE;

m_wndUnit[i].Create( "MFCUnitCtrl" , NULL ,dwStyle , rectUnit , this , NULL ) ;
m_wndUnit[i].ShowWindow( SW_NORMAL ) ;

//在每个客户区生成按钮
CRect rectBtn1(nLeft - 20, nTop, nRight/2 - 20, nButtom/2 - 5);
m_btnUnit[nbtnNum].Create("初始化", WS_VISIBLE|BS_PUSHBUTTON, rectBtn1, &m_wndUnit[i], NULL);
m_btnUnit[nbtnNum].ShowWindow( SW_NORMAL );

CRect rectBtn2(nRight/2, nTop, nRight, nButtom/2 - 5);
m_btnUnit[nbtnNum + 1].Create("运行位置", WS_VISIBLE|BS_PUSHBUTTON, rectBtn2, &m_wndUnit[i], NULL);
m_btnUnit[nbtnNum + 1].ShowWindow( SW_NORMAL );

CRect rectBtn3(nLeft - 20, nButtom/2 + 5, nRight/2 - 20, nButtom);
m_btnUnit[nbtnNum + 2].Create("取样位置", WS_VISIBLE|BS_PUSHBUTTON, rectBtn3, &m_wndUnit[i], NULL);
m_btnUnit[nbtnNum + 2].ShowWindow( SW_NORMAL );

CRect rectBtn4(nRight/2, nButtom/2 + 5, nRight, nButtom);
m_btnUnit[nbtnNum + 3].Create("旁路位置", WS_VISIBLE|BS_PUSHBUTTON, rectBtn4, &m_wndUnit[i], NULL);
m_btnUnit[nbtnNum + 3].ShowWindow( SW_NORMAL );

//变量后续处理
nLeft += nTemp + 20;
nRight += nTemp + 20;
nbtnNum += 4;
}

bIsDraw = true;

RedrawWindow();
...全文
132 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyx100 2012-05-29
  • 打赏
  • 举报
回复
#3楼 得分:0回复于:2012-05-29 09:36:04按钮的父窗口是m_wndUnit, 因此它的坐标应该是用m_wndUnit的客户区坐标

zgl7903 2012-05-29
  • 打赏
  • 举报
回复
试试这样

for(int i = 0; i < nEquipNum; i++)
{
//画子客户区
CRect rectUnit(nLeft, nTop, nRight, nButtom);
rectUnit.OffsetRect(i * (nTemp + 20), 0)
DWORD dwStyle = WS_CHILD | WS_BORDER | WS_TABSTOP | WS_VISIBLE;

m_wndUnit[i].Create( "MFCUnitCtrl" , NULL ,dwStyle , rectUnit , this , NULL ) ;
m_wndUnit[i].ShowWindow( SW_NORMAL ) ;

//在每个客户区生成按钮
CRect rectBtn1(nLeft - 20, nTop, nRight/2 - 20, nButtom/2 - 5);
m_btnUnit[nbtnNum].Create("初始化", WS_VISIBLE|BS_PUSHBUTTON, rectBtn1, &m_wndUnit[i], NULL);
m_btnUnit[nbtnNum].ShowWindow( SW_NORMAL );

CRect rectBtn2(nRight/2, nTop, nRight, nButtom/2 - 5);
m_btnUnit[nbtnNum + 1].Create("运行位置", WS_VISIBLE|BS_PUSHBUTTON, rectBtn2, &m_wndUnit[i], NULL);
m_btnUnit[nbtnNum + 1].ShowWindow( SW_NORMAL );

CRect rectBtn3(nLeft - 20, nButtom/2 + 5, nRight/2 - 20, nButtom);
m_btnUnit[nbtnNum + 2].Create("取样位置", WS_VISIBLE|BS_PUSHBUTTON, rectBtn3, &m_wndUnit[i], NULL);
m_btnUnit[nbtnNum + 2].ShowWindow( SW_NORMAL );

CRect rectBtn4(nRight/2, nButtom/2 + 5, nRight, nButtom);
m_btnUnit[nbtnNum + 3].Create("旁路位置", WS_VISIBLE|BS_PUSHBUTTON, rectBtn4, &m_wndUnit[i], NULL);
m_btnUnit[nbtnNum + 3].ShowWindow( SW_NORMAL );

//变量后续处理
//nLeft += nTemp + 20;
//nRight += nTemp + 20;
nbtnNum += 4;
}

lastrobber 2012-05-29
  • 打赏
  • 举报
回复
我的子客户区的ID都是NULL,都创建成功了,按说不应该是ID的问题,昨天试过了,ID唯一的话也不对
wqze 2012-05-29
  • 打赏
  • 举报
回复
按钮ID的问题?
你为你的按钮 分配不同的ID试验下
为毛打出来的是繁体字
lastrobber 2012-05-29
  • 打赏
  • 举报
回复
我的意思是在每个子客户区生成四个按钮,所以每四个按钮的父窗口都应该是一个子客户区
yyyyy_3 2012-05-29
  • 打赏
  • 举报
回复
m_wndUnit有用吗? 四个按钮的父窗口应该是相同的.
zgl7903 2012-05-29
  • 打赏
  • 举报
回复
按钮的父窗口是m_wndUnit, 因此它的坐标应该是用m_wndUnit的客户区坐标
zgl7903 2012-05-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
m_btnUnit[i].Create("初始化", WS_VISIBLE|BS_PUSHBUTTON, rectBtn1, &m_wndUnit[i], NULL);
m_btnUnit[i].ShowWindow( SW_NORMAL );
[/Quote]
不好意思 看错了 以上回复不算
zgl7903 2012-05-29
  • 打赏
  • 举报
回复
m_btnUnit[i].Create("初始化", WS_VISIBLE|BS_PUSHBUTTON, rectBtn1, &m_wndUnit[i], NULL);
m_btnUnit[i].ShowWindow( SW_NORMAL );


lastrobber 2012-05-29
  • 打赏
  • 举报
回复
这个程序难道错不在此?既然有错误,一定是处理代码有问题的,是吧?
lastrobber 2012-05-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

试试这样
C/C++ code

for(int i = 0; i < nEquipNum; i++)
{
//画子客户区
CRect rectUnit(nLeft, nTop, nRight, nButtom);
rectUnit.OffsetRect(i * (nTemp + 20), 0)
DWORD dwStyle = WS_CHILD | W……
[/Quote]
如果按照你这样的话,客户区的坐标就不会变了,等于重绘了好几次,最后只能绘出一个子客户区来

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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