MFC 增加工具条类的问题

原创 2013年12月02日 14:37:43

#pragma once

class CToolbar
{
public:
 CToolbar(void);
public:
 ~CToolbar(void);
 void  SetCtrlAction(HWNDhWnd,int nIndex);
};

 

#include "StdAfx.h"
#include "Toolbar.h"

CToolbar::CToolbar(void)
{
}

CToolbar::~CToolbar(void)
{
}
// TODO: 在此处引用程序需要的其他头文件
///////////////////////////////////////////
#define WM_AMS_ACTION_UNKNOWN     -1         //无法识别的类型;
#define WM_AMS_ACTION_SCLICK    //控件的单击;
#define WM_AMS_ACTION_DLICK    //控件的双击;
#define WM_AMS_ACTION_CLOSE    //关闭;
#define WM_AMS_ACTION_MIN     //最小化;
#define WM_AMS_ACTION_MAX     //最大化;
#define WM_AMS_ACTION_RESTORE    //还原;
#define WM_AMS_ACTION_ENABLE    //Enable;
#define WM_AMS_ACTION_DISABLE    //Disable;
#define WM_AMS_ACTION_SHOW     //显示;
#define WM_AMS_ACTION_HIDE            //隐藏;
#define WM_AMS_ACTION_TOPMOST  10         //置顶;
#define WM_AMS_ACTION_NOTOPMOST   11         //取消置顶;
#define WM_AMS_ACTION_SETFOCUSE   12         //设置焦点;
#define WM_AMS_ACTION_LOSTFOCUSE   13         //去除焦点;

#define WM_AMS_CTRLTYPE_BTN          //普通按钮;
#define WM_AMS_CTRLTYPE_RADIOBTN           //单选按钮
#define WM_AMS_CTRLTYPE_CHECKBOX           //复选按钮;


#define  WM_AMS_CHECKSTATE_CHECK         //选中
#define WM_AMS_CHECKSTATE_UNCHECK    // 不选中;

#define WM_AMS_TYPE_LISTBOX                //listbox控件
#define WM_AMS_TYPE_COMBOBOX               //combobox控件;


BOOL SetItemAction(HWND hwnd,int nAction)
{
 if (hwnd == NULL)
  return FALSE;

 switch(nAction)
 {
 case WM_AMS_ACTION_SCLICK:
  ::SendMessage(hwnd,WM_LBUTTONDOWN, 0, 0);
  ::SendMessage(hwnd,WM_LBUTTONUP, 0, 0);
  break;
 case WM_AMS_ACTION_DLICK:
  ::SendMessage(hwnd,WM_LBUTTONDOWN, 0, 0);
  ::SendMessage(hwnd,WM_LBUTTONUP, 0, 0);
  ::SendMessage(hwnd,WM_LBUTTONDOWN, 0, 0);
  ::SendMessage(hwnd,WM_LBUTTONUP, 0, 0);
  break;
 case WM_AMS_ACTION_CLOSE:
  ::SendMessage(hwnd,WM_CLOSE,0,0);
  break;
 case WM_AMS_ACTION_MIN:
  ::ShowWindow(hwnd,SW_MINIMIZE);
  break;
 case WM_AMS_ACTION_MAX:
  ::ShowWindow(hwnd,SW_MAXIMIZE);
  break;
 case WM_AMS_ACTION_RESTORE:
  ::ShowWindow(hwnd,SW_RESTORE);
  break;
 case WM_AMS_ACTION_ENABLE:
  ::EnableWindow(hwnd,TRUE);
  break;
 case WM_AMS_ACTION_DISABLE:
  ::EnableWindow(hwnd,FALSE);
  break;
 case WM_AMS_ACTION_SHOW:
  ::ShowWindow(hwnd,SW_SHOW);
  break;
 case WM_AMS_ACTION_HIDE:
  ::ShowWindow(hwnd,SW_HIDE);
  break;
 case WM_AMS_ACTION_TOPMOST:
  ::SetWindowPos(hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE| SWP_NOSIZE);
  break;
 case WM_AMS_ACTION_NOTOPMOST:
  ::SetWindowPos(hwnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);

 default:
  break;

 }
 return TRUE;
}

BOOL SetWindowTopmost(HWND hWnd,BOOL isTopmost)
{
 if (hWnd == NULL)
  return FALSE;

 if(isTopmost)
 {
  BOOL bIsMinimized =::IsIconic(hWnd);
  //如果该窗口最小化了,则恢复原状;
  if (bIsMinimized)
  {
   SetItemAction(hWnd,WM_AMS_ACTION_RESTORE);
   Sleep(500);
  }
  //将该窗口置顶
  SetItemAction(hWnd,WM_AMS_ACTION_TOPMOST);
 }
 else
  SetItemAction(hWnd,WM_AMS_ACTION_NOTOPMOST);

 return TRUE;
}

