本例融合了添加菜单、光标、图标资源及状态栏显示时间。
1文件à新建à项目àwin32àwin32空项目à项目属性à配置属性à常规àMFC的使用à在共享DLL中使用MFC或在静态库中链接MFCà编写first.cpp文件
2在项目文件中添加first.rc文件,在资源视图中选择first.rc节点,再选择编辑à包含文件,在上下两列表框中分别填入#include afxres.h”和#include“afxres.rc”;
3右击资源视图中first.rc节点à添加资源—〉选择Menu|新建à在资源编辑框中编辑FILE|EXIT菜单à单击菜单出现菜单属性菜单编辑器将其EXIT 的ID设置为ID_FILE_EXIT,并在.cpp文件中添加系统默认EXIT退出函数命令;
4右击资源视图中first.rc节点à 添加资源à选择Icon|导入已有的.ico图表文件à在资源视图一次展开Icon 将其ID默认为IDI_ICON1,然后在first.cpp加载IDI_ICON1;本例加载了两个Icon分别为生成的.exe文件图标和主窗口左上角小图标。
5同上导入自己收藏的.cur光标文件,默认ID为IDC_CURSOR1,然后在first.cpp加载IDI_CURSOR1
附程序清单:
#include <afxwin.h> // 必要的包涵文件
#include <afxext.h>
#include "resource.h"
// 主窗口类
class MyFrameWindow : public CFrameWnd
{
public:
//在窗口被创建之前先执行此函数
BOOL PreCreateWindow(CREATESTRUCT &cs)
{
cs.hMenu=LoadMenu(NULL,MAKEINTRESOURCE(IDR_MENU1)); //载入自定义菜单
return CFrameWnd::PreCreateWindow(cs);
}
afx_msg void OnFileExit( ) //响应FILE|EXIT选项
{
PostMessage(WM_CLOSE);
}
afx_msg void OnPaint( ) // 重绘窗口内部图形
{
CPaintDC paintDC( this );
paintDC.TextOut ( 0, 0, "I love U" );//在工作区显示字符串
}
HCURSOR hCursor; //鼠标句柄
CStatusBar statusbar; //状态栏句柄
afx_msg BOOL OnSetCursor(CWnd* pWnd,UINT nmyframe,UINT message);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnTimer(UINT_PTR nIDEvent);
DECLARE_MESSAGE_MAP() // 声明消息映射表
};
//消息映射表
BEGIN_MESSAGE_MAP(MyFrameWindow, CFrameWnd)
ON_WM_CREATE()
ON_WM_PAINT() // 响应WM_PAINT消息
ON_WM_SETCURSOR()
ON_COMMAND(ID_FILE_EXIT,OnFileExit)
ON_WM_TIMER()
END_MESSAGE_MAP()
// 设置鼠标光标
BOOL MyFrameWindow::OnSetCursor(CWnd* pWnd,UINT nmyframe,UINT message)
{
hCursor=AfxGetApp()->LoadCursor(IDC_CURSOR1);//载自定义光标资源
BOOL apiRet;
apiRet=CFrameWnd::OnSetCursor( pWnd,nmyframe,message);
if((apiRet==FALSE)&&(nmyframe==HTCLIENT))
::SetCursor(hCursor);
return apiRet;
}
int MyFrameWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
// 状态栏的指示栏标志
static UINT indicators[] =
{
IDS_INDICATOR_WORD, //自我寄语,自己添加StringTable,Caption即为显示内容
IDS_INDICATOR_ME, //我的信息自己添加StringTable,Caption即为显示内容 ID_INDICATOR_CAPS, //显示CapsLock状态
ID_INDICATOR_SCRL, //显示ScrollLock状态
ID_INDICATOR_NUM, //显示NumLock状态
ID_INDICATOR_TIME, //时间显示
};
if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;
// Prepare status bar //
statusbar.Create ( this );
// 设置指示栏//
statusbar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));
// set field width for time display
statusbar.SetPaneInfo(5,ID_INDICATOR_TIME,SBPS_POPOUT,180);
// 调用计时器//
SetTimer ( 5, 1000, 0 );
return 0;
}
void MyFrameWindow::OnTimer(UINT_PTR timerId)
{
//char time[12];
char time[40];
CFrameWnd::OnTimer(timerId);
if(timerId==5)
{
SYSTEMTIME t;
//获得系统时间
GetLocalTime(&t);
//形成时间字符串
wsprintf(time,"%02d年%02d月%02d日%02d:%02d:%02d 星期%02d",t.wYear,t.wMonth,t.wDay,t.wHour,t.wMinute,t.wSecond,t.wDayOfWeek);
//更新时间显示
statusbar.SetPaneText(statusbar.CommandToIndex(ID_INDICATOR_TIME),time);
}
}
// 应用程序类
class HelloApp : public CWinApp
{
public:
HelloApp ( )
: CWinApp ( (LPCTSTR)"Hello World!") //设置应用程序名称//
{}
~HelloApp ( )
{}
BOOL InitInstance( )
{
HICON hIcon;
hIcon=LoadIcon(IDI_ICON1);
CFrameWnd *MyFrame = new MyFrameWindow; //产生主窗口对象//
m_pMainWnd = MyFrame;
MyFrame->Create ( NULL,"水流花开"); // 创建主窗口,第二个参数为窗口标题//
MyFrame->SetIcon(hIcon,FALSE); //设置窗口的小图标,此为框架窗口标题前的图标//
MyFrame->SetIcon(LoadIcon(IDI_ICON2) ,TRUE);//设置窗口的大图标;.exe文件与这里的SetIcon完全无关,自动挑选ID最小的,可在.h里修改ID尝试//
MyFrame->ShowWindow ( SW_SHOW ); // 显示主窗口//
return TRUE;
}
} HelloWorld;
我要像星光一样直朝前,永不回头。
评论