关于mfc的弹出窗口,弹出窗口的句柄为0

时间:2020-11-28 23:40:43
新手,勿笑;
前几天写了一个mfc的小程序,用来管理学生数据;
一直都是正常的,今天边学边写了一个弹出窗口;
首先,主对话框下面有一个按钮,
我想通过单击它产生一个弹出窗口;
然后弹出窗口中有一个文本框,会有一个默认值,比如姓名;
为了实现这个功能;
我画了一个弹出窗口;
创建了类;
并且也在按钮的函数中使用了DoModal();
我在弹出窗口类的构造函数中写了一句:
text_mo_name.SetWindowText("123");
结果报错

---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!

Program: d:\文档\visual studio 2010\Projects\ee\Debug\ee.exe
File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\winocc.cpp
Line: 246

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
---------------------------
中止(A)   重试(R)   忽略(I)   
---------------------------

经过在检查,在构造函数中放置了一个this指针,设置了一个断点,发现this指针的hwnd是NULL导致错误;
后来,在弹出窗口中添加了一个按钮,通过点击按钮来给文本框设置显示的字符;
然后就可以正常显示了;
但是,这样不符合我的初衷;
要怎样解决这个问题??
简单来说,就是想在弹出文本框的时候,让文本框显示一个东西;

还有一点,为什么我在窗口预览的时候,所有按钮都是win7的圆角按钮,但是程序实际运行时却是像win95那样的直角按钮;
相当郁闷啊;

10 个解决方案

#1


好像,额,第一个问题解决了..........
我再初始化函数OnInitDialog()中添加了一句
CDialog::OnInitDialog();
好像就可以了
没加这句之前;
在这个函数中写text_mo_name.SetWindowText("123");也会有相同的错误,只不过这次换成文本框的句柄是NULL了;
不过第二个问题还是没有解决

#2


窗口类的构造函数在执行的时候,窗口还没有绘制好,还不能SetWindowText

#3


text_mo_name.SetWindowText("123");
这句应该放到OnInitDialog函数中,你的text_mo_name关联CEdit控件窗口要正确。

#4


还有一点,为什么我在窗口预览的时候,所有按钮都是win7的圆角按钮,但是程序实际运行时却是像win95那样的直角按钮;

#5


加一个manifest资源,指明使用第6版控件

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="*"
    name="CompanyName.ProductName.YourApplication"
    type="win32"
/>
<description>Your application description here.</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="*"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>

#6


引用 5 楼 lactoferrin 的回复:
加一个manifest资源,指明使用第6版控件

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"……

我的编译器是vs2010,怎么添加mainfest文件呢

#7


资源编辑器里面

#8


引用 7 楼 lactoferrin 的回复:
资源编辑器里面

资源编辑器里面没有啊

#9


stdafx.h中添加

#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif

#10


引用 9 楼 huangcheng90 的回复:
stdafx.h中添加
C/C++ code

#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitectu……

非常感谢;
只不过我没有用unicode 
我把第一个ifdef改成了ifndef

#1


好像,额,第一个问题解决了..........
我再初始化函数OnInitDialog()中添加了一句
CDialog::OnInitDialog();
好像就可以了
没加这句之前;
在这个函数中写text_mo_name.SetWindowText("123");也会有相同的错误,只不过这次换成文本框的句柄是NULL了;
不过第二个问题还是没有解决

#2


窗口类的构造函数在执行的时候,窗口还没有绘制好,还不能SetWindowText

#3


text_mo_name.SetWindowText("123");
这句应该放到OnInitDialog函数中,你的text_mo_name关联CEdit控件窗口要正确。

#4


还有一点,为什么我在窗口预览的时候,所有按钮都是win7的圆角按钮,但是程序实际运行时却是像win95那样的直角按钮;

#5


加一个manifest资源,指明使用第6版控件

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="*"
    name="CompanyName.ProductName.YourApplication"
    type="win32"
/>
<description>Your application description here.</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="*"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>

#6


引用 5 楼 lactoferrin 的回复:
加一个manifest资源,指明使用第6版控件

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"……

我的编译器是vs2010,怎么添加mainfest文件呢

#7


资源编辑器里面

#8


引用 7 楼 lactoferrin 的回复:
资源编辑器里面

资源编辑器里面没有啊

#9


stdafx.h中添加

#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif

#10


引用 9 楼 huangcheng90 的回复:
stdafx.h中添加
C/C++ code

#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitectu……

非常感谢;
只不过我没有用unicode 
我把第一个ifdef改成了ifndef