with two methods to create a toolbar To create a toolbar resource using the Resource Editor, follow these steps: //在资源编辑器中创建一个toolbar资源
Create a toolbar resource//常见一个toolbar资源
Construct the CToolBar object//构造一个toolbar对象
Call the Create (or CreateEx) function to create the Windows toolbar and attach it to the CToolBar object//调用creat或者createx函数创建窗口toolbar并且将其与toolbar对象关联
Call LoadToolBar to load the toolbar resource//调用 LoadToolBar载入toolbar资源
Otherwise, follow these steps:
Construct the CToolBar object//构造CToolBar对象
Call the Create (or CreateEx) function to create the Windows toolbar and attach it to the CToolBar object//调用Create (or CreateEx)函数创建窗口toolbar并关联到CToolBar 对象
Call LoadBitmap to load the bitmap that contains the toolbar button images//调用LoadBitmap 载入包含了toolbar按钮的bitmap载入图标 *** 作,图标可以通过资源管理器导入。
Call SetButtons to set the button style and associate each button with an image in the bitmap//调用SetButtons 设置按钮类型并且将每一个按钮和关联
All the button images in the toolbar are taken from one bitmap, which must contain one image for each button All images must be the same size; the default is 16 pixels wide and 15 pixels high Images must be side by side in the bitmap//所有的工具栏按钮都来自于一个位图,且每一个按钮必须包含一个位图。所有的必须有相同的大小,默认时16像素宽,15像素高。必须边挨边在为图中。
上面是MSDN中的说明,很清楚的说明了如何向工具栏中添加图标。
1、在资源管理器中添加一个工具栏资源
2、定义一个工具栏对象并且和工具栏资源关联
3、用loadbitmap函数将图标载入到工具栏,LoadBitmap 函数的使用可以查阅MSDN
4、用SetButtons 将按钮和关联起来就行了
众所周知,在使用ActionBar的时候,一堆的问题:这个文字能不能定制,位置能不能改变,图标的间距怎么控制神马的,由此暴露出了ActionBar设计的不灵活。为此官方提供了ToolBar,并且提供了supprot library用于向下兼容。Toolbar之所以灵活,是因为它其实就是一个ViewGroup,我们在使用的时候和普通的组件一样,在布局文件中声明。
Part1:ToolBar的引入step1:设置style主题,主要任务是去除原本的ActionBar
<style name="AppBaseTheme" parent="ThemeAppCompatLightNoActionBar"><!--LightDarkActionBar表示默认的黑色主体的Actionbar-->
<!-- Customize your theme here -->
<item name="colorPrimary">@color/sky_blue</item>
<item name="colorPrimaryDark">@color/deep_blue</item>
<item name="colorAccent">@color/material_deep_teal_200</item>
<item name="android:textColorPrimary">@color/white</item>
</style>
colorPrimary表示标题栏ActionBar的颜色;colorPrimaryDark表示状态栏的颜色; colorAccent表示输入框,按钮等被选中时的颜色; textColorPrimary表示标题栏(ActionBar或者ToolBar)中字体的颜色
当然啦,第一步的实现也可以在程序代码中或者style里静态或者动态地去掉ActionBar
step2:在你需要引入ToolBar的布局文件中引入ToolBar:
<androidsupportv7widgetToolbar
android:id="@+id/main_toolbar"
android:theme="@style/ThemeOverlayAppCompatDark"//这里的主题可以用来反衬toolBar的overFlow颜色
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/sky_blue"
></androidsupportv7widgetToolbar>
因为colorPrimary是给ActionBar设定颜色的,因此如果我们使用ToolBar,就需要自己去设定ToolBar的背景颜色
setp3:在代码中获取ToolBar控件以及实例化:
Toolbar toolbar = (Toolbar) findViewById(Ridmain_toolbar);
toolbarsetNavigationIcon(Rmipmapic_toc_white_24dp);//设置ToolBar头部图标
toolbarsetTitle("ToolBar");//设置标题,也可以在xml中静态实现
setSupportActionBar(toolbar);//使活动支持ToolBar
Part2:ToolBar里各SearchView的引入:
setp1:在menu/xxxxxml的菜单布局文件将SearchView以菜单条目的方式加入到ToolBar中
<item
android:id="@+id/action_search"
android:icon="@drawable/ic_search"
app:actionViewClass="androidsupportv7widgetSearchView"
app:showAsAction="ifRoom|collapseActionView"
android:inputType="textCapWords"
android:imeOptions="actionSearch"
android:title="search" />
这中添加条目的方式和添加普通控件的方式是一样的,这里需要对showAsAction具体说明以下:
ifRoom表示当toolBar空间足够时,显示图标在标题栏中,否则将它隐藏到ToolBar末端的overFlow中,点开overFlow只显示item的title
CollapseActionView表示当前空间点开之后占据整个ToolBar空间
always表示总是显示在标题栏中,当我们长按该item后,就会以Toast的方式显示出它的title
never表示总是隐藏在overFlow中
step2:在Java程序代码中实例SearchView
覆写onCreateOptionsMenu方法,为什么要在这个方法里实现对SearchView的实例化呢?因为toolBar里的点击事件都以菜单的形式实现的,如果我们需要让它隐藏到overFlow中,并且点击菜单键并唤出,那么就只需要把它的显示方式设置为never即可。
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflaterinflate(Rmenumenu_main, menu);
MenuItem menuItem = menufindItem(Ridaction_search);//在菜单中找到对应控件的item
SearchView searchView = (SearchView) MenuItemCompatgetActionView(menuItem);
Logd("Tag", "menu create");
MenuItemCompatsetOnActionExpandListener(menuItem, new MenuItemCompatOnActionExpandListener() {//设置打开关闭动作监听
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
ToastmakeText(MainActivitythis, "onExpand", ToastLENGTH_LONG)show();
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
ToastmakeText(MainActivitythis, "Collapse", ToastLENGTH_LONG)show();
return true;
}
});
return superonCreateOptionsMenu(menu);
首先使用 Toolbar 来代替ActionBar
,这样我们就能够把ActionBar嵌入到我们的View体系中,然后我们"禁用"系统的status bar,由 DrawerLayout
来处理status bar,最后抽屉部分往上移,或者裁剪掉status bar那一部分。
控制Status bar
在你的values-v21里面添加新的主题,并设置一下属性:
values-v21/themesxml
<style name="AppTheme">
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
这里解释一下:
windowDrawsSystemBarBackgrounds ,将它设置为true,系统将在你的window里面绘制status
bar,默认为 TRUE
,之所以要写出来是因为你的theme有可能是继承过来的,确保为true。(在这里小插曲一下,因调试时,总以为注释了这段代码就以为是false,程
序员思维害苦了我。另外从命名来看,Android把它称为system bar,可能是为了与能被我们处理的status bar区分开而做的改变。)
statusBarColor 设置为透明是因为我们不再需要系统的status bar,因为我们无法控制它的位置,后面我们将交由 DrawerLayout 来处理。
使用DrawerLayout
首先,你的布局文件应该是和这个类似的:
<androidsupportv4widgetDrawerLayout
xmlns:android="url"
android:id="@+id/my_drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<!-- Your normal content view -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- We use a Toolbar so that our drawer can be displayed
in front of the action bar -->
<androidsupportv7widgetToolbar
android:id="@+id/my_awesome_toolbar"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:minHeight="attr/actionBarSize"
android:background="attr/colorPrimary" />
<!-- The rest of your content view -->
</LinearLayout>
<!-- The navigation drawer -->
<ScrimInsetsFrameLayout xmlns:android="rul"
xmlns:app="url"
android:layout_width="304dp"
android:layout_height="match_parent"
android:layout_gravity="left"
android:background="@android:color/white"
android:elevation="10dp"
android:fitsSystemWindows="true"
app:insetForeground="#4000">
<!-- Your drawer content -->
</ScrimInsetsFrameLayout>
</androidsupportv4widgetDrawerLayout>
在这里布局里面我们用到了一个的开源类 ScrimInsetsFrameLayout ,它的主要作用就是利用 fitsSystemWindows
的回调方法 fitSystemWindows(Rect insets) 来获取status bar的大小,然后调整画布已达到去掉status
bar的效果,所以我们需要在ScrimInsetsFrameLayout 下设置 fitsSystemWindows
为true。当然你也可以不使用这个类,而改用 layout_marginTop 属性来达到效果。
insetForeground 这个属性是ScrimInsetsFrameLayout自带的,表示插入区域的前景色,我们设置为带透明的黑色#4000。别忘了使用这个属性需要添加如下代码到attrsxml里:
values/attrsxml
<declare-styleable name="ScrimInsetsView">
<attr name="insetForeground" format="reference|color" />
</declare-styleable>
自此,我们已经实现了将DrawerLayout抽屉的那一部分显示在 Toolbar 和systembar(为了和下面的status
bar区分,我们称为system bar)之间了,可是system bar的颜色被我们设置了透明,所以我们接下来要改变status
bar的颜色。
改变Status bar的颜色
你可能已经注意到刚才的布局里面 DrawerLayout 的 fitsSystemWindows 属性设置了为true,这是因为我们要在代码里面使用了 DrawerLayout 设置status bar颜色的方法:
// 在这里我们获取了主题暗色,并设置了status bar的颜色
TypedValue typedValue = new TypedValue();
getTheme()resolveAttribute(RattrcolorPrimaryDark, typedValue, true);
int color = typedValuedata;
// 注意setStatusBarBackgroundColor方法需要你将fitsSystemWindows设置为true才会生效
DrawerLayout drawerLayout = (DrawerLayout) findViewById(Ridmy_drawer_layout);
drawerLayoutsetStatusBarBackgroundColor(color);
使用ToolBar来代替ActionBar
在代码里面这样设置:
Toolbar toolbar = (Toolbar) findViewById(Ridmy_awesome_toolbar);
setSupportActionBar(toolbar);
菜单(标准菜单#32768)
窗口主菜单可用GetMenu获得
然后用EnableMenuItem激活菜单项
上下文菜单获取比较麻烦
可以给目标窗口装载钩子
截获它的WM_INITMENUPOPUP
工具条(标准工具条ToolbarWindow32)
发送TB_GETBUTTON消息获取工具条按钮信息包含按钮ID等
发送TB_ENABLEBUTTON激活工具条按钮
但是TB_GETBUTTON有一个参数是结构体
需要在目标窗口的进程内开辟空间
可参考下面的代码
HANDLE
handle,
buf;
HWND
hwnd
=
(HWND)/
工具条句柄
/;
DWORD
pid;
TBBUTTON
btn;
GetWindowThreadProcessId(hwnd,
&pid);
handle
=
OpenProcess(PROCESS_ALL_ACCESS,
FALSE,
pid);
buf
=
VirtualAllocEx(handle,
NULL,
1,
MEM_COMMIT,
PAGE_READWRITE);
SendMessage(hwnd,
TB_GETBUTTON,
1,
(LPARAM)buf);
ReadProcessMemory(handle,
buf,
&btn,
sizeof(TBBUTTON),
NULL);
SendMessage(hwnd,
TB_ENABLEBUTTON,
btnidCommand,
MAKELPARAM(TRUE,
0));
SendMessage(hwnd,
TB_INDETERMINATE,
btnidCommand,
MAKELPARAM(FALSE,
0));
VirtualFreeEx(handle,
buf,
0,
MEM_RELEASE);
CloseHandle(handle);
状态栏(标准状态栏msctls_statusbar32)
发送SB_GETTEXT消息来获取某部分的文本
同样需要到目标窗口的进程内开辟空间
不过有些状态栏是自绘的
可能没有文本
参考下面的代码
TCHAR
szText[256];
HANDLE
handle,
buf;
HWND
hwnd
=
(HWND)/
状态栏句柄
/;
DWORD
pid;
GetWindowThreadProcessId(hwnd,
&pid);
handle
=
OpenProcess(PROCESS_ALL_ACCESS,
FALSE,
pid);
buf
=
VirtualAllocEx(handle,
NULL,
1,
MEM_COMMIT,
PAGE_READWRITE);
SendMessage(hwnd,
SB_GETTEXT,
1/
需要获取文本的部分
/,
(LPARAM)buf);
ReadProcessMemory(handle,
buf,
szText,
sizeof(szText),
NULL);
VirtualFreeEx(handle,
buf,
0,
MEM_RELEASE);
CloseHandle(handle);
推荐个学习交流群:8721441o7
1、 构造CToolBar类型的对象 CToolBar tool ;
2、 调用CreateEx()函数 toolCreateEx(…) ;
3、 在资源编辑器中新建一个工具栏资源,假定ID为IDT_MYTOOL
4、 调用CToolBar的函数LoadToolBar(IDT_MYTOOL)
;
5、 (可选)如果想让工具条可以停靠,那么可以调用toolEnableDocking(TRUE)
;此后还必须调用父窗口的EnableDocking(TRUE);意思是父窗口可以被停靠。
6、 (可选)如果希望工具条可以隐藏和显示,需要调用ShowControlBar(CControlBar
pcontrol) ;
至此,工具栏就添加完成了。
接下来我们希望让工具栏中的按钮可以在我们鼠标经过时显示提示信息,如图:
实现这个功能需要做以下工作:
1、 在cpp文件的OnInitDialog()中添加:toolEnableToolTips(TRUE);或者在CreateEx()函数中设置CBRS_TOOLTIPS标识。
在头文件中添加
BOOL OnToolTipsNotify(UINT id,NMHDR pNMHDR,LRESULT pResult);
2、 在Cpp文件添加如下红色代码:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnToolTipsNotify) //声明
工具栏提示 通知消息 ( 必须手动添加)
END_MESSAGE_MAP()
3、定义如下函数:
BOOLCMainFrame::OnToolTipsNotify(UINT id, NMHDR pNMHDR,LRESULT pResult)
{
TOOLTIPTEXT pT =(TOOLTIPTEXT)pNMHDR ; //将pNMHDR转换成TOOLTIPTEXT指针类型数据
UINT nID =pNMHDR->idFrom ; //获取工具条上按钮的ID
if(nID== IDC_XXX) //如果nID是希望获取的ID,那么就设置相应提示信息到TOOLTIPTEXT结构体的lpszText中。
{
pT->lpszText = "显示文字";
}
return FALSE;
}
是一个软件
主要特性如下: 从任何网页进行搜索 使用搜索框,轻松地从任何网页进行搜索。使用下拉菜单进行精确查找,如本地列表、图像等。智能输入功能将根据您键入的内容,为您提供常用的搜索条件。 防网页欺诈和防病毒保护 使用 Windows Live One Care Advisor,您可以更放心地搜索网页。Microsoft 仿冒网站筛选增强了对网页欺诈和财务欺骗行为的保护。我们的阻止技术得到进一步改进,有助于防止意外共享个人信息。根据需要获取免费的基本病毒扫描保护。 随时使用您所选择的信息 根据需要自定义。在工具栏上添加删除或组织按钮,或通过访问 Windows Live Gallery 查找自定义按钮和加载项,以获取所需信息。 从您所在网页获取更多信息 在网页中高亮显示相关信息文本。无需离开页面便可获得地图、驾驶路线、天气预报及其他信息。 选项卡式浏览 在一个浏览器窗口中轻松管理多个网页。快速打开新选项卡以及实现网页间的快速切换;使用“我的选项卡”保存一组经常访问的网页并可通过单击打开。 订阅源 对某些内容很感兴趣?使用 Windows Live Toolbar,您可以检测并通过单击添加订阅源,或通过 Onfolio 源管理器添加、管理以及阅读订阅源。无影响, 要说有的话,就是有点不大方便 但是,机器要想运行快,携带那么多包袱会有轻装上阵好吗?
以上就是关于MFC 获取及修改CBitmap对象的单个像素全部的内容,包括:MFC 获取及修改CBitmap对象的单个像素、如何使用 SearchView 工具栏中Android、android怎样动态设置toolbar背景等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)