设置程序图标

在CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)函数中设置图标

//SetClassLong is noly valid for Win32
//SetClassLong(this->m_hWnd, GCL_HICON, (LONG)AfxGetApp()->LoadIconW(IDI_ICON_WIN));

//SetClassLongPtr is valid for win32 and x64
SetClassLongPtr(this->m_hWnd, GCLP_HICON, (LONG)AfxGetApp()->LoadIconW(IDI_ICON_WIN));

ICO converter

Windows应用的图标
ICO converter

程序标题

//CMainFrame::OnCreate, 此处设置右标题
SetTitle(TEXT("销售管理系统"));
//通过String Table的IDR_MAINFRAME设置
IDR_MAINFRAME, 程序名称,会显示在标题栏

//CSaleSystemDoc::OnNewDocument,此处设置左标题
SetTitle(TEXT("Document 1"));

日志文件夹

设置窗口大小和居中位置

BOOL CWinApp::InitInstance()
{
	...

	m_pMainWnd->MoveWindow(0, 0, 800, 600);
	m_pMainWnd->CenterWindow();

	...
}

创建框架窗口

LoadFrame和Create是一样的,都是创建窗口。要为应用构造有用的框架窗口,可从CFrameWnd中派生类。向派生类加入成员变量,以便存储指定给应用的数据。在派生类中实现消息处理成员函数和消息映射,指定当消息指向窗口时的动作。

  • 用Create直接构造。
  • 用LoadFrame直接构造。
  • 用文档模板间接构造。

当调用Create和LoadFrame时,必须在堆中构造一个框架窗口(使用C++ New操作)。调用Create之前,也可以用AfxRegisteerWndClass全局函数登记一个窗口类来设置框架的图表和类风格。使用Create成员函数传递框架构造参数作为立即参数。

LoadFrame需要比Create少的参数,而从资源中获取大多数缺省值,例如框架标题,图标、加速表、菜单。为了能被LoadFrame访问,所有的资源必须有相同的ID(例如,IDR_MAINFRAME)。

当一个CFrameWnd对象包含视图和文档时,它们由框架间接构造而不是直接由程序员直接构造。CDocTemplate对象将框架构造、包含视图的构造、视图与文档相连接等混在一起。CDocTemplate构造函数的参数指定了三种类(文档、框架、视图)的CRuntimeClass。当用户指定新框架时(例如,使用File New命令或MDI Windows New 命令),CRuntimeclass对象被框架用于动态建立新的框架。一个从CFrameWnd中派生出的框架窗口类必须由DECLARE_DYNCREATE声明以使上面的RUNTIME_CLASS机制正确运行。

构造CFrameWnd窗口三种途径

  1. 使用Create函数直接构造
  2. 使用LoadFrame函数直接构造
  3. 通过文档模板直接构造

在使用Create或LoadFrame之前,必须使用C++ New操作符在堆中构造框架窗口对象。在调用Create函数之前,必须使用AfxRegisterWndClass全局函数来登记窗口类,从而为框架设置图标或类的风格。使用Create成员函数,应指定所有框架窗口的构造参数。

LoadFrame需要的参数比Create少,不过它需要的资源更多的缺省值,包括框架的标题、图标、加速表和菜单。为了LoadFrame函数的使用,所有的资源必须有相同的资源ID号。

当用文档模板对象构造一个框架窗口时,框架调用LoadFrame。框架用pContext参数指定要与框架窗口相连的对象,包含任何包容视图对象。可以调用LoadFrames时设置pContext为NULL。

添加OnClose函数

通过MFC Class Wizard无法为CMainFrame添加消息处理函数ON_WM_CLOSE(),此时可以手动添加.

//MainFrm.h
afx_msg void OnClose();

//MainFrm.cpp
ON_WM_CLOSE()

void CMainFrame::OnClose()
{
	// Save the current state for toolbars and menus.
	SaveCommandBars(_T("CommandBars"));
	CMDIFrameWnd::OnClose();
}

日志文件夹