DoModal() 无法显示对话框,返回-1

skyfree 2010-08-29 12:21:58
一个窗口的模板资源从另外一个SDK项目中copy到mfc项目的.rc文件中,并仔细核对了.rc, resource.h中的条目。
但在 xxxDialog.DoModal()这个方法仍然执行后直接返回-1, 对话框完全不出来 :(, 自己新建了个对话框试了试就没问题。

我仔细跟踪了一下mfc的代码,发现在CDialog的CreateDlgIndirect()这个方法直接返回NULL! 无法继续跟踪下去(再跟踪就进入winuser的API部分,无源码)。

大家看看这种情况最大的可能原因是什么,实在不行我就只能重新建对话框资源了。 但是想知道什么原因造成的。
...全文
1313 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2010-08-30
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 jerrywjh 的回复:]

还有个问题,如果我选择unicode mfc library, 究竟会和使用multibyte的lib有多大不同,具体表现在什么地方? 比如,是不是CString要转换成char*就会很麻烦,还能 CString a ="abc", char* b=a; 这样用么?? 谢了
[/Quote]
就是各种多版本的函数,类等都会默认用Unicode版本,还是用ANSI版本...
CString a =_T("abc");
CString需要改,而char*不用,但是a 给b就需要考虑不同字符集转换问题
Eleven 2010-08-30
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 jerrywjh 的回复:]
还有个问题,如果我选择unicode mfc library, 究竟会和使用multibyte的lib有多大不同,具体表现在什么地方? 比如,是不是CString要转换成char*就会很麻烦,还能 CString a ="abc", char* b=a; 这样用么?? 谢了
[/Quote]
如果你写成通用代码就不会有这个问题了
CString a = _T("abc");
TCHAR* b = (LPCTSTR)a;
skyfree 2010-08-30
  • 打赏
  • 举报
回复
还有个问题,如果我选择unicode mfc library, 究竟会和使用multibyte的lib有多大不同,具体表现在什么地方? 比如,是不是CString要转换成char*就会很麻烦,还能 CString a ="abc", char* b=a; 这样用么?? 谢了
skyfree 2010-08-30
  • 打赏
  • 举报
回复
thanks, cnzdgs, you are the savier!
skyfree 2010-08-30
  • 打赏
  • 举报
回复
原来common control 6.0以后才不支持ansi的了,晕死! 其实并不是所有的应用都适合用unicode,不如通信类的应用,原生就是char* (一般utf-8编码),如果界面用unicode,在界面和底层直接要不停的进行编码转换.
skyfree 2010-08-30
  • 打赏
  • 举报
回复
那这个还是很麻烦,我调用另外一个project(multibyte的)的方法,都需要char*类型的参数,每次都转换可麻烦了,唉。

有没有办法可以让common control 控件在非unicode 下可以使用的方法。 我回去试试满天星提到的动态创建的方法。谢谢了
dingshaofengbinbin 2010-08-29
  • 打赏
  • 举报
回复
是不是模态对话框????
swimmingfish2004 2010-08-29
  • 打赏
  • 举报
回复
窗口的属性什么的也可以检查一下。
skyfree 2010-08-29
  • 打赏
  • 举报
回复
GetLastError()不返回错误信息。 资源ID我也检查过了,对话框有些复杂,我再 检查一下吧
liyinlei 2010-08-29
  • 打赏
  • 举报
回复
检查一下对话框上控件的资源id是否有冲突等。

用GetLastError 看看具体的错误码是什么
cnzdgs 2010-08-29
  • 打赏
  • 举报
回复
All the new functionality defined in ComCtl32.dll version 6 supports only Unicode. Therefore, you cannot create ANSI versions of SysLink controls, only Unicode ones.
SysLink控件只能用Unicode,你可以试试不在对话框资源上放SysLink控件,改用CreateWindowExW创建,类名为WC_LINK。
skyfree 2010-08-29
  • 打赏
  • 举报
回复
在Unicode情况下就没有这个问题, 如果对话框中没有syslink控件,无论是否是unicode,也没有问题,
我一会试试 vs2010有没有这个问题
skyfree 2010-08-29
  • 打赏
  • 举报
回复
基本算找到问题了,但不知道如何解决。竟然是unicode的问题。
该问题可以在vs2008 ( without sp1)上可以很轻易的重现: 用向导建立一个mfc application, 选择SDI,把Use Unicode libraries 这个选项去掉。其他的都默认即可。 在生成的项目的 About对话框中 ,拖入一个syslink控件,然后执行, 该About 对话框将无法弹出!!

我的项目之所以选择不使用unicode ,是因为该solution中另外的一个类库项目(通信用的)使用的multibyte,所以我这里为了一致,就选择的 非unicode, 在mfc的非unicode项目下,如果对话框中有syslink控件,该对话框将无法成功创建! 看了的确是一个bug,不知道大家能不能重现我的问题??
如果有人能告诉我,一定给分,呵呵。

还有,这种情况下,应如何解决?
CyberLogix 2010-08-29
  • 打赏
  • 举报
回复
绑定一下,多年不用MFC了,呵呵
hztj2005 2010-08-29
  • 打赏
  • 举报
回复
syslink控件(用来做超链接)
CONTROL "<a>SysLink1</a>",IDC_SYSLINK1,"SysLink",WS_TABSTOP,106,115,60,14
这是一个Static 控件,用来做超链接

使用了超链接,那么是否派生了Hyperlink类(继承基类CStatic),你是否将Hyperlink.cpp, Hyperlink.h加入了自己的工程?
liyinlei 2010-08-29
  • 打赏
  • 举报
回复
在App的 InitInstance 里加上AfxOleInit 试试
schlafenhamster 2010-08-29
  • 打赏
  • 举报
回复
对话框有个“No Fail Create”属性可以帮助定位Create failed的控件,可能你的syslink控件没注册吧?
skyfree 2010-08-29
  • 打赏
  • 举报
回复
反复测试,只要对话框上有syslink控件(用来做超链接),DoModal()就无法弹出,去掉就ok, SDK程序无问题,该问题只存在于mfc, 什么原因???强烈怀疑mfc的bug
skyfree 2010-08-29
  • 打赏
  • 举报
回复
谢谢大家的答复,问题已经初步定位了,我发现问题出在一个syslink控件上。
只要在对话框中有
CONTROL "<a>SysLink1</a>",IDC_SYSLINK1,"SysLink",WS_TABSTOP,106,115,60,14
这样一句话,即使这句话是自动生成的没做任何修改,DoModal(), dialog就无法显示, 我以前在SDK上的程序没有任何问题。
难道是mfc的bug?求高手解答
oyljerry 2010-08-29
  • 打赏
  • 举报
回复
在你对话框的OnInitDialog中,看是否正确返回,对话框初始化代码是否都返回正确,其次检查你对话框CPP中DDX_CONTROL,等绑定的控件是否ID都正确等...
加载更多回复(1)

15,980

社区成员

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

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