没有文档视图支持的单个窗体无法正常刷新

s31628 2013-02-28 10:50:08
我新建一没有文档视图支持的MFC程序,默认代码编译后,运行,会出现一个正常的白色背景窗体。
默认代码中有个函数如下:


BOOL Ctt12App::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);

CWinApp::InitInstance();


// 初始化 OLE 库
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}

AfxEnableControlContainer();

EnableTaskbarInteraction(FALSE);

// 使用 RichEdit 控件需要 AfxInitRichEdit2()
// AfxInitRichEdit2();

// 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));


// 若要创建主窗口,此代码将创建新的框架窗口
// 对象,然后将其设置为应用程序的主窗口对象


CMainFrame* pFrame = new CMainFrame;
if (!pFrame)
return FALSE;
m_pMainWnd = pFrame;
// 创建并加载框架及其资源
pFrame->LoadFrame(IDR_MAINFRAME,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL,
NULL);

// 唯一的一个窗口已初始化,因此显示它并对其进行更新
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();

// 仅当具有后缀时才调用 DragAcceptFiles
// 在 SDI 应用程序中,这应在 ProcessShellCommand 之后发生
return TRUE;
}


这个函数用来初始化和创建显示的窗体的,默认创建的是CMainFrame类。
我不想创建这个类,我想创建一个我自己写的窗体,于是我把如下代码

CMainFrame* pFrame = new CMainFrame;
if (!pFrame)
return FALSE;
m_pMainWnd = pFrame;
// 创建并加载框架及其资源
pFrame->LoadFrame(IDR_MAINFRAME,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL,
NULL);

// 唯一的一个窗口已初始化,因此显示它并对其进行更新
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();



替换为

CSkinWnd* pSkin = new CSkinWnd;
if (pSkin->GetSafeHwnd() == NULL)
pSkin->Create(SKIN_POPUP_WINDOW, NULL, 55786);
m_pMainWnd = pSkin;
pSkin->SetWindowText(_T("自绘控件"));
pSkin->CenterWindow();
pSkin->ShowWindow(1);


其中,CSkinWnd 由CWnd派生而来。
程序执行完毕后,,这个窗体能创建,但是无法刷新,就像程序死了一样。


附:该程序如果通过其他方式调用,比如某创建好的窗体点下按钮说明的,就能正常刷新
可是直接放到这里调用,就刷新不了。

球解决办法
...全文
196 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2013-02-28
  • 打赏
  • 举报
回复
没有 frame ??
s31628 2013-02-28
  • 打赏
  • 举报
回复
从CWnd类派生的类,就算自己不做设置,也有默认的映射啊 另外,pSkin->GetSafeHwnd()为空也没错啊,刚创建个窗体类,这时候该类还没有窗体,所以窗体句柄自然也没有,这样,就创建了一个窗体,就不为空了
辰岡墨竹 2013-02-28
  • 打赏
  • 举报
回复
你的这个类有映射了WM_PAINT和OnPaint()么?
shen_wei 2013-02-28
  • 打赏
  • 举报
回复
pSkin->GetSafeHwnd()这个都为空了。。你看看原因
s31628 2013-02-28
  • 打赏
  • 举报
回复
在执行pSkin->Create(SKIN_POPUP_WINDOW, NULL, 55786)时, CSkinWnd类里的 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); 消息映射都没有执行。。 该类已经映射该消息
s31628 2013-02-28
  • 打赏
  • 举报
回复
引用 5 楼 shen_wei 的回复:
CSkinWnd* pSkin 中,在这里你有设置刷新吗???
设置刷新?
shen_wei 2013-02-28
  • 打赏
  • 举报
回复
CSkinWnd* pSkin 中,在这里你有设置刷新吗???
jimette 2013-02-28
  • 打赏
  • 举报
回复
消息没或得响应吗?
bsnry 2013-02-28
  • 打赏
  • 举报
回复
没道理啊
s31628 2013-02-28
  • 打赏
  • 举报
回复
这个派生类,,如果是通过其他方式创建的,比如点一下某个按钮,创建该类窗体,,一切都正常。 可是就是在主程序里直接创建,就无法正常,窗体好像卡死一样,画不出来,似乎是哪里消息传递出了问题的样子。
s31628 2013-02-28
  • 打赏
  • 举报
回复
其中,SKIN_POPUP_WINDOW定义如下: #define SKIN_POPUP_WINDOW (WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS)
xiaoxiaospace 2013-02-28
  • 打赏
  • 举报
回复

CSkinWnd* pSkin = new CSkinWnd; 
if (pSkin->GetSafeHwnd() == NULL)     
pSkin->Create(SKIN_POPUP_WINDOW, NULL, 55786); 
//m_pMainWnd = pSkin; 
pSkin->SetWindowText(_T("自绘控件")); 
pSkin->CenterWindow(); 
pSkin->ShowWindow(1); 

m_pMainWnd = pSkin; 


放到最后就可以了
schlafenhamster 2013-02-28
  • 打赏
  • 举报
回复
没有 frame 的程序 ,通常 是 对话框,直接创建的基于CWnd派生的窗体没试过。
s31628 2013-02-28
  • 打赏
  • 举报
回复
引用 11 楼 schlafenhamster 的回复:
没有 frame ??
没有,直接创建的基于CWnd派生的窗体

15,979

社区成员

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

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