⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex5_2_2.cpp

📁 这是书上的代码
💻 CPP
字号:
#include<afxwin.h>
#include"res.h"
#define WM_THREADEXIT WM_USER+103
#define WM_SHOWTHREAD WM_USER+100
#define WM_THREADQUIT WM_USER+107
BOOL threadflag=FALSE;
static HWND thexit;
NOTIFYICONDATA nid; 
class mywindow: public CFrameWnd
{  public:
	mywindow();
	~mywindow();
	BOOL PreCreateWindow(CREATESTRUCT &cs)
	{
		cs.hMenu=LoadMenu(NULL,MAKEINTRESOURCE(IDR_MENU1));
		return CFrameWnd::PreCreateWindow(cs);
	}
	afx_msg void OnExit()
	{
	   PostMessage(WM_CLOSE);
	}
	afx_msg void OnPaint()
	{  CPaintDC paintDC(this);
	   paintDC.TextOut(20,20,"这是用户界面线程");
	}
	afx_msg void OnThreadQuit()
	{
	   PostMessage(WM_CLOSE);
	}
	
	DECLARE_MESSAGE_MAP()
};
mywindow::mywindow()
{
	Create(NULL,"用户界面线程"); thexit=GetSafeHwnd();
}
mywindow::~mywindow()
{
	threadflag=FALSE;
}
class UIthread: public CWinThread
{
	DECLARE_DYNCREATE(UIthread)
	public:
	BOOL InitInstance()
	{	
		CFrameWnd *mythread=new mywindow;
		m_pMainWnd=mythread;
		mythread->ShowWindow(SW_SHOW);
		return TRUE;
	}
};
	IMPLEMENT_DYNCREATE(UIthread,CWinThread)
BEGIN_MESSAGE_MAP(mywindow,CFrameWnd)
ON_COMMAND(ID_EXIT,OnExit)
ON_WM_PAINT()
ON_MESSAGE(WM_THREADQUIT,OnThreadQuit)
END_MESSAGE_MAP()
class myframewindow: public CFrameWnd
{  public:
	myframewindow();
	~myframewindow();
	afx_msg void OnPaint()
	{  CPaintDC paintDC(this);
	   paintDC.TextOut(10,5,"这是主线程窗口程序");
	}
	afx_msg void OnWinexit()
	{
		PostMessage(WM_CLOSE);
	}
	afx_msg void OnThreadExit()
	{
		::PostMessage(thexit,WM_THREADQUIT,0,0);
	}
	void enablewin(CCmdUI *PCmd);
	afx_msg LRESULT onshowthread(WPARAM wParam,LPARAM lParam);
	DECLARE_MESSAGE_MAP()
};
	myframewindow::myframewindow()
	{
	  Create(NULL,(LPCTSTR)"这是主线程窗口");
	}
	myframewindow::~myframewindow()
	{
	  Shell_NotifyIcon(NIM_DELETE,&nid);
	}
	void myframewindow::enablewin(CCmdUI *PCmd)
{
	PCmd->Enable(threadflag);
}

LRESULT myframewindow::onshowthread(WPARAM wParam,LPARAM lParam)
{
	if(wParam!=IDI_ICON1)
		return 0;
	switch(lParam)
	{ case WM_RBUTTONUP: 
		{
	  LPPOINT lpoint=new tagPOINT;
	  GetCursorPos(lpoint);
	  CMenu menu;
	  menu.CreatePopupMenu();  
	  menu.AppendMenu(MF_STRING,WM_DESTROY,"退  出");
	  menu.AppendMenu(MF_SEPARATOR);
	  menu.AppendMenu(MF_STRING,WM_THREADEXIT,"关闭窗口");
	  ::SetForegroundWindow(nid.hWnd);
	  menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);
	  HMENU hmenu=menu.Detach();
	  menu.DestroyMenu();
	  delete lpoint;
	  	  			}
	break;
	case WM_LBUTTONDBLCLK:
		{
			if(!threadflag)
			{ AfxBeginThread(RUNTIME_CLASS(UIthread)); threadflag=TRUE; }
			 
		}
	}
	return 1;
}

BEGIN_MESSAGE_MAP(myframewindow,CFrameWnd)
ON_WM_PAINT()
ON_COMMAND(WM_DESTROY,OnWinexit)
ON_COMMAND(WM_THREADEXIT,OnThreadExit)
ON_UPDATE_COMMAND_UI(WM_THREADEXIT,enablewin)
ON_MESSAGE(WM_SHOWTHREAD,onshowthread)
END_MESSAGE_MAP()

class mainthd: public CWinApp
{
	public:
		mainthd(): CWinApp("Main Thread!"){}
		BOOL InitInstance()
		{
			HICON hIcon=LoadIcon(IDI_ICON2);
			CFrameWnd *myframe=new myframewindow;
			m_pMainWnd=myframe;
			nid.cbSize=sizeof(NOTIFYICONDATA);
			nid.hWnd=myframe->m_hWnd;
			nid.uID=IDI_ICON1;
			nid.uFlags=NIF_ICON|NIF_TIP|NIF_MESSAGE;
			nid.uCallbackMessage=WM_SHOWTHREAD;
			nid.hIcon=LoadIcon(IDI_ICON1);
			strcpy(nid.szTip,"用户界面线程及托盘演示");
			Shell_NotifyIcon(NIM_ADD,&nid);
			myframe->SetIcon(hIcon,FALSE);
			myframe->ShowWindow(SW_HIDE);
			return TRUE;
		}
}mainthread;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -