前兩天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,
//方法1CRect 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);//消除托盤表徵圖 } }