📄 ex5_2_2.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 + -