前两天boss让写写界面,看程序看的头晕脑转,就在网上瞎搜搜,写些关于MFC的界面设计。
包括:窗体背景图、窗体大小、按钮背景图、控件透明、编辑框重影、exe图标、托盘程序。
下面逐一代码解析:
窗体背景图:
背景图,要在OnPaint() 函数中进行修改。窗体不再使用默认,在else中添加代码
//改变窗体大小
MoveWindow(0,0,500,400,TRUE);
//设置背景
CPaintDC dc(this);
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP2);//在资源里添加的位图名
CBrush brush;
brush.CreatePatternBrush(&bitmap);
CBrush* pOldBrush = dc.SelectObject(&brush);
dc.Rectangle(0,0,600,400); //宽、长;
dc.SelectObject(pOldBrush);
//CDialog::OnPaint();
按钮背景图:
CBitmapButton m_BitmapButton;//声明按钮位图对象
实现代码:
//按钮添加图片
m_BitmapButton.LoadBitmaps(IDB_BITMAP1);//位图名称
m_BitmapButton.SubclassDlgItem(IDC_BConn,this);//按钮ID,句柄
m_BitmapButton.SizeToContent();//把按钮设置成位图大小
控件透明:
重载OnCtlColor函数
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);//透明
添加消息函数:
BEGIN_MESSAGE_MAP(CClientDlg, CDialog)
//......
ON_WM_CTLCOLOR()//透明
//}}AFX_MSG_MAP
//......
END_MESSAGE_MAP()
实现:
//重载——透明
HBRUSH CClientDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hBrush = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// CTLCOLOR_BTN Button control//按钮
// CTLCOLOR_DLG Dialog box//对话框
// CTLCOLOR_EDIT Edit control//编辑框
// CTLCOLOR_LISTBOX List-box control//列表框
// CTLCOLOR_MSGBOX Message box//消息框
// CTLCOLOR_SCROLLBAR Scroll-bar control
// CTLCOLOR_STATIC Static control//——这些控件都能设置透明
if(nCtlColor == CTLCOLOR_EDIT)
{
pDC->SetBkMode(TRANSPARENT); //设置透明
pDC->SetTextColor(RGB(255, 0, 255)); // 设置文本颜色
return (HBRUSH)::GetStockObject(NULL_BRUSH);
}
return hBrush;
编辑框重影:
添加消息框的事件处理函数OnEnChange,
//方法1
CRect rtlbl;
GetDlgItem(IDC_EPort)->GetWindowRect(&rtlbl);
ScreenToClient(&rtlbl); //转到客户端界面
InvalidateRect(&rtlbl);//刷新对话框背景
方法二
GetDlgItem(IDC_EPort)->GetParent()->RedrawWindow();//会闪动
exe图标:
如果资源里的图标有多个,exe会自动选择较小的作为自己的图标。
在窗体的构造函数中修改图标名即可
m_hIcon = AfxGetApp()->LoadIcon(AFX_IDI_STD_MDIFRAME);//资源里添加的图标名
托盘程序:
#define WM_USER_NOTIFYICON WM_USER+1//可以随意定义个
private: NOTIFYICONDATA m_notify;//添加托盘类对象
afx_msg LRESULT CClientDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam);//设置托盘图标
afx_msg void OnNotifyIcon(WPARAM wParam,LPARAM IParam);//响应鼠标函数,单击图标显示程序
设置对象
m_notify.cbSize=sizeof NOTIFYICONDATA;
m_notify.hWnd=this->m_hWnd; //句柄
m_notify.uID=AFX_IDI_STD_MDIFRAME;//托盘图标
m_notify.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(AFX_IDI_STD_MDIFRAME));
strcpy(m_notify.szTip,"侯飒飒托盘程序测试");//托盘的提醒内容
m_notify.uCallbackMessage=WM_USER_NOTIFYICON;//
m_notify.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;
Shell_NotifyIcon(NIM_ADD,&m_notify);//显示托盘
托盘的消息处理
LRESULT CClientDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message) //判断消息类型
{
case WM_USER_NOTIFYICON:
if(lParam==WM_LBUTTONDBLCLK)
{
//鼠标双击,主窗口出现
if(AfxGetApp()->m_pMainWnd->IsWindowVisible()) //判断窗口当前状态
{
AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE); //隐藏窗口
}
else
{
AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW); //显示窗口
}
}
else if(lParam==WM_RBUTTONDOWN)
{ //鼠标右键单击弹出选单
CMenu menu;
menu.LoadMenu(IDD_CLIENT_DIALOG); //载入事先定义的选单
CMenu *pMenu=menu.GetSubMenu(0);
CPoint pos;
GetCursorPos(&pos);
pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());
}
break;
case WM_SYSCOMMAND:
//如果是系统消息
if(wParam==SC_MINIMIZE)
{
//接收到最小化消息时主窗口隐藏
AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE);
return 0;
}
if(wParam==SC_CLOSE)
{
::Shell_NotifyIcon(NIM_DELETE,&m_notify); //关闭时删除系统托盘图标
}
break;
}
return CDialog::WindowProc(message, wParam, lParam);
}
void CClientDlg::OnNotifyIcon(WPARAM wParam,LPARAM IParam)
{
if ((IParam == WM_LBUTTONDOWN) || (IParam == WM_RBUTTONDOWN))
{
ModifyStyleEx(0,WS_EX_TOPMOST);
ShowWindow(SW_SHOW);
Shell_NotifyIcon(NIM_DELETE, &m_notify);//消除托盘图标
}
}