MFC界面设计

前两天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);//消除托盘图标
         }
    }



你可能感兴趣的:(shell,user,delete,mfc,exe,dialog)