MFC 工具栏SOP 线程创建非模式化窗口 实现拓展工具栏

自己在学习工具栏的时候,做的笔记
MFC 工具栏SOP 线程创建非模式化窗口 实现拓展工具栏_第1张图片

1 实现基本工具栏

1.1 在Dlg.h文件中声明变量和定义资源ID

#define ID_BUTTONS 501

CToolBar m_toolbar;  //工具栏
CImageList m_imageList;  //工具栏图片
CImageList m_hotImageList;  //工具栏热点图片
CReBar m_Rebar;  //可以在位图上显示子窗口口 用来显示背景
CString str;  //用于鼠标停留时的消息

1.2 在资源视图中导入Bitmap资源图片

MFC 工具栏SOP 线程创建非模式化窗口 实现拓展工具栏_第2张图片
可以在右击资源符号中查看具体ID值

MFC 工具栏SOP 线程创建非模式化窗口 实现拓展工具栏_第3张图片

1.3 在Dlg.cpp文件中的OnInitDialog()方法中导入Bitmap与按钮ID

//大小要一致
m_imageList.Create(70, 70, ILC_COLOR24 | ILC_MASK, 1, 1);
m_hotImageList.Create(70, 70, ILC_COLOR24 | ILC_MASK, 1, 1);

CBitmap bmp;

bmp.LoadBitmap(IDB_BITMAP2);
m_imageList.Add(&bmp, RGB(255, 255, 255));
bmp.DeleteObject();

bmp.LoadBitmap(IDB_BITMAP3);
m_hotImageList.Add(&bmp, RGB(255, 255, 255));
bmp.DeleteObject();

//按钮ID列表
UINT nArray[1];
nArray[0] = ID_BUTTONS;

m_toolbar.CreateEx(this);
m_toolbar.EnableToolTips();  //开启消息提示
m_toolbar.SetButtons(nArray,1); //注入按钮
m_toolbar.SetButtonText(0, _T("0")); //设置索引为0的按钮文本为"0"
m_toolbar.SetSizes(CSize(90, 90),CSize(80, 80)); //设置工具栏的大小 前一个CSize必须比后一个大!!!
m_toolbar.GetToolBarCtrl().SetImageList(&m_imageList); //设置图片列表
m_toolbar.GetToolBarCtrl().SetHotImageList(&m_hotImageList); //设置热点图片列表
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST0,0); //自适应放置工具栏

1.4 开启鼠标停靠信息提示

先在Dlg.h中增加函数声明

BOOL OnDisplay(UINT id,NMHDR* pNMHDR,LRESULT* pResult);

再Dlg.cpp中实现

TOOLTIPTEXT *pTTT=(TOOLTIPTEXT *)pNMHDR;
UINT nID=pNMHDR->idFrom;//获取工具栏按钮ID
UINT nIndex=m_toolbar.CommandToIndex(nID);//根据按钮ID获取索引
str.Format(_T("工具栏按钮%d"),nIndex);
pTTT->lpszText=str.GetBuffer(str.GetLength());//设置按钮提示信息
pTTT->hinst=AfxGetResourceHandle();
return TRUE;

增加消息映射宏开启提示

 ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnDisplay)

1.5 效果呈现

请添加图片描述
MFC 工具栏SOP 线程创建非模式化窗口 实现拓展工具栏_第4张图片

MFC 工具栏SOP 线程创建非模式化窗口 实现拓展工具栏_第5张图片

2 重绘窗口

2.1 新建一个Dialog资源

MFC 工具栏SOP 线程创建非模式化窗口 实现拓展工具栏_第6张图片

2.2 新建一个类继承CDialogEx

MFC 工具栏SOP 线程创建非模式化窗口 实现拓展工具栏_第7张图片

2.3 声明按钮资源ID宏和自定义消息ID

#define MESSAGE_CAD WM_USER+100
#define ID_CHILD_BUTTON_CAD 1001

2.4 声明工具栏和图片列表

CToolBar m_child_toolbar;
CImageList m_child_imageList;

2.5 声明WorkForCAD()函数并实现

