前两天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函数。
有的控件需要修改OwnerDraw属性为True。
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);//消除托盘图标 } }