MFC 小知识点

来源:互联网 发布:专业气象软件 编辑:程序博客网 时间:2024/04/30 21:10

1.app类管理整个应用程序,菜单资源的创建在其中完成、

1.XXApp.h:
HMENU m_hOPMenu;

HMENU m_hInitMenu;
2.CXXApp::InitInstance()赋值:
m_hInitMenu = ::LoadMenu(hInst, MAKEINTRESOURCE(IDR_MAINFRAME));
m_hOPMenu = ::LoadMenu(hInst, MAKEINTRESOURCE(IDR_DEMOTYPE));

2.mainFrame类是主框架类,管理整个mfc程序的框架,其继承自CMDIFrameWnd。可见CMDIFrameWnd主要是主框架类模板(字面意思可知)

3.childFrame类是子框架类,负责一个子框架的管理,其继承自CMDIChildWnd。可见CMDIChildWnd主要是子框架模板(字面上只知道是Wnd类,但其代表子框架类)

4.MDI主要程序由一个app,一个mainFrame构成,同时系统为我们自动生成了一个子框架(包括childFrame,doc,view三位一体),此子框架的句柄是什么?如何得到?当我们要在多个子框架中切换时,如果不知道此系统自动生成的子框架句柄,就无法切换到它。我的做法是:在不知道怎么得到句柄的情况下,不适用此默认的子框架窗口。(阿在appwinzerd中不勾选view/document选项。使用的所以的子框架都是由自己生成的)

通常我们可以创建自己的子框架,包括一个继承自CMDIChildWnd的子框架模板类,一个继承自CDocument的doc类,和一个继承自CView(或其子类)的view类。为了管理子框架。我们通常会创建一个子框架的句柄。由于主框架统一管理子框架。所以我们一般把此句柄放在MainFrame类中声明。子框架的实例的生成如下:

void CMainFrame::OnThirdFramed(){// TODO: 在此添加命令处理程序代码if(m_pThirdFrame != NULL){m_pThirdFrame->MDIActivate();return;}m_pThirdFrame=new CThirdFrame();CCreateContext context;CThirdDoc* pDoc=new CThirdDoc();//框架关联的doc类实例context.m_pCurrentDoc=pDoc;context.m_pNewViewClass=RUNTIME_CLASS(CThirdView);框架关联的view类m_pThirdFrame->LoadFrame(IDR_MAINFRAME,WS_MAXIMIZEBOX,this,&context);m_pThirdFrame->SetWindowText("third");m_pThirdFrame->ShowWindow(SW_SHOWMAXIMIZED);m_pThirdFrame->InitialUpdateFrame(NULL,TRUE);}
5.SetMenu(AfxGetApp()->m_pMainWnd->m_hWnd,m_hOPMenu);

afxGetApp()->m_pMainWnd:得到主框架实例,其是一个MFC封装后的窗口对象。

afxGetApp()->m_pMainWnd->h_Wnd:获得hWnd类型的对象,其是win32类型的窗口对象。

6.((CMainFrame *)AfxGetMainWnd())

AfxGetMainWnd()函数主要是获得主框架窗口的实例。类似于afxGetApp()->m_pMainWnd。有什么区别吗?

7.如果要产生多个子框架,子框架在MainFrame类中定义。如果一个子框架要产生多个视图,视图在子框架类中定义。

CFrame1::CFrame1(){    m_pView1=new CView1();//VIEW1    CCreateContext context;    RECT rect={10,10,100,200};    context.m_pCurrentDoc=this->GetActiveDocument();    m_pView1->Create(NULL,NULL,WS_CHILD,rect,this,123,&context);    m_pView2=new CView2();//VIEW2    m_pView2->Create(NULL,NULL,WS_CHILD,rect,this,123,&context);}//视图的切换用框架函数setActiveView()

8.如何让MDI程序开始生成时不自动生成空白文档..

在CXXXAPP::InitInstance中,找到如下两句:

CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);

在后面添加下面两行代码:

if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew)  //替换命令 取消默认窗口生成
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;

9.CFileDialog的初始化和使用(if(fileDlg.domodel()==IDOK)

两个构造函数

  • CFileDialog fileDlg(TRUE, "*.*", "",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"txt文件(*.txt)|*.txt|mdf文件(*.mdf)|*.mdf||",1);
  • CFileDialog fileDlg(TRUE);//作为打开对话框用true,另存为对话框用false;

当使用CFileDialog fileDlg(TRUE);构造对象时,可以通过m_ofn结构中的变量来设置对话框相应的属性。最重要的有:

  • fileDlg.m_ofn.lpstrFilter="txt文件\0*.txt\0mdf\0*.mdf\0\0";设置文件对话框的filter属性。(注意和第一个构造函数中filter写法的不同\0取代|)
  • fileDlg.m_ofn.lpstrInitialDir="C:\\";设置初试打开的文件位置。

关于文件路径和名称的函数如下:如打开c:\a.txt

  • fileDlg.getPathName()、返回c:\a.txt
  • fileDlg.getFileName()、返回a.txt
  • fileDlg.getFileTitle()、返回a.(title是头的意思啊,所以返回前面)
  • fileDlg.getFileExt()、返回txt

10.long转换问Cstring

    long num=a;
    CString str;
    str.Format(_T("%ld"),num);

11. CSplitterWnd::setColumnInfo(int col, int cxIdeal, int cxMin)的含义:对第col列设置其宽度,宽度设置为cxIdeal。cxMin表示,当窗口的宽度小于cxMin时,窗口就自动靠边隐藏.

12.如何在dailog的大小改变时,同时改变其中控件的大小来与之同步。

基本方法是在dialog执行onSize时,改变控件的大小。但是当dialog首次创建时,先执行onsize,在执行onInitialDialog(),此时控件并没有产生,所以要先判断此控件是否存在,存在时才需要进行更改。

例子:在dialog中放置一个可以跟随他改变的view。

void CDlg::OnSize(UINT nType, int cx, int cy){CDialogEx::OnSize(nType, cx, cy);// TODO: 在此处添加消息处理程序代码CWnd* pwnd=GetDlgItem(IDC_MY_DRAW_VIEW);if(pwnd){CRect rect;GetClientRect(&rect);rect.top+=50;rect.left+=10;m_pDrawView->MoveWindow(&rect);}}
13. IDR_MAINFRAME string 中的第四个和第五个只能定义一种文件适配器。不可能定义两个,原因很简单,每一种doctemplate只能处理一种文件类型。而且,docManager也是根据这两个参数来确定使用哪个doctemplate来打开文件的,试想如果可以定义两种类型的文件,则docManager就不知道使用哪个doctemplate来打开文件了。所以不同的文件对应的不同的doctemplate的idresource参数应该是不同的。

1.通过以下代码输出想要的信息#ifdef _DEBUG   afxDump << "CString s" << s << "\n";#endif


14.将CString转换为int

CString str("1234");
int i= _ttoi(str);

在ANSI 和 UNICODE 都可以用的。

15. CString 转为string

  //CString转string
USES_CONVERSION;
 char* p=T2A(m_ShowBoreName);

CString 转char *

CString cstr;

char *p = (LPSTR)(LPCTSTR)cstr;

第二种方法

        USES_CONVERSION;
        char* s_char=W2A(it->first);
        font.drawCNString(s_char);



16.点击红箭头指向的叉时,是childFrame对象响应消息,响应的是onClose消息,不是onDestroy消息。


原创粉丝点击