断言错误

yb210021 2009-06-25 10:34:40
各位高手好!我在程序中社了一个全局变量CFont cfont;然后在OnInitDialog()函数里加了下面的程序
VERIFY(cfont.CreateFont(
30, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
_T("Arial"))); // lpszFacename
GetDlgItem(IDC_EDIT1)->SetFont(&cfont);
目的就是实现向编辑框显示数字,第一次执行时好好的,第二次点击按钮,就出现了File wingdi.cpp;Line 1194的错误了,请问怎么解决啊?
...全文
164 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yb210021 2009-06-25
  • 打赏
  • 举报
回复
好了,谢谢各位
Ryanwen 2009-06-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yb210021 的回复:]
这样做了,我的字体大小又不能改变了
[/Quote]

不能改变?什么意思? 你创建了再SetFont不改变?
Ryanwen 2009-06-25
  • 打赏
  • 举报
回复
1、把字体创建的代码放在CMyappDlg::OnInitDialog,这样只创建一次,不会有你的问题

2、如果要在Liuliang::OnInitDialog 中创建字体,则在创建前加
if ( cfont.GetSafeHandle () )
cfont.DeleteObject() ; //先删除

VERIFY(cfont.CreateFont(....));//再创建
yb210021 2009-06-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 Ryanwen 的回复:]
重复创建了,先删除再创建
if ( cfont.GetSafeHandle () )
cfont.DeleteObject () ;

VERIFY(cfont.CreateFont(....));
[/Quote]
这样做了,我的字体大小又不能改变了
yb210021 2009-06-25
  • 打赏
  • 举报
回复
各位大侠,说的具体点,我是新手,不太懂啊
Ryanwen 2009-06-25
  • 打赏
  • 举报
回复
重复创建了,先删除再创建
if ( cfont.GetSafeHandle () )
cfont.DeleteObject () ;

VERIFY(cfont.CreateFont(....));
skyxie 2009-06-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yb210021 的回复:]
我的就是一个主窗口,有个按钮,点击它然后弹出新的对话框,新的对话框的编辑框显示数字,就这样。主窗口按钮事件:
void CMyappDlg::OnButton1()
{
Liuliang* dlg=new Liuliang;
dlg->Create(IDD_DIALOG1,this);
dlg->ShowWindow(SW_SHOW); }
[/Quote]

你的 cfont.CreateFont 是在 Liuliang::OnInitDialog还是在 CMyappDlg::OnInitDialog中?

你的cfont是全局变量,如果在 Liuliang::OnInitDialog 中 cfont.CreateFont , 就会导致每次点击时都 cfont.CreateFont, 需要移到 CMyappDlg::OnInitDialog中
yb210021 2009-06-25
  • 打赏
  • 举报
回复
我的就是一个主窗口,有个按钮,点击它然后弹出新的对话框,新的对话框的编辑框显示数字,就这样。主窗口按钮事件:
void CMyappDlg::OnButton1()
{
Liuliang* dlg=new Liuliang;
dlg->Create(IDD_DIALOG1,this);
dlg->ShowWindow(SW_SHOW); }
快乐鹦鹉 2009-06-25
  • 打赏
  • 举报
回复
CreateFont是不能连续执行两次的,它会先判断CFont的句柄是否为空,必须为空才能执行,否则就是断言错误。因此CreateFont前,先删除这个字体对象
devinside 2009-06-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 skyxie 的回复:]
第一次执行时好好的,第二次点击按钮,就出现了File wingdi.cpp;Line 1194的错误了,请问怎么解决啊?
[/Quote]
没看清你的描述,那么肯定是上面情况了,再次创建前请销毁
devinside 2009-06-25
  • 打赏
  • 举报
回复
跟进去看看断言错误是什么,我这里1194行没有断言,可能版本不太一样
给你提供一个出错的可能,如果你的cfont已经创建了一次,在创建的话会在Attach出断言错,我这里是1120行,如下
BOOL CGdiObject::Attach(HGDIOBJ hObject)
{
1120: ASSERT(m_hObject == NULL); // only attach once, detach on destroy
if (hObject == NULL)
return FALSE;
CHandleMap* pMap = afxMapHGDIOBJ(TRUE); // create map if not exist
ASSERT(pMap != NULL);
pMap->SetPermanent(m_hObject = hObject, this);
return TRUE;
}
看看你是不是这种情况,如果是,请不要重复创建,或者创建前检查一下是否已经创建
if ( cfont.GetSafeHandle () )
cfont.DeleteObject () ;
ouyh12345 2009-06-25
  • 打赏
  • 举报
回复
查找cfont,看是否调用了DeleteObject,导致无效
skyxie 2009-06-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 yb210021 的帖子:]
第一次执行时好好的,第二次点击按钮,就出现了File wingdi.cpp;Line 1194的错误了,请问怎么解决啊?
[/Quote]

关键不在这里, 而是你的按钮处理函数做了什么?
把它的代码贴出来~

16,551

社区成员

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

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

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