请问如何在绘制的矩形框中输入文字?

xunledelang 2010-04-19 07:49:15

请问我如何在按下不同的按钮后,显示相同框架(包括对话框最大化、按钮整齐排列到两侧、有输入标题的矩形,还有一个矩形框)的对话框,并且能够改变标题的文字?(按不同的按钮,我是根据窗口重绘的方式得到,具体代码如下)

void CTestUIDlg::OnPaint()
{
DlgParamInit();
//绘制按钮的文字;
}
BOOL CTestUIDlg::DlgParamInit()
{
GetClientRect(ClientRect);//得到客户区坐标

m_Step = (ClientRect.bottom-ClientRect.top)/10.0;
CRect ButtonRect(0,0,INT(2*m_Step),int(m_Step));

TitleRect.top = int(0.25*ButtonRect.Height());
TitleRect.bottom = int(1.75*ButtonRect.Height());
TitleRect.left = ButtonRect.Height();
TitleRect.right = ClientRect.right - ButtonRect.Height();

TextRect.top = 2*ButtonRect.Height();
TextRect.bottom = 9*ButtonRect.Height();
TextRect.left = int(1.125*ButtonRect.Width());
TextRect.right = int(ClientRect.Width()-1.125*ButtonRect.Width());

//改变按钮位置
GetDlgItem(IDC_BUTTON1)->MoveWindow(ClientRect.left,2*ButtonRect.Height(),ButtonRect.Width(),ButtonRect.Height(),TRUE);
GetDlgItem(IDC_BUTTON3)->MoveWindow(ClientRect.left,4*ButtonRect.Height(),ButtonRect.Width(),ButtonRect.Height(),TRUE);
GetDlgItem(IDC_BUTTON5)->MoveWindow(ClientRect.left,6*ButtonRect.Height(),ButtonRect.Width(),ButtonRect.Height(),TRUE);
GetDlgItem(IDC_BUTTON7)->MoveWindow(ClientRect.left,8*ButtonRect.Height(),ButtonRect.Width(),ButtonRect.Height(),TRUE);
GetDlgItem(IDC_BUTTON2)->MoveWindow(ClientRect.right-ButtonRect.Width(),2*ButtonRect.Height(),ButtonRect.Width(),ButtonRect.Height(),TRUE);
GetDlgItem(IDC_BUTTON4)->MoveWindow(ClientRect.right-ButtonRect.Width(),4*ButtonRect.Height(),ButtonRect.Width(),ButtonRect.Height(),TRUE);
GetDlgItem(IDC_BUTTON6)->MoveWindow(ClientRect.right-ButtonRect.Width(),6*ButtonRect.Height(),ButtonRect.Width(),ButtonRect.Height(),TRUE);
GetDlgItem(IDC_BUTTON8)->MoveWindow(ClientRect.right-ButtonRect.Width(),8*ButtonRect.Height(),ButtonRect.Width(),ButtonRect.Height(),TRUE);

//设置对话框中按钮字体大小
ButtonFont.CreateFont(ClientRect.right/40,0, 0, 0, 700, false, false, 0, 1,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS | FF_SCRIPT | FF_ROMAN | FF_MODERN, "宋体");
SendMessageToDescendants(WM_SETFONT,(WPARAM)HFONT(ButtonFont),MAKELPARAM(TRUE,0));

// 设置标题区域形状及颜色
CClientDC *pDC = new CClientDC(this);
CBrush TitleBrush;
TitleBrush.CreateSolidBrush(RGB(0,128,255));
pDC->SelectObject(&TitleBrush);
pDC->RoundRect(TitleRect, CPoint(40,40));

pDC->RoundRect(TextRect, CPoint(30,30));

//更改标题TextOut输出字体
TitleFont.CreatePointFont(ClientRect.Height(),"华文行楷",NULL);
pDC->SelectObject(&TitleFont);
pDC->SetBkMode(TRANSPARENT);//让输出字体没有空白背景
pDC->SetTextColor(RGB(0,0,255));

return 0;

}

//按下按钮之后,绘制标题
BOOL CTestUIDlg::SetTitleTxt(CString Title)
{
CClientDC *pDC = new CClientDC(this);

CString x;
x.Format(Title);

//更改标题TextOut输出字体
TitleFont.CreatePointFont(ClientRect.Height(),"华文行楷",NULL);
pDC->SelectObject(&TitleFont);
pDC->SetBkMode(TRANSPARENT);//让输出字体没有空白背景
pDC->SetTextColor(RGB(0,0,255));
pDC->DrawText(x,TitleRect,DT_CENTER);

return 0;
}

按下按钮进入重新绘制的对话框时,会提示第多少行插入失败?这是什么原因?
...全文
1170 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
klkvc386 2010-04-22
  • 打赏
  • 举报
回复
UP.........
Eleven 2010-04-21
  • 打赏
  • 举报
回复
解决就好,恭喜,接分。。。
xunledelang 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xianglitian 的回复:]

看一下TitleFont.CreatePointFont(ClientRect.Height(),"华文行楷",NULL);的返回值
看看字体创建成功没
[/Quote]
嘿嘿,谢谢,现在问题解决了,原因如下:
1. //设置对话框中按钮字体大小
ButtonFont.CreateFont(ClientRect.right/40,0, 0, 0, 700, false, false, 0, 1,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS | FF_SCRIPT | FF_ROMAN | FF_MODERN, "宋体");
SendMessageToDescendants(WM_SETFONT,(WPARAM)HFONT(ButtonFont),MAKELPARAM(TRUE,0));
SendMessageToDescendants()的原因
2.从MSDN上找到的改变字体大小的代码,换上就可以了

