托盘图标MFC课程设计---调整对话框背景颜色
MFC课程设计
MFC
课题名称:调整对话框背景颜色
共 17页 1
MFC课程设计
目录
1.设计描述 ...................................................................................... 3
1.1课题背景 .............................................................................. 3
1.2功能描述 .............................................................................. 3 2.设计分析 ...................................................................................... 4
2.1应用的类 .............................................................................. 4
2.2成员函数 .............................................................................. 4 3.源代码及图形 ............................................................................... 6 4.设计
.................................................................................... 17
4.1个人心得 ............................................................................ 17
4.2参考文献 ............................................................................ 17
共 17页 2
MFC课程设计
1.设计描述
1.1课题背景
本课题主要是在为了让自己更加了解在MFC中框架类中的各种函数的应用。本程序是在VC6.0中使用AppWizard创建基于对话框的应用程序。 1.2功能描述
本程序能够改变对话框的背景颜色。对话框中有滚动条和滑动块,通过调节滚动条或滑动块来改变对话框的背景颜色。
除此以外,该对话框可以最小化,最大化功能。点击关闭按钮时,会出现提示对话框,提示对话框中有“退出应用程序”,“返回到托盘”,“不再提示”选择按钮供你选择。另外托盘图标是闪动变换的,托盘图标还可以打开子菜单。 最小化:
最大化:
共 17页 3
MFC课程设计
2.设计分析
本程序用到了一些基于对话框的类,实现对话框的各种功能
2.1应用的类
图2.1 ClassView
2.2成员函数
程序里的成员函数如下
1、BOOL CWLHDlg::OnInitDialog()
2、void CWLHDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
3、HBRUSH CWLHDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
4、BOOL CWLHDlg::AddTray(HWND hWnd, LPSTR lpszTip)//添加图标到托盘
5、BOOL CTestDlg::RemoveTray(HWND hwnd)//删除托盘中的图标
6、BOOL CTestDlg::ModifyTray(HWND hwnd,UINT uID)//修改托盘中的图标
7、void CWLHDlg::OnTimer(UINT nIDEvent) //更换图标
8、void CTestDlg::OnTrayNotify(WPARAM wParam, LPARAM lParam) 9、void CTestDlg::OnDestroy()//结束图标更换
10、void CTestDlg::OnOpen()//打开子菜单项
共 17页 4
MFC课程设计 11、void CTestDlg::OnExit()//退出子菜单项 12、void CWLHDlg::OnAbout() //关于子菜单 13、void CWLHDlg::OnClose() //关闭背景对话框 14、void CWLHDlg::Inquiry()//询问对话框
各个类的成员函数和数据成员如图2.2-1,图2.2-2所示
图2.2-1
图2.2-2
共 17页 5
MFC课程设计
3.源代码及图形
BOOL CWLHDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
m_scrollRed.SetScrollRange(0, 255);
m_sliderBlue.SetRange(0, 255);
m_sliderGreen.SetRange(0, 255);
共 17页 6
MFC课程设计
m_nBlue = m_nGreen = m_nRedValue = 192;
UpdateData( FALSE );
m_scrollRed.SetScrollPos(m_nRedValue);
SetWindowText("调整对话框背景颜色");
return TRUE; // return TRUE unless you set the focus to a control
}
void CWLHDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
int nID = pScrollBar->GetDlgCtrlID(); // 获取对话框中控件ID值
if (nID == IDC_SCROLLBAR_RED) { // 若是滚动条产生的水平滚动消息
switch(nSBCode){
case SB_LINELEFT: m_nRedValue--; // 单击滚动条左边箭头
break;
case SB_LINERIGHT: m_nRedValue++; // 单击滚动条右边箭头
break;
case SB_PAGELEFT: m_nRedValue -= 10;
break;
case SB_PAGERIGHT: m_nRedValue += 10;
break;
case SB_THUMBTRACK: m_nRedValue = nPos;
break;
}
if (m_nRedValue<0) m_nRedValue = 0;
if (m_nRedValue>255) m_nRedValue = 255;
m_scrollRed.SetScrollPos(m_nRedValue);
}
Invalidate(); // 使对话框无效,强迫系统重绘对话框
CDialog::OnHScroll(nSBCode, nPos, pScrollBar); }
共 17页 7
MFC课程设计
HBRUSH CWLHDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
// TODO: Return a different brush if the default is not desired
UpdateData(TRUE);
COLORREF color = RGB(m_nRedValue, m_nGreen, m_nBlue);
m_Brush.Detach(); // 使画刷和对象分离
m_Brush.CreateSolidBrush(color); // 创建颜色画刷
pDC->SetBkColor( color ); // 设置背景颜色
return (HBRUSH)m_Brush; // 返回画刷句柄,以便系统使此画刷绘制对话框
return hbr;
}
以上代码实现对话框背景颜色调整功能
图3-1
//添加图标到托盘
BOOL CWLHDlg::AddTray(HWND hWnd, LPSTR lpszTip) {
NOTIFYICONDATA tnid;
共 17页 8
MFC课程设计
tnid.cbSize=sizeof(NOTIFYICONDATA);
tnid.hWnd=hWnd;
tnid.uFlags=NIF_MESSAGE | NIF_ICON | NIF_TIP;
tnid.uCallbackMessage=WM_ICON_NOTIFY;
tnid.hIcon=AfxGetApp()->LoadIcon(IDI_ICON1);
strcpy(tnid.szTip,lpszTip);
return Shell_NotifyIcon(NIM_ADD, &tnid); }
添加图标到托盘如下图图3-2
图3-1
//删除托盘中的图标
BOOL CTestDlg::RemoveTray(HWND hwnd)//删除托盘中的图标
{
NOTIFYICONDATA tnid;
tnid.cbSize=sizeof(NOTIFYICONDATA);
tnid.hWnd=hwnd;
return Shell_NotifyIcon(NIM_DELETE,&tnid); }
//修改托盘中的图标
共 17页 9
MFC课程设计
BOOL CTestDlg::ModifyTray(HWND hwnd,UINT uID)//修改托盘中的图标
{
NOTIFYICONDATA tnid;
tnid.cbSize=sizeof(NOTIFYICONDATA);
tnid.hWnd=hwnd;
tnid.uFlags=NIF_ICON;
tnid.hIcon=AfxGetApp()->LoadIcon(uID);
return Shell_NotifyIcon(NIM_MODIFY, &tnid); }
//更换图标
void CWLHDlg::OnTimer(UINT nIDEvent) //更换图标
{
// TODO: Add your message handler code here and/or call default
staticUINT nIDs[]={IDI_ICON1,IDI_ICON2,IDI_ICON3,IDI_ICON4};
static int nIndex=1;
ModifyTray(m_hWnd,nIDs[nIndex]);
nIndex=++nIndex%4;
CDialog::OnTimer(nIDEvent);
}
//结束图标更换
void CTestDlg::OnDestroy()//结束图标更换
{
CDialog::OnDestroy();
// TODO: Add your message handler code here
KillTimer(1);
RemoveTray(m_hWnd);
}
void CTestDlg::OnTrayNotify(WPARAM wParam, LPARAM lParam)
{
共 17页 10
MFC课程设计
if(WM_RBUTTONDOWN==lParam)
{
CMenu menu;
menu.LoadMenu(IDR_MENU1);
CPoint point;
GetCursorPos(&point);//得到鼠标位置
CMenu *popup=menu.GetSubMenu(0);
popup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,
point.x, point.y, this);
return;
}
if(WM_LBUTTONDOWN==lParam)
{
ShowWindow(SW_SHOWNORMAL);
SetForegroundWindow();
return;
}
}
图3-3
//打开子菜单项
void CTestDlg::OnOpen()//打开子菜单项
{
// TODO: Add your command handler code here
ShowWindow(SW_SHOWNORMAL);
SetForegroundWindow();
共 17页 11
MFC课程设计
}
//退出子菜单项
void CTestDlg::OnExit()//退出子菜单项
{
// TODO: Add your command handler code here
PostQuitMessage(0);
}
以上代码实现功能如下图
图3-4 图3-5
//关于对话框
void CWLHDlg::OnAbout()
{
// TODO: Add your command handler code here
MessageBox("WLH制作\n2011年12月","关于",MB_ICONEXCLAMATION |MB_OK);
}
//关闭背景对话框
void CWLHDlg::OnClose() //关闭背景对话框
{
// TODO: Add your message handler code here and/or call default
HKEY hKey;
if(ERROR_SUCCESS==RegOpenKeyEx(HKEY_LOCAL_MACHINE,"wlh",0,
KEY_READ,&hKey))
{
if(1==nCheck)
共 17页 12
MFC课程设计
{
if(0==nRadio)
{
PostQuitMessage(0);
}
else
{
AddTray(m_hWnd,"改变背景");
ShowWindow(SW_HIDE);
SetTimer(1,500,NULL);
}
}
else
{
Inquiry();
}
}
else
{
Inquiry();
}
RegCloseKey(hKey); }
//询问对话框
void CWLHDlg::Inquiry()//询问对话框
{
CInquiry inq;
inq.DoModal();//打开询问对话框
nRadio=inq.m_n;
if(inq.m_chk)//是否选择不再提示选框
共 17页 13
MFC课程设计
nCheck=1;//标志为1
else
nCheck=0;//标志为0
if(0==nRadio)//选择直接退出
{
PostQuitMessage(0);
}
else//选择返回托盘
{
AddTray(m_hWnd,"改变背景");
ShowWindow(SW_HIDE);//隐藏主窗口
SetTimer(1,500,NULL);
}
}
所用功能的实现如下图
运行结果:
图3-6 最大化:
共 17页 14
MFC课程设计
图3-7
最小化:
图3-8
点击运行关闭按钮:
图3-9
共 17页 15
MFC课程设计
图3-10
托盘子菜单:
图3-11
托盘图标:
-12 图3
图3-13(四种图片更替变换) 关于程序:
图3-14
共 17页 16
MFC课程设计
4.设计总结
4.1个人心得
在课程设计的实践中,我学到很多的知识,积累了不少的经验。我深刻意识到自己在学习中的弱点,同时也找到了克服这些弱点的方法,就是要利用更多的时间去上机实验,多编写程序。要理论联系实际
4.2参考文献
1.《深入浅出MFC简体第二版》
2.严华峰. Visual C++课程设计案例精编. 北京:中国水利水电出版社,2002 3.《VisualC++6.0MFC时尚编程百例》 网冠科技编著 机械工业出版社2002 4.《MFC程序设计》 唐克编著 北京希望电子出版社 2002 5.孙鑫视频
共 17页 17