//执行操作
void  CToolbar::SetCtrlAction(HWND hWnd,intnIndex)
{
 if (!hWnd)
  return;


 int nBtnCount =::SendMessage(hWnd,TB_BUTTONCOUNT,(WPARAM)0,(LPARAM)0);
 if(nIndex >= nBtnCount)
  return;

 HWND hMainWnd =::GetAncestor(hWnd,GA_ROOT);//回复句柄到指定窗口的父窗口
 //鼠标事件
 POINT ptOld = {0};
 GetCursorPos(&ptOld);//屏幕坐标显示光标的位置

 DWORD dwProcessID = 0;
 unsigned long nSize=0;

 RECT rectItem={0};
 HANDLE hProcess = NULL;
 RECT *pRect = NULL;

 GetWindowThreadProcessId(hWnd,&dwProcessID);//找到指定窗口的创建者并返回其线程ID

 hProcess =OpenProcess(PROCESS_ALL_ACCESS,false,dwProcessID);//打开一个已经存在的线程对象,并返回其句柄
 if (!hProcess)
 {
  //::MessageBox(NULL,_T("获取进程句柄操作失败!"),_T("错误!"),MB_OK);//在程序运行过程中消息提示窗体
  return ;
 }

 pRect=(RECT*)VirtualAllocEx(hProcess, NULL,sizeof(RECT), MEM_COMMIT,PAGE_READWRITE);//储备或提交的内存区域内的指定进程的虚拟地址空间
 if (!pRect)
 {
  //MessageBox(NULL,_T("无法分配内存!"),_T("错误!"),MB_OK);
 }

 WriteProcessMemory(hProcess, pRect,&rectItem, sizeof(RECT), NULL);//写rectItem到指定的进程的内存区域
 ::SendMessage(hWnd, TB_GETITEMRECT,(WPARAM)nIndex, (LPARAM)pRect);
 ReadProcessMemory(hProcess,pRect,&rectItem,sizeof(RECT),&nSize);//Thisfunction reads memory in a specified process. The entire area to beread must be accessible

 POINT pt={0};
 pt.x = rectItem.left +(rectItem.right-rectItem.left)/2;
 pt.y = rectItem.top +(rectItem.bottom-rectItem.top)/2;
 ::ClientToScreen(hWnd,&pt);//转换成屏幕坐标

 SetCursorPos(pt.x, pt.y);//该函数把光标移到屏幕的指定位置

 //将该窗口置顶
 HWND hForeWnd =NULL;        
 DWORDdwForeID;        
 DWORDdwCurID;        
 hForeWnd =::GetForegroundWindow();        
 dwCurID = ::GetCurrentThreadId();        
 dwForeID = ::GetWindowThreadProcessId(hForeWnd,NULL);   
 ::AttachThreadInput( dwCurID, dwForeID,TRUE);
 SetWindowTopmost(hMainWnd,TRUE);
 Sleep(80);

 mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0,0,0);
 mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0,0);

 Sleep(30);
 SetWindowTopmost(hMainWnd,FALSE);
 ::AttachThreadInput(dwCurID, dwForeID,FALSE);

 VirtualFreeEx(hProcess, pRect, 0,MEM_RELEASE);

 SetCursorPos(0, 0);
 CloseHandle(hProcess);

}

相关文章推荐

利用MFC编程在工具条中增加组合框控件

我们知道,Visual C++所提供的标准工具条中基本上只有一些简单的诸如文档打开、存储以及一些编辑功能按钮,而Visual C++自身的工具条功能十分丰富,尤其是工具条中内嵌的组合框控件十分方便。实...

VC 2010 + MFC : 在对话框里面加入工具条CMFCToolBar

VC 2010 + MFC : 在对话框里面加入工具条CMFCToolBar By:章永辉              VC 2010 + MFC 新库的资料很少,以下给出本人的实现方...

第十三讲 MFC工具条和状态栏

第十三讲 MFC工具条和状态栏 Windows控制窗口 Windows (Windows95或者以上版本) 提供了系列通用控制窗口,其中包括工具条(ToolBar)、状态栏...
  • mitesi
  • mitesi
  • 2014年03月26日 23:18
  • 1259

MFC 在对话框中添加工具条

1.在ResourceView里加入Toolbar资源,命名IDR_TOOLBAR12.在主程序的.h文件中加入变量: CToolBar m_wndtoolbar;//添加...

MFC 控制工具条的停靠位置

转自: 在VC中开发大型应用程序时,工具条通常是程序中必不可少的重要功能因素,其中工具条在整个窗口中的停靠位置尤其关键,它直接影响到程序界面的外观形象。下面针对笔者实际开发中各类工具条停靠位置的...

在C++/MFC框架应用程序里,当浮动工具条被拖离主窗口后,一般都有一个“关闭”按钮,

在C++/MFC框架应用程序里,当浮动工具条被拖离主窗口后,一般都有一个“关闭”按钮,如图一所示: 图一  本来这个按钮完全是按照Windows应用程序的UI设计规范而设计的,也就...

MFC的工具条和状态栏

 Windows控制窗口 Windows (Windows95或者以上版本) 提供了系列通用控制窗口,其中包括工具条(ToolBar)、状态栏(StatusBar)、工具条提示窗口(Tool...

MFC分析工具条和状态条的创建的分析

工具条和状态条的在comctl32.lib当中实现,要想得到TOOLBAR和STATUS的支持,程序必须添加CommCtrl头文件,并且在初始化TOOLBAR和STATUSBAR之前,调用函数Init...

MFC窗口创建以及工具条的浮动

在上一篇博客的分析当中,主窗口的创建是在LoadFrame当中完成的。LoadFrame函数主要调用两个函数完成这个工作,第一步向系统注册相应的窗口信息,第二步创建相应的窗口。这正好符合WIN32的窗...

MFC文档应用程序CToolBar:设置两个工具条并列停靠到同一条边上

这是新工作的第四天,按上级的要求开发一个便民小程序,就要用到标题中说的,这下可难到我啦,查了MSDN并没有发现类似把某个toolbar放在另一个的右边的函数,所以自己百度了一下,还好发现高人指出一条明...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC 增加工具条类的问题
举报原因:
原因补充:

(最多只允许输入30个字)