void WorkForCAD();
m_child_imageList.Create(50,28,ILC_COLOR24 | ILC_MASK , 1, 1);
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP2);
m_child_imageList.Add(&bmp,RGB(255,255,255));
bmp.DeleteObject();
UINT nArray[1];
for(int i = 0 ; i < 1; i++){
	nArray[1] = ID_CHILD_BUTTON_CAD + i;
}
m_child_toolbar.CreateEx(this);
m_child_toolbar.SetButtons(nArray,1);
m_child_toolbar.SetButtonText(0, _T("0"));
m_child_toolbar.SetSizes(CSize(80,80),CSize(70,70));
m_child_toolbar.GetToolBarCtrl().SetImageList(&m_child_imageList);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);

2.6 增加按键消息声明并实现

void OnBnClickForCAD1();
CString s = _T("成功");
//向主界面发送MESSAGE_CAD消息
::PostMessage(AfxGetMainWnd()->m_hWnd , MESSAGE_CAD,(WPARAM)_T(""),(LPARAM)&s);

2.7 增加按键消息映射宏

ON_COMMAND(ID_CHILD_BUTTON_CAD,&CChildDlg::OnBnClickForCAD1)

3 带工具栏弹出窗口

3.1 导入CChildDlg

#include "ChildDlg.h"

3.2 声明线程函数并实现

friend UINT ThreadForCAD(LPVOID lpParameter);
CMyToolbarDlg* pDlg = (CMyToolbarDlg*)lpParameter;
CChildDlg* pTestDlg = new CChildDlg();
pTestDlg->Create(IDD_DIALOG1,NULL);
pTestDlg->SetWindowTextW((LPCTSTR)_T("0"));
pTestDlg->WorkForCAD();
pTestDlg->MoveWindow(680,420,600,200,FALSE);
pTestDlg->ShowWindow(SW_SHOW);
MSG msg = {0};
while(GetMessage(&msg,NULL,0,0)){
	TranslateMessage(&msg);
	DispatchMessage(&msg);
}

3.3 声明自定义消息ID

#define MESSAGE_CAD WM_USER+100

3.4 重写WindowProc函数

if(message == MESSAGE_CAD){
	AfxMessageBox(_T("成功"));
	//接收到消息后就发送关闭线程消息,将窗口关闭
	PostThreadMessage(m_thread->m_nThreadID,WM_QUIT,0,0);
}
return CDialogEx::WindowProc(message,wParam,lParam);

MFC 工具栏SOP 线程创建非模式化窗口 实现拓展工具栏_第8张图片

3.5 声明事件变量和线程变量

CEvent g_hEvent;
CWinThread* m_thread;

3.6 增加消息映射函数声明并实现

ON_COMMAND(ID_BUTTONS,&CMyToolbarDlg::OnBnClickForCAD);
SetEvent(g_hEvent);
if(m_thread==NULL){
	m_thread = AfxBeginThread(ThreadForCAD, (LPVOID)this,THREAD_PRIORITY_NORMAL,0 , NULL,NULL);
}
else{
	//如果上一个线程还没有关闭,则发送关闭线程消息,先将前一个窗口关闭,再生成新的窗口
	PostThreadMessage(m_thread->m_nThreadID,WM_QUIT,0,0);
	m_thread = AfxBeginThread(ThreadForCAD, (LPVOID)this,THREAD_PRIORITY_NORMAL,0 , NULL,NULL);
}
WaitForSingleObject(g_hEvent,INFINITE);
MSG msg;
while(::PeekMessageA(&msg, m_hWnd,WM_USER + 100, WM_USER +100,PM_REMOVE)){
	if(msg.message == MESSAGE_CAD){
		WindowProc(msg.message,msg.wParam,msg.lParam);
		break;
	}
}

3.7 增加按钮消息映射宏

ON_COMMAND(ID_BUTTONS,&CMyToolbarDlg::OnBnClickForCAD);

TIP:

  1. m_imageList创建的时候cx,cy参数很重要,图片列表add图片时,初始化设置大 ,加小图片会不显示,反之则显示不完全;
  2. m_toolbar.SetSizes(CSize(90,90),CSize(80,80)) 前一个CSize必须比后一个大,不然会报错;

你可能感兴趣的:(MFC,mfc,c++)