MFC:模态与非模态对话框

昨天用单文档做了一个简易的编辑器,可以编辑代码。今天跟进一步,把之前写的翻译器移植进来。
一开始抱着只要读懂代码就能知道怎么写的想法去尝试,结果浪费了一下午的时间,死磕各种BUG,其中一个BUG困扰时间最长:我通过类向导建立的对话框类(继承自CDialog),然后在别的类中使用这个类创建对象,总是出现莫名其妙的错误(提示缺少;的语法错误),怎么都查不出来。后来只好屈服,去搜了教程来看。(http://www.jizhuomi.com/software/257.html)首先通过资源创建了对话框,然后再在资源中建立类,然后就可以使用了。但目前还不清楚为什么两种创建方式出来会有不同的结果。
这里写图片描述
为了将之前的控制台程序移植来(http://blog.csdn.net/u011602557/article/details/68943237),我将其两个类封到一个头文件compile.h中,并将其中的输出部分全部用一个全局函数report(string)代替。
然后建立一个头文件debugTool.h,用来查看输出信息。
其中内容如下:

//debugTool.h
#pragma once


#include "stdafx.h"
#include"NCCompiler.h"
#include"MyDlog.h"
#include"Windows.h"
#include<string>
class CoptWind{
private:
    CMyDlog *dlg;//CMyDlog dlg;
    static CoptWind*pc;
    bool isdlgOn;
    CoptWind();

public:
    static CoptWind* getInstance();
    void addString(std::string);
    void clear();
    void close();
};

void report(std::string str);

这里的类使用单例模式,作为衔接MFC部分和纯编译模块的中转站,用来创建临时输出窗口。除了常规的获取句柄,有三个方法,分别是addString往对话框中添加信息,clear清除信息,close关闭对话框。
成员变量dlg指向创建的对话框,isdlgon用于判断对话框是否健在。

对话框分为两类,模态和非模态。模态好比一个必选项,弹出对话框后除了做对话框中的选择不可以做别的事;非模态像一个单纯的输出窗口,随时可以查看,随时可以关闭。这里主要使用非模态来显示输出信息。
模态对话框使用DoModal函数创建,这个函数会返回选择的标签值;非模态对话框使用create()函数,需要传递对话框的ID参数。
实现如下:

//debugTool.cpp
#include"stdafx.h"
#include"debugTool.h"
void report(std::string str){/*
    CStringA s = str.data();
    CString s_u;
    s_u = s;*/
    //::MessageBox(NULL, s_u.GetBuffer(), L"提示", MB_OK);
    CoptWind::getInstance()->addString(str);
}

CoptWind*CoptWind::pc = NULL;
CoptWind::CoptWind(){
    isdlgOn = true;
    dlg = new CMyDlog();
    dlg->Create(IDD_DIALOG1);
    dlg->ShowWindow(SW_SHOW);//非模态创建
    //dlg.DoModal();//模态创建
}
CoptWind* CoptWind::getInstance(){ 
    if (pc){
        return pc;
    }
    else{
        return pc = new CoptWind();
    }
}

void CoptWind::addString(std::string str){
    if (!isdlgOn){//已经关闭 需要刷新
        delete dlg;
        dlg = new CMyDlog();
        dlg->Create(IDD_DIALOG1);
        dlg->ShowWindow(SW_SHOW);//非模态创建
    }
    CStringA sa = str.data();
    CString s;
    s = sa;
    //dlg.m_list.AddString(s.GetBuffer());
    dlg->UpdateData(true);
    dlg->m_list.AddString(s.GetBuffer());
    dlg->UpdateData(false);

}
void CoptWind::clear(){
    //dlg.m_list.CloseWindow();
    ;
}
void CoptWind::close(){
    isdlgOn = false;//标记 以供下次删除
}

运行结果:
这里写图片描述

显示格式错误的原因是MFC中使用的是UNICODE编码,而我写的翻译模块是使用的ANSI,需要做一定的转换,留到下次再说。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值