BOOL CTestUIDlg::SetTitleTxt(CString Title)
{
CFont *my_font=new CFont();//注意初始化,不能为空
CClientDC *pDC = new CClientDC(this);

CString x;
x.Format(Title);
TitleFont.CreatePointFont(ClientRect.Height(),"华文行楷",NULL);

// Use the font you just created.
CFont* def_font = pDC->SelectObject(&TitleFont);

pDC->SetBkMode(TRANSPARENT);//让输出字体没有空白背景
pDC->SetTextColor(RGB(0,0,255));
pDC->DrawText(x,TitleRect,DT_CENTER);

pDC->SelectObject(def_font);

// Finished with the font, now delete the font object.
TitleFont.DeleteObject();

return 0;
}
还有一个问题很奇怪,我的电脑上RedrawWindow(TitleRect,NULL,RDW_VALIDATE);有时可用,有时不可用,真奇怪

tj_swjtu 2010-04-20
  • 打赏
  • 举报
回复
友情帮顶~~
尹成 2010-04-20
  • 打赏
  • 举报
回复
逐步调试TitleFont.CreatePointFont(ClientRect.Height(),"华文行楷",NULL);的返回值
看看字体创建成功没
向立天 2010-04-19
  • 打赏
  • 举报
回复
看一下TitleFont.CreatePointFont(ClientRect.Height(),"华文行楷",NULL);的返回值
看看字体创建成功没
xunledelang 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xianglitian 的回复:]

没看到TitleFont的声明
不过这个位置
TitleFont.CreatePointFont(ClientRect.Height(),"华文行楷",NULL);//运行到此,正确
这样处理试一下

if (TitleFont.GetSafeHandle())
TitleFont.DeleteObject();
TitleFont.CreatePointFont(Clie……
[/Quote]
谢谢!效果是一样的
向立天 2010-04-19
  • 打赏
  • 举报
回复
没看到TitleFont的声明
不过这个位置
TitleFont.CreatePointFont(ClientRect.Height(),"华文行楷",NULL);//运行到此,正确
这样处理试一下

if (TitleFont.GetSafeHandle())
TitleFont.DeleteObject();
TitleFont.CreatePointFont(ClientRect.Height(),"华文行楷",NULL);
xunledelang 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xianglitian 的回复:]

编译环境的右下角有个窗口就是函数调用堆栈
当调试状态下程序被断下来
我们可以通过调用堆栈看到函数调用的过程
双击列表中的项就可以定位到指定函数
[/Quote]
谢谢,调试了下,最终锁定在
//更改标题TextOut输出字体
TitleFont.CreatePointFont(ClientRect.Height(),"华文行楷",NULL);//运行到此,正确
pDC->SelectObject(&TitleFont);//到这里,会出现那个错误提示
向立天 2010-04-19
  • 打赏
  • 举报
回复
编译环境的右下角有个窗口就是函数调用堆栈
当调试状态下程序被断下来
我们可以通过调用堆栈看到函数调用的过程
双击列表中的项就可以定位到指定函数
xunledelang 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xianglitian 的回复:]

引用 7 楼 xunledelang 的回复:
引用 5 楼 xianglitian 的回复:

调试一下看看哪句出的问题

运行时错误提示是WINGDI.CPP中的1120line插入失败
1120行代码(如下第一行)
BOOL CBrush::CreateDIBPatternBrush(HGLOBAL hPackedDIB, UINT nUsage)
{
ASSERT(hP……
[/Quote]
再次感谢,不过你说的方法我不知怎么弄?
向立天 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xunledelang 的回复:]
引用 5 楼 xianglitian 的回复:

调试一下看看哪句出的问题

运行时错误提示是WINGDI.CPP中的1120line插入失败
1120行代码(如下第一行)
BOOL CBrush::CreateDIBPatternBrush(HGLOBAL hPackedDIB, UINT nUsage)
{
ASSERT(hPackedDIB != NULL);
const ……
[/Quote]

看一下调用堆栈
定位到你自己的代码才好分析原因
xunledelang 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xianglitian 的回复:]

调试一下看看哪句出的问题
[/Quote]
运行时错误提示是WINGDI.CPP中的1120line插入失败
1120行代码(如下第一行)
BOOL CBrush::CreateDIBPatternBrush(HGLOBAL hPackedDIB, UINT nUsage)
{
ASSERT(hPackedDIB != NULL);
const void* lpPackedDIB = ::GlobalLock(hPackedDIB);
ASSERT(lpPackedDIB != NULL);
BOOL bResult = Attach(::CreateDIBPatternBrushPt(lpPackedDIB, nUsage));
::GlobalUnlock(hPackedDIB);
return bResult;
}
xunledelang 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xhuacmer 的回复:]

你真的要在你绘制的矩形框里输入数据的话,有一个办法,就是在绘制的矩形框上不偏不移的创建一个相同尺寸的编辑框就可以到达你的目的。
[/Quote]
那个创建不了,因为我的程序要保证在不同分辨率下保持美观
向立天 2010-04-19
  • 打赏
  • 举报
回复
调试一下看看哪句出的问题
xhuacmer 2010-04-19
  • 打赏
  • 举报
回复
你真的要在你绘制的矩形框里输入数据的话,有一个办法,就是在绘制的矩形框上不偏不移的创建一个相同尺寸的编辑框就可以到达你的目的。
sk_sakula 2010-04-19
  • 打赏
  • 举报
回复
问题描述的不清楚,并且代码太多了,不知道看哪好
xunledelang 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wowmboy 的回复:]

友情帮顶~~
[/Quote]
谢谢~!
小生我怕怕 2010-04-19
  • 打赏
  • 举报
回复
友情帮顶~~

15,978

社区成员

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

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