1.窗口的动画效果
一.在文档的框架类中(或在对话框中的OnInitDialog()函数中)添加WM_CREATE消息响应代码:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
// TODO:Add your creation code here
AnimateWindow(GetSafeHwnd(), 1000, AW_BLEND); //淡入淡出
return 0;
}
二.添加WM_CLOSE消息处理代码:
void CMainFrame::OnClose()
{
AnimateWindow(GetSafeHwnd(), 1000, AW_HIDE|AW_CENTER); //四周向中间收缩
CFrameWnd::OnClose();
}
三.最后在文件StdAfx.h文件的开头加入如下代码以使AnimateWindow函数能够被正确调用:
#undef WINVER
#define WINVER 0x500
2.制作圆角矩形窗口
在文档的框架类中添加WM_SIZE消息响应代码:
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CRgn m_rgn;
CRect rc;
GetWindowRect(&rc); //获得窗口矩形
rc -= rc.TopLeft();
m_rgn.CreateRoundRectRgn(rc.left, rc.top, rc.right, rc.bottom, 100, 100); //根据窗口矩形创建一个圆角矩形
SetWindowRgn(m_rgn, TRUE); //根据圆角矩形指定的区域改变窗口的形状
}
3.为对话框添加右键菜单
一.在资源创建对话框中选择Menu项并单击New按钮自动创建ID为IDR_MENU1的菜单,为该菜单添加一个菜单项File,并在File菜单项下添加Cut,Copy和Paste三个菜单(为这三个菜单添加消息响应代码)
如:
void CExampleDlg::OnCut()
{
AfxMessageBox("Cut"); //弹出对话框
}
void CExampleDlg::OnCopy()
{
AfxMessageBox("Copy"); //弹出对话框
}
void CExampleDlg::OnPaste()
{
AfxMessageBox("Paste"); //弹出对话框
}
二.当在窗口内右击时,窗口将接收到WM_CONTEXTMENU消息,在该消息的处理函数中装载右键菜单,并调用CMenu::TrackPopupMenu函数便可显示右键菜单,添加对话框WM_CONTEXTMENU消息处理函数的响应代码如下:
void CExampleDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
CMenu menu;
menu.LoadMenu(IDR_MENU1); //读取资源
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON, point.x, point.y, this) //弹出自定义右键菜单
}
4.动态设置窗口的图标
方法一:
首先import一个ID为IDI_ICON1的图标,然后在对话框的OnInitDialog()函数中添加如下代码:
BOOL CLangziDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
HICON hlcon = AfxGetApp()->LoadIcon(IDI_ICON1); //读取图标资源
ASSERT(hlcon);
AfxGetMainWnd()->SendMessage(WM_SETICON, FALSE, (LPARAM)hlcon);
return TRUE;
}
方法二: 把对话框的构造函数中的这句m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);里的IDR_MAINFRAME改成IDI_ICON1即你要设置的图标
5.为对话框添加状态条
一.在资源创建对话框中选择String Table项并单击New按钮自动创建一个String Table资源,打开String Table资源,并且添加四个ID分别为IDS_panel1,IDS_panel2,IDS_panel3,IDS_panel4的字符串资源
二.为对话框类添加一个成员变量
public:
CStatusBar m_wndStatusBar;
在对话框的初始化函数OnInitDialog()中添加一下代码来加载状态条:
BOOL CLangziDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CRect rect;
GetClientRect(rect); //获得客户区的大小
//状态条
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators, sizeof(indicators) / sizeof(UINT))) //创建状态栏
{
TRACE0("未能创建状态栏!\n");
return -1;
}
m_wndStatusBar.MoveWindow(0, rect.bottom-20, rect.right, 20); //移动状态栏
return TRUE;
}
三.在对话框类的实现文件中欲编译头的后面定义上面的indicators(在文档中indicators已自动生成在框架类CMainFrame中,修改之即可)
static UINT indicators[] = {
IDS_panel1,
IDS_panel2,
IDS_panel3,
IDS_panel4,
};
5.1.在窗口的状态栏中显示时间
一.在资源String Table 中添加一个新的字符串ID为IDS_clock,并把字符串标题(caption)改成:00-00-00 00:00:00
二.修改对话框实现文件中的indicators如下:
static UINT indicators[] = {
IDS_panel1,
IDS_panel2,
IDS_panel3,
IDS_panel4,
IDS_clock,
};
三.在对话框的初始化函数OnInitDialog()中添加以下程序以设置一个500ms刷新一次的定时器:
SetTimer(1, 500, NULL);
通过ClassWizard为对话框类添加WM_TIMER消息响应代码,这样每隔500ms就会在状态栏中显示系统当前时间:
如:
void CLangziDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if (nIDEvent==1)
{
CTime t;
t = CTime::GetCurrentTime(); //取得当前时间
CString str;
str = t.Format("%Y-%m-%d %H:%M:%S"); //设置时间格式,转换为字符串
m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(IDS_clock), str);
}
CDialog::OnTimer(nIDEvent);
}
最后要添加WM_CLOSE消息响应代码来销毁定时器:
void CLangziDlg::OnClose() //销毁定时器
{
KillTimer(1);
CDialog::OnClose();
}
6. 在菜单中显示图标
新建一个单文档(或对话框)应用程序,然后为视类(获为对话框类)添加三个成员变量:
public:
CBitmap bm_New;
CBitmap bm_Open;
CBitmap bm_Save;
向程序中添加三个位图资源,他们ID分别为IDB_BMP_NEW,IDB_BMP_OPEN,IDB_BMP_SAVE,然后在视类(或在对话框类)的构造函数中将三个位图资源读取到bm_New,bm_Open和bm_Save中:
CLangziView::CLangziView()
{
bm_New.LoadBitmap(IDB_BMP_NEW);
bm_New.LoadBitmap(IDB_BMP_OPEN);
bm_New.LoadBitmap(IDB_BMP_SAVE); //读取位图资源
}
最后在视类的OnDraw函数中(或在对话框类的OnPaint函数中)通过SetMenuItemBitmaps函数向菜单中增加位图
CWND* parent = GetParent();
CMenu* pmenubar = parent->GetMenu();
CMenu* pmenu = pmenubar->GetSubMenu(0); //得到第1个主菜单
pmenu->SetMenuItemBitmaps(0, MF_BYPOSITION, &bm_New, &bm_New);
pmenu->SetMenuItemBitmaps(1, MF_BYPOSITION, &bm_Open, &bm_Open);
pmenu->SetMenuItemBitmaps(2, MF_BYPOSITION, &bm_Save, &bm_Save);