精华内容
下载资源
问答
  • 定制按钮及CALayer

    千次阅读 2011-12-01 15:56:36
    by Matt Long 原文地址: ...因此程序员们在用IB设定按钮的Background属性时,不得不借助图形工具以创建按钮的背景图。这也是不错的解决方案,但正如帖子中所述,

    by Matt Long

    原文地址: http://www.cimgf.com/2010/01/28/fun-with-uibuttons-and-core-animation-layers/

    乍一看, UIButton从定制的角度来说基本上不会提供你所想要的东西。因此程序员们在用IB设定按钮的Background属性时,不得不借助图形工具以创建按钮的背景图。这也是不错的解决方案,但正如帖子中所述,CoreAnimation layers有一种更简单的方法,不需要你创建任何图片。

    一、改变背景色

    在IB中,当你使用Custom类型的Button时,你可以指定按钮的背景色。但当你运行时按钮就失去了圆角特性,你看到的仅仅是一个方块。因为custombutton没有定义任何属性默认值。你必须自己去定义它们,这就需要使用Core Animation Layer。

    提示:编写代码之前,需要导入QuartzCore框架到工程中,然后#import<QuartzCore/QuartzCore.h>。我会通常会把它放在.pch文件中。

    IB没有干的事情,你只能通过代码来做。例如,如果你想做一个圆角且红色背景的按钮,你需要将按钮链接到你的viewcontroller的出口中,然后在Xcode中通过它的layer属性修改按钮的下列属性。

     [[button layer] setCornerRadius:8.0f];

    [[button layer] setMasksToBounds:YES];

    [[button layer] setBorderWidth:1.0f];

    上述代码将layer的圆角半径设为8.0,-setMasksToBounds:方法告诉layer将位于它之下的layer都遮盖住。这是必须的,这样会使圆角不被遮住。

    最后,将border设为1.0,将显示出按钮的边框。默认边框色为黑色,你可以用-setBorderColor:方法修改为其他颜色,参数使用CGColorRef类型(例如[[UIColorgreenColor]CGColor]会显示绿色边框)。

     

    iPhone 开发技巧 :  任何UIView都有可能是圆角的。所有的UIView都有一个root layer。简单地在view的layer上调用-setCornerRadius:和-setMasksToBounds:方法,你就会获得圆角效果。

    可在IB或者通过代码来改变背景色。可使用两种代码,用layer或者直接在UIView上setBackgroundColor:

    // CoreAnimation way

    [[button layer] setBackgroundColor:[[UIColor redColor]CGColor]];

    // UIView way

    [button setBackgroundColor:[UIColorredColor]];

    二者区别在于:layer使用CGColorRef参数,UIView使用UIColor参数。

    二、渐变色

    示例程序使用了一些很亮很花哨的颜色渐变效果,建议你不要学我。两种颜色之间过渡得更自然一些会更好,当然你也可以完全凭个人喜好。

    为达到这样的渐变效果,我使用了CAGradientLayer并把它加到了按钮的layer树中。实际上,为了演示,我创建了一个UIButton子类,封装了CAGradientLayer的创建和绘制,实现如下。

    #import"ColorfulButton.h"

    @implementation ColorfulButton

    @synthesize _highColor;

    @synthesize _lowColor;

    @synthesize gradientLayer;

    - (void)awakeFromNib;

    {    

    // Initialize the gradient layer

        gradientLayer =[[CAGradientLayer alloc] init];

         // Set itsbounds to be the same of its parent 

       [gradientLayersetBounds:[self bounds]];

         // Centerthe layer inside the parent layer

         [gradientLayersetPosition:

                    CGPointMake([self bounds].size.width/2,

                           [self bounds].size.height/2)];

           // Insertthe layer at position zero to make sure the    

      // text of the button is notobscured    

    [[self layer] insertSublayer:gradientLayer atIndex:0];

          // Set the layer's corner radius   

     [[self layer] setCornerRadius:8.0f];    

    // Turn onmasking    

    [[self layer] setMasksToBounds:YES];    

    // Display aborder around the button      

    // with a 1.0pixel width    

    [[self layer] setBorderWidth:1.0f];  

    }  

    - (void)drawRect:(CGRect)rect

    {    

    if (_highColor && _lowColor){ 

           //Set the colors for the gradient to the  

           

    // two colorsspecified for high and low

             [gradientLayer setColors:

                         [NSArrayarrayWithObjects:

                                (id)[_highColor CGColor],

                                 (id)[_lowColor CGColor],nil]];    

    }

         [superdrawRect:rect];

    }  

    - (void)setHighColor:(UIColor*)color{

         // Set thehigh color and repaint

         [selfset_highColor:color];

         [[selflayer] setNeedsDisplay];

    }  

    - (void)setLowColor:(UIColor*)color{

         // Set thelow color and repaint

         [selfset_lowColor:color];

         [[selflayer] setNeedsDisplay];

    }  

    - (void)dealloc {

         // Releaseour gradient layer

         [gradientLayerrelease];

         [superdealloc];

    }

    @end

     

    现在,我在IB中创建了一个按钮,并将class设置为ColorfulButton,随后在viewcontroller中设置一个出口。

    如果不设置渐变色,按钮将用IB中指定的背景色进行渲染。如果想使用渐变色特性,则我需要在viewcontroller中设置其对应属性:

    - (void)viewDidLoad {

         [superviewDidLoad];

           [button1setHighColor:[UIColor redColor]];

         [button1setLowColor:[UIColor orangeColor]];

           [button2setHighColor:[UIColor blueColor]];

         [button2setLowColor:[UIColor lightGrayColor]];

           [button3setHighColor:[UIColor yellowColor]];

         [button3setLowColor:[UIColor purpleColor]];

           [button4setHighColor:[UIColor cyanColor]];

         [button4setLowColor:[UIColor magentaColor]];

    }

    在这个demo中有4个按钮。这些按钮在接口中声明如下:

    #import<UIKit/UIKit.h>

    #import"ColorfulButton.h"  

    @interface ColorfulButtonsViewController :UIViewController {

         IBOutlet ColorfulButton *button1;

         IBOutlet ColorfulButton *button2;

         IBOutlet ColorfulButton *button3;

         IBOutlet ColorfulButton *button4;

    }

    @end

    CAGrandientLayer 支持把颜色数组加到它的colors中,并自动用这些颜色以平均分布的形式做线型渐变。它还允许指定分布模式,为简单起见,我只用了两种颜色:highColor、lowColor。如果你想加入更复杂的颜色渐变,你可以修改ColorfulButton类。



    展开全文
  • 在组策略中发现“帐户: 使用空密码的本地帐户只允许进行控制台登录”选项是无法修改的,因为考虑到组策略和注册表一一对应,因此这里考虑直接使用注册表来修改。修改方法: 找到注册表中如下键值: [HKEY_LOCAL_...

    在组策略中发现“帐户: 使用空密码的本地帐户只允许进行控制台登录”选项是无法修改的,因为考虑到组策略和注册表一一对应,因此这里考虑直接使用注册表来修改。修改方法:

    找到注册表中如下键值:

    [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Lsa] 

    "limitblankpassworduse"=dword:00000001。如下图所示:


    解释说明:很多人的帐户是不加密码的。这样,当局域网中别的电脑访问本机时,会弹出错误提示:登录失败:用户帐户限制………。这是XP系统的一条安全策略造成的,防止别人趁你空密码时进入你的电脑。如果你觉得无所谓,不必做这些限制,那就把它设为:已停用。

    附:组策略对应于注册表位置汇总

    组策略安全选项对应注册表项汇总  
    在组策略中的位置:  
      计算机设置->Windows设置->安全设置->本地策略->安全选项  
        
      详细列表:  
    [MACHINE\System\CurrentControlSet\Control\Lsa]  
      值名:AuditBaseObjects  
      含义:对全局系统对象的访问进行审计  
      类型:REG_DWORD  
      数据:0=停用  
        
      1=启用  
        
      值名:CrashOnAuditFail  
      含义:如果无法纪录安全审计则立即关闭系统  
      类型:REG_DWORD  
      数据:0=停用  
        
      1=启用  
        
      值名:FullPrivilegeAuditing  
      含义:对备份和还原权限的使用进行审计  
      类型:REG_BINARY  
      数据:0=停用  
        
      1=启用  
        
      值名:LmCompatibilityLevel  
      含义:LAN Manager  
        
      身份验证级别  
      类型:REG_DWORD  
      数据:0=发送LM &  
        
      NTLM响应  
      1=发送LM & NTLM -  
        
      若协商使用NTLMv2安全  
        
      2=仅发送NTLM响应  
      3=仅发送NTLMv2响应  
      4=仅发送NTLMv2响应\拒绝LM  
      5=仅发送NTLMv2响应\拒绝LM &  
        
      NTLM  
        
      值名:RestrictAnonymous  
      含义:对匿名连接的额外限制(通常用于限制IPC$空连接)  
      类型:REG_DWORD  
      数据:0=无.依赖于默认许可权限  
        
      1=不允许枚举SAM账号和共享  
      2=没有显式匿名权限就无法访问  
        
      值名ubmitControl  
      含义:允许服务器操作员计划任务(仅用于域控制器)  
      类型:REG_DWORD  
      数据:0=停用  
        
      1=启用  
        
      [MACHINE\System\CurrentControlSet\Control\Print\Providers\LanMan  
        
      Print  
        
      Services\Servers]  
      值名:AddPrinterDrivers  
      含义:防止用户安装打印机驱动程序  
      类型:REG_DWORD  
      数据:0=停用  
        
      1=启用  
        
      [MACHINE\System\CurrentControlSet\Control\Session  
        
      Manager\Memory  
        
      Management]  
      值名:ClearPageFileAtShutdown  
      含义:在关机时清理虚拟内存页面交换文件  
      类型:REG_DWORD  
      数据:0=停用  
        
      1=启用  
        
      [MACHINE\System\CurrentControlSet\Control\Session  
        
      Manager]  
      值名rotectionMode  
      含义:增强全局系统对象的默认权限 (例如 Symbolic  
        
      Links)  
      类型:REG_DWORD  
      数据:0=停用  
        
      1=启用  
        
      [MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters]  
      值名:EnableSecuritySignature  
      含义:对服务器通讯进行数字签名  
        
      (如果可能)  
      类型:REG_DWORD  
      数据:0=停用  
        
      1=启用  
        
      值名:RequireSecuritySignature  
      含义:对服务器通讯进行数字签名  
        
      (总是)  
      类型:REG_DWORD  
      数据:0=停用  
        
      1=启用  
        
      值名:EnableForcedLogOff  
      含义:当登录时间用完时自动注销用户  
        
      (本地)  
      类型:REG_DWORD  
      数据:0=停用  
        
      1=启用  
        
      值名:AutoDisconnect  
      含义:在断开会话产所需要的空闲时间  
      类型:REG_DWORD  
      数据:分钟数  
        
       [MACHINE\System\CurrentControlSet\Services\LanmanWorkstation\Parameters]  
      值名:EnableSecuritySignature  
      含义:对客户端通讯进行数字签名  
        
      (如果可能)  
      类型:REG_DWORD  
      数据:0=停用  
        
      1=启用  
        
      值名:RequireSecuritySignature  
      含义:对客户端通讯进行数字签名  
        
      (总是)  
      类型:REG_DWORD  
      数据:0=停用  
        
      1=启用  
        
      值名:EnablePlainTextPassword  
      含义:发送未加密的密码以连接到第三方SMB服务器  
      类型:REG_DWORD  
      数据:0=停用  
        
      1=启用  
        
      [MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters]  
      值名isablePasswordChange  
      含义:防止计算机帐户密码的系统维护  
      类型:REG_DWORD  
      数据:0=停用  
        
      1=启用  
        
      值名ignSecureChannel  
      含义:安全通道: 对安全通道数据进行数字签名  
        
      (如果可能)  
      类型:REG_DWORD  
      数据:0=停用  
        
      1=启用  
        
      值名ealSecureChannel  
      含义:安全通道: 对安全通道数据进行数字加密  
        
      (如果可能)  
      类型:REG_DWORD  
      数据:0=停用  
        
      1=启用  
        
      值名:RequireSignOrSeal  
      含义:安全通道: 对安全通道数据进行数字加密或签名  
        
      (总是)  
      类型:REG_DWORD  
      数据:0=停用  
        
      1=启用  
        
      值名:RequireStrongKey  
      含义:安全通道: 需要强 (Windows 2000 或以上版本)  
        
      会话密钥  
      类型:REG_DWORD  
      数据:0=停用  
        
      1=启用  
        
      [MACHINE\Software\[M$]\Driver  
        
      Signing]  
      值名olicy  
      含义:未签名驱动程序的安装操作  
      类型:REG_BINARY  
      数据:0=默认安装  
        
      1=允许安装但发出警告  
        
      2=禁止安装  
        
      [MACHINE\Software\[M$]\Non-Driver  
        
      Signing]  
      值名olicy  
      含义:未签名非驱动程序的安装操作  
      类型:REG_BINARY  
      数据:0=默认安装  
        
      1=允许安装但发出警告  
        
      2=禁止安装  
        
      [MACHINE\Software\[M$]\Windows\CurrentVersion\Policies\System]  
      值名isableCAD  
      含义:禁用按  
        
      CTRL+ALT+DEL  
        
      进行登录的设置  
      类型:REG_DWORD  
      数据:0=停用  
        
      1=启用  
        
      值名ontDisplayLastUserName  
      含义:登录屏幕上不要显示上次登录的用户名  
      类型:REG_DWORD  
      数据:0=停用  
        
      1=启用  
        
      值名:LegalNoticeCaption  
      含义:用户试图登录时消息标题  
      类型:REG_SZ  
      数据:标题文本  
        
      值名:LegalNoticeText  
      含义:用户试图登录时消息文字  
      类型:REG_SZ  
      数据:消息文字  
        
      值名hutdownWithoutLogon  
      含义:登录屏幕上不要显示上次登录的用户名  
      类型:REG_DWORD  
      数据:0=停用  
        
      1=启用  
        
      [MACHINE\Software\[M$]\Windows  
        
      NT\CurrentVersion\Setup\RecoveryConsole]  
      值名ecurityLevel  
      含义:故障恢复控制台:  
        
      允许自动系统管理级登录  
      类型:REG_DWORD  
      数据:0=停用  
        
      1=启用  
        
      值名etCommand  
      含义:故障恢复控制台:  
        
      允许对所有驱动器和文件夹进行软盘复制和访问  
      类型:REG_DWORD  
      数据:0=停用  
        
      1=启用  
        
      [MACHINE\Software\[M$]\Windows  
        
      NT\CurrentVersion\Winlogon]  
      值名:AllocateCDRoms  
      含义:只有本地登录的用户才能访问  
        
      CD-ROM  
      类型:REG_SZ  
      数据:0=停用  
        
      1=启用  
        
      值名:AllocateDASD  
      含义:允许弹出可移动 NTFS  
        
      媒体  
      类型:REG_SZ  
      数据:0=Administrators  
        
      1=Administrators 和 Power users  
      2=Administrators 和 Interactive  
        
      users  
        
      值名:AllocateFloppies  
      含义:只有本地登录的用户才能访问软盘  
      类型:REG_SZ  
      数据:0=停用  
        
      1=启用  
        
      值名:CachedLogonsCount  
      含义:可被缓冲保存的前次登录个数  
        
      (在域控制器不可用的情况下)  
      类型:REG_SZ  
      数据:次数,如10次  
        
      值名asswordExpiryWarning  
      含义:在密码到期前提示用户更改密码  
      类型:REG_DWORD  
      数据:天数,缺省是14天  
        
      值名cRemoveOption  
      含义:智能卡移除操作  
      类型:REG_SZ  
      数据:0=无操作  
        
      1=锁定工作站  
      2=强制注销  
    =============================  
    组策略用户配置管理模板与注册表对应键值  
    一.组策略用户配置管理模板Windows组件  
    《Windows Update》  
    [HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesWindowsUpdate]  
    "DisableWindowsUpdateAccess"=dword:00000001(删除使用所有Windows Update功能的访问)(至少WINXP)  
    《组策略用户配置管理模板任务栏和开始菜单》  
    [HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesExplorer]  
    "NoSimpleStartMenu"=dword:00000001(强制典型菜单)(至少WINXP)  
    "NoCommonGroups"=dword:00000001(从开始->程序菜单删除公共程序组)(至少WIN2000)  
    "NoSMMyDocs"=dword:00000001(从开始->文档菜单删除我的文档图标)(至少WIN2000)  
    "NoNetworkConnections"=dword:00000001(从开始->设置菜单删除网络连接)(至少WIN2000)  
    "NoSMMyPictures"=dword:00000001(从开始菜单中删除"图片收藏"图标)(至少WINXP)  
    "ForceStartMenuLogOff"=dword:00000001(强制开始菜单显示注销)(至少WIN2000)  
    "Intellimenus"=dword:00000001(禁止个性化菜单)(至少WIN2000)  
    "NoInstrumentation"=dword:00000001(关闭用户跟踪)(至少WIN2000)  
    [注]这个设置防止系统跟踪用户使用的程序、用户导航的路径和用户打开的文档。系统用这个信息来自定义Windows功能,如个性化菜单。  
    "MemCheckBoxInRunDlg"=dword:00000001(将"在单独的内存空间运行"复选框添加到"运行"对话框)(至少 WIN2000)  
    [注]允许用户在专用的(不是共享的)虚拟DOS机器(VDM)进程中运行十六位程序。  
    "NoTaskGrouping"=dword:00000001(阻止在任务栏上对项目分组)(至少WINXP)  
    "LockTaskbar"=dword:00000001(锁定任务栏)(至少WINXP)  
    "NoTrayItemsDisplay"=dword:00000001(隐藏系统托盘图标)(至少WINXP)  
    "NoToolbarsOnTaskbar"=dword:00000001(不在任务栏显示任何自定义工具栏)(至少WINXP)  
    "GreyMSIAds""=dword:00000001(灰色显示开始菜单中安装不完全的程序的快捷方式)(至少WIN2000)  
    《组策略用户配置管理模板任务栏和开始菜单(WINXP新样式开始菜单)》  
    [HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionpoliciesExplorer]  
    "NoUserNameInStartMenu"=dword:00000001(隐藏用户名)  
    "NoStartMenuMorePrograms"=dword:00000001(隐藏所有程序)  
    "NoStartMenuMFUprogramsList"=dword:00000001(隐藏经常使用的程序)  
    "NoStartMenuMyMusic"=dword:00000001(删除我的音乐图标)  
    "NoStartMenuNetworkPlaces"=dword:00000001(删除网上邻居图标)  
    《组策略用户配置管理模板桌面》  
    [HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesNonEnum]  
    "{20D04FE0-3AEA-1069-A2D8-08002B30309D}"=dword:00000001(删除所有我的电脑图标)(至少 WINXP)  
    "{450D8FBA-AD25-11D0-98A8-0800361B1103}"=dword:00000001(删除所有我的文档图标)(至少 WIN2000)  
    "{645FF040-5081-101B-9F08-00AA002F954E}"=dword:00000001(删除所有回收站图标)(至少 WINXP)  
    [HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesExplorer]  
    "NoPropertiesMyComputer"=dword:00000001(删除我的电脑右键菜单的属性)(至少WIN2000SP3)  
    "NoPropertiesMyDocuments"=dword:00000001(删除我的文档右键菜单的属性)(至少WIN2000SP3)  
    "NoPropertiesRecycleBin"=dword:00000001(删除回收站右键菜单的属性)(至少WINXP)  
    "NoRecentDocsNetHood"=dword:00000001(不将打开的共享文件夹添加到网上邻居)(至少WIN2000)  
    "DisablePersonalDirChange"=dword:00000001(禁止更改我的文档路径)(至少WIN2000)  
    "NoDesktopCleanupWizard"=dword:00000001(删除桌面清理向导)(至少WINXP)  
    《组策略用户配置管理模板桌面活动桌面》  
    [HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesExplorer]  
    "ForceActiveDesktopOn"=dword:00000001(启用活动桌面,禁止用户关闭)(至少WIN2000)  
    [注]此设置的优先级比"NoActiveDesktop"要高。  
    [HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesSystem]  
    "Wallpaper"="ab"(指定桌面墙纸的位置,禁止用户更改)(至少WIN2000/ME)  
    "WallpaperStyle"="0"(0:居中,1:平铺,2:拉伸)(至少WIN2000/ME)  
    《组策略用户配置管理模板控制面板》  
    [HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesExplorer]  
    "NoControlPanel"=dword:00000001(禁止访问控制面板)(至少WIN2000)  
    "ForceClassicControlPanel"=dword:00000001(强制为传统控制面板样式)(至少WINXP)  
    "DisallowCpl"=dword:00000001(隐藏指定的控制面板项目)(至少WIN2000)  
    "RestrictCpl"=dword:00000001(只显示指定的控制面板项目)(至少WIN2000)  
    [注]以上两项设置需要添加相同名称的子键,然后在子键里面新建字符串,将其值设置为指定的控制面板项目,如desk  
     
    Windows Registry Editor Version 5.00  
    #《组策略\用户配置\管理模板\Windows组件\Windows资源管理器》  
    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]  
    "NoManageMyComputerVerb"=dword:00000001 ;隐藏"我的电脑"右键菜单的"管理" 
    "NoShellSearchButton"=dword:00000001;(从资源管理器中删除"搜索"按钮)  
    "NoLowDiskSpaceChecks"=dword:00000001;(禁止硬盘空间不足的警告)  
    "NoHardwareTab"=dword:00000001;(从控制面板的鼠标,键盘、声音和音频设备以及驱动器的属性对话框中删除硬件选项卡)  
    "NoSecurityTab"=dword:00000001;(从文件及文件夹属性中删除安全选项卡)  
    "NoChangeAnimation"=dword:00000001;(禁止更改菜单动画设置的UI)  
    "NoChangeKeyboardNavigationIndicators"=dword:00000001;(禁止更改显示属性中"使用ALT键之前始终隐藏键盘导航指示"选项)  
    "NoDFSTab"=dword:00000001;(从资源管理器中删除DFS选项卡)  
    "NoComputersNearMe"=dword:00000001;(网上邻居中没有"我附近的计算机")  
    "MaxRecentDocs"=dword:0000000f;(最近的文档最大数目)  
    "NoRunasInstallPrompt"=dword:00000001;(禁止使用"作为其他用户安装程序"对话框来安装程序)  
    "PromptRunasInstallNetPath"=dword:00000001;(在网络安装时显示"作为其他用户安装程序"对话框)  
    ;[注]只有当非管理员用户安装程序时,才需要提交其它登录凭据(作为其他用户安装程序)。  
    "NoCDBurning"=dword:00000001;(删除资源管理器的CD烧录功能)  
    "ConfirmFileDelete"=dword:00000001;(强制确认文件删除对话框)  
    "NoSharedDocuments"=dword:00000001;(从我的电脑删除共享文档)  
    "NoThumbnailCache"=dword:00000001;(关闭缩略图缓存)  
    "NoFileAssociate"=dword:00000001;(禁止更改文件夹选项中的文件类型)  
     
    #《组策略\用户配置\管理模板\Windows组件\Micorsoft Management Console》  
    [HKEY_CURRENT_USER\Software\Policies\Microsoft\MMC]  
    "RestrictAuthorMode"=dword:00000001;(禁止用户进入编辑模式)  
    "RestrictToPermittedSnapins"=dword:00000001;(限制用户只使用列表中特别允许的管理单元)  
    [HKEY_CURRENT_USER\Software\Policies\Microsoft\MMC\{8EAD3A12-B2C1-11d0-83AA-00A0C92C9D5D}]  
    "Restrict_Run"=dword:00000001;(禁止)(允许或禁止磁盘管理)  
    [HKEY_CURRENT_USER\Software\Policies\Microsoft\MMC\{8FC0B734-A0E1-11D1-A7D3-0000F87571E3}]  
    "Restrict_Run"=dword:00000001;(禁止)(允许或禁止组策略)  
    [HKEY_CURRENT_USER\Software\Policies\Microsoft\MMC\{975797FC-4E2A-11D0-B702-00C04FD8DBF7}]  
    "Restrict_Run"=dword:00000001;(禁止)(允许或禁止事件查看器)  
    [HKEY_CURRENT_USER\Software\Policies\Microsoft\MMC\{5D6179C8-17EC-11D1-9AA9-00C04FD8FE93}]  
    "Restrict_Run"=dword:00000001;(禁止)(允许或禁止本地用户和组)  
    [HKEY_CURRENT_USER\Software\Policies\Microsoft\MMC\{58221C66-EA27-11CF-ADCF-00AA00A80033}]  
    "Restrict_Run"=dword:00000001;(禁止)(允许或禁止服务)  
    [HKEY_CURRENT_USER\Software\Policies\Microsoft\MMC\{45ac8c63-23e2-11d1-a696-00c04fd58bc3}]  
    "Restrict_Run"=dword:00000001;(禁止)(允许或禁止系统信息)  
    [HKEY_CURRENT_USER\Software\Policies\Microsoft\MMC\{90087284-d6d6-11d0-8353-00a0c90640bf}]  
    "Restrict_Run"=dword:00000001;(禁止)(允许或禁止设备管理器)  
     
     
    #《组策略\用户配置\管理模板\Windows组件\Windows Update》  
    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\WindowsUpdate]  
    "DisableWindowsUpdateAccess"=dword:00000001;(删除使用所有Windows Update功能的访#《组策略\用户配置\管理模板\任务栏和开始菜单》  
    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]  
    "NoInstrumentation"=dword:00000001;(关闭用户跟踪)  
    "NoTaskGrouping"=dword:00000001;(阻止在任务栏上对项目分组)  
    "NoNetworkConnections"=dword:00000001 ;从「开始」菜单删除“网络连接”(启)  
    "NoStartMenuSubFolders"=dword:00000001;从「开始」菜单删除用户文件夹(启)  
    "NoWindowsUpdate"=dword:00000001 ; 删除到“Windows Update”的访问和链接(启)  
    "NoSMMyDocs"=dword:00000001 ;从「开始」菜单中删除“我的文档”图标(启)  
    "NoRecentDocsMenu"=dword:00000001 ; 从「开始」菜单上删除“文档”菜单(启)  
    "NoFavoritesMenu"=dword:00000001 ;从「开始」菜单中删除“收藏夹”菜单(启)  
    "NoFind"=dword:00000001 ;从「开始」菜单中删除“搜索”菜单(启)  
    "NoSMHelp"=dword:00000001 ; 从「开始」菜单删除“帮助”命令(启)  
    "NoRun"=dword:00000001 ; 从「开始」菜单中删除“运行”菜单(启)  
    "StartMenuLogOff"=dword:00000001; 删除「开始」菜单上的“注销”(启)  
    "NoSMMyPictures"=dword:00000001 ; 从「开始」菜单中删除“图片收藏”图标(启)  
    "NoStartMenuMyMusic"=dword:00000001 ; 从「开始」菜单中删除“我的音乐”图标(启)  
    "NoStartMenuNetworkPlaces"=dword:00000001; 从「开始」菜单中删除“网上邻居”图标(启)  
    "StartMenuLogOff"=dword:00000001 ;删除「开始」菜单上的“注销”(启)  
    "NoSetTaskbar"=dword:00000001;阻止更改“任务栏和「开始」菜单”设置(启)  
    "NoChangeStartMenu"=dword:00000001 ; 删除「开始」菜单上的拖放上下文菜单(启)  
    "NoRecentDocsHistory"=dword:00000001 ;不要保留最近打开文档的记录(启)  
    "ClearRecentDocsOnExit"=dword:00000001 ;退出时清除最近打开的文档的记录(启)  
    "Intellimenus"=dword:00000001 ;关闭个性化菜单(启)  
    "NoInstrumentation"=dword:00000001 ;关闭用户跟踪(启)  
    "MemCheckBoxInRunDlg"=dword:00000001 ;将“在单独的内存空间运行”复选框添加到“运行”对话框(启)  
    "NoResolveSearch"=dword:00000001 ;解析外壳程序快捷方式时不要使用搜索方法(启)  
    "NoResolveTrack"=dword:00000001 ; 解析外壳程序快捷方式时不要使用跟踪方法(启)  
    "NoAutoTrayNotify"=dword:00000001 ; 关闭通知区域清理(启)  
    "LockTaskbar"=dword:00000001 ; 锁定任务栏(启)  
    "NoSimpleStartMenu"=dword:00000001 ; 强制典型菜单(启)  
    "NoSMBalloonTip"=dword:00000001 ;删除「开始」菜单项目上的“气球提示”(启)  
    "NoStartMenuEjectPC"=dword:00000000 ;从「开始」菜单删除“移除 PC”按钮(启)  
    "NoUserNameInStartMenu"=dword:00000001 ;从「开始」菜单中删除用户名(启)  
    "HideClockl"=dword:00000001 ;从系统通知区域删除时钟(启)  
    "NoSMConfigurePrograms"=dword:00000001 ; 从“开始”菜单中删除“设置程序访问和默认”(启)  
    "NoDeletePrinter"=dword:00000001;关闭删除打印机"  
    "NoAddPrinter"=dword:00000001; 关闭其它打印机"  
    "NoSetFolders"=dword:00000001;(隐藏控制面板、打印机/网络连接,WIN2000/XP仅从开始菜单隐藏;此外还禁用 WIN+E快捷键)  
     
    #《组策略\用户配置\管理模板\桌面》  
    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\NonEnum]  
    "{450D8FBA-AD25-11D0-98A8-0800361B1103}"=dword:00000001;(删除所有我的文档图标)  
    "{645FF040-5081-101B-9F08-00AA002F954E}"=dword:00000001;(删除所有回收站图标)  
    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]  
    "NoPropertiesMyDocuments"=dword:00000001;(删除我的文档右键菜单的属性)  
    "NoPropertiesRecycleBin"=dword:00000001;(删除回收站右键菜单的属性)(  
    "NoRecentDocsNetHood"=dword:00000001;(不将打开的共享文件夹添加到网上邻居)  
    "DisablePersonalDirChange"=dword:00000001;(禁止更改我的文档路径)  
    "NoDesktopCleanupWizard"=dword:00000001;(删除桌面清理向导)  
    "NoNetHood"=dword:00000001 ;隐藏桌面上“网上邻居”图标  
    "NoInternetIcon"=dword:00000001 ;隐藏桌面上的 Internet Explorer 图标  
    "NoCloseDragDropBands"=dword:00000001 ; 禁止添加、拖、放和关闭任务栏的工具栏(启)  
    "NoSaveSettings"=dword:00000001 ; 退出时不保存设置(启)  
    "NoMovingBands"=dword:00000001 ; 禁用调整桌面工具栏(启)  
     
     
     
     
    #《组策略\用户配置\管理模板\控制面板》  
    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]  
    "ForceClassicControlPanel"=dword:00000001;(强制为传统控制面板样式)  
     
     
    #《组策略\用户配置\管理模板\控制面板\添加/删除程序》  
    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Uninstall]  
    "NoRemovePage"=dword:00000001;(隐藏更改或删除程序页面)  
    "NoAddPage"=dword:00000001;(隐藏添加新程序页面)  
    "NoWindowsSetupPage"=dword:00000001;(隐藏添加/删除Windows组件页面)  
    "NoAddFromCDorFloppy"=dword:00000001;(隐藏从CD-ROM或软盘添加程序选项)  
    "NoAddFromInternet"=dword:00000001;(隐藏从Microsoft添加程序选项)  
    "NoAddFromNetwork"=dword:00000001;(隐藏从网络中添加程序选项)  
    "NoServices"=dword:00000001;(直接打开"组件向导",防止用户使用"添加/删除程序"来配置已安装的服务)  
    "NoSupportInfo"=dword:00000001;(从"更改或删除程序"页面上的程序删除通向"支持信息"对话框的链接)  
     
    #《组策略\用户配置\管理模板\系统》  
    [HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System]  
    "DisableCMD"=dword:00000002;(禁用命令提示符及.cmd和.bat文件)  
    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]  
    "NoAutoUpdate"=dword:00000001;(禁用Windows自动更新)  
     
     
    #《禁止生成缩略图缓冲文件Thumbs.db》(WIMXP)  
    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]  
    "DisableThumbnailCache"=dword:00000001  
     
    #《WINXP使用WIN2000的搜索界面》  
    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\CabinetState]  
    "Use Search Asst"="no"(no禁止搜索代理,yes允许搜索代理)  
     
    #《"Internet选项"控制面板》  
    [HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]  
    "SecurityTab"=dword:00000001;(禁用安全页面)  
    "PrivacyTab"=dword:00000001;(禁用隐私页面)  
    "ContentTab"=dword:00000001;(禁用内容页面)  
    "ConnectionsTab"=dword:00000001;(禁用连接页面)  
    "ProgramsTab"=dword:00000001;(禁用程序页面)  
    "AdvancedTab"=dword:00000001;(禁用高级页面)  
    "HomePage"=dword:00000001;(禁止更改主页设置)  
    "Cache"=dword:00000001;(禁止更改Internet临时文件设置)  
    "History"=dword:00000001;(禁止更改历史记录设置)  
    "Colors"=dword:00000001;(禁止更改颜色设置)  
    "links"=dword:00000001;(禁止更改链接颜色设置)  
    "Fonts"=dword:00000001;(禁止更改字体设置)  
    "Languages"=dword:00000001;(禁止更改语言设置)  
    "Accessibility"=dword:00000001;(禁止更改辅助功能设置)  
    "Ratings"=dword:00000001;(禁止更改分级设置)  
    "Certificates"=dword:00000001;(禁止更改证书设置)  
    "FormSuggest"=dword:00000001;(禁用表单的自动完成)  
    "FormSuggest Passwords"=dword:00000001;(禁止自动完成功能保存密码)  
    "Profiles"=dword:00000001;(禁止更改配置文件助理设置)  
    "Connwiz Admin Lock"=dword:00000001;(禁用Internet连接向导)  
    "Connection Settings"=dword:00000001;(禁止更改连接设置)  
    "Autoconfig"=dword:00000001;(禁止更改局域网设置中的自动配置设置)  
    "Proxy"=dword:00000001;(禁止更改局域网设置中的代理服务器设置)  
    "Messaging"=dword:00000001;(禁止更改电子邮件、新闻组和Internet呼叫设置)  
    "CalendarContact"=dword:00000001;(禁止更改日历和联系人的设置)  
    "ResetWebSettings"=dword:00000001;(禁用重置Web设置)  
    "Check_If_Default"=dword:00000001;(禁止更改默认浏览器检查)  
    "Advanced"=dword:00000001;(禁止更改高级页面的设置)  
     
     
     
    #删除“锁定计算机”删除“更改密码”已启用  
    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System]  
    "DisableLockWorkstation"=dword:00000001  
    "DisableChangePassword"=dword:00000001  
     
    #删除注销 已启用  
    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]  
    "NoLogoff"=dword:00000001  
     
    #计算机启动和登录时总是等待网络 已禁用  
    [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\Winlogon]  
    "SyncForegroundPolicy"=dword:00000000  
     
    #总是用经典登录 已启用  
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system]  
    "LogonType"=dword:00000000  
     
    #登录时不显示欢迎屏幕 已启用  
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer]  
    "NoWelcomeScreen"=dword:00000001  
     
    #显示错误通知 已禁用  
    [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\PCHealth\ErrorReporting\DW]  
    "DWAllowHeadless"=dword:00000001  
     
    #关闭文件和文件夹的“发布到 Web”任务 已启用  
    #关闭“Web 发布”和“联机订购向导”的 Internet 下载 已启用  
    #关闭“订购图片”图片任务 已启用  
    #关闭 Internet 文件关联服务 已启用  
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer]  
    "NoPublishingWizard"=dword:00000001  
    "NoWebServices"=dword:00000001  
    "NoOnlinePrintsWizard"=dword:00000001  
    "NoOnlinePrintsWizard"=dword:00000001  
     
     
    #关闭 Windows Update 设备驱动程序搜索 已启用  
    [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\DriverSearching]  
    "DontSearchWindowsUpdate"=dword:00000001  
     
     
    #关闭 Windows Messenger 客户体验改善活动 已启用  
    [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Messenger\Client]  
    "CEIP"=dword:00000002  
     
    #关闭 Windows 错误报告 已启用  
    [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\PCHealth\ErrorReporting]  
    "DoReport"=dword:00000000  
     
    #关闭“帮助和支持中心”的“您知道吗”内容 已启用  
    #关闭“帮助和支持中心” Microsoft 知识库搜索 已启用  
    [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\PCHealth\HelpSvc]  
    "MicrosoftKBSearch"=dword:00000000  
    "Headlines"=dword:00000000  
     
    #关闭搜索助理内容文件更新 已启用  
    [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\SearchCompanion]  
    "DisableContentFileUpdates"=dword:00000001  
     
     
    #关闭 Windows Movie Maker 联机 Web 链接 已启用  
    关闭 Windows Movie Maker 保存到联机视频主机提供商 已启用  
    [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\WindowsMovieMaker]  
    "WebHelp"=dword:00000001  
    "WebPublish"=dword:00000001  
     
    #限制可保留带宽 已禁用  
    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Group Policy Objects\{C0ECD559-20DD-4C3D-AFDB-84EDBAD094E4}Machine\Software\Policies\Microsoft\Windows\Psched]  
    "**del.NonBestEffortLimit"=" " 
     
    #以上是组策略计算机配置的设置 


    展开全文
  • vc++按钮应用大全

    千次阅读 2012-02-19 10:53:37
    按钮是最常用的控件,使用也比较简单,因此介绍控件的用法就从按钮开始。本文计划通过四个阶段对按钮的使用进行详细阐述,即基础、进阶、高级、特殊。 一、基础应用 (一)在视图中创建按钮 示例程序:Button 1...
      
    

    本文需要的主要工具:

    VC6.0

    MSDN

    MFC类库详解(网上可以下载,对于英文不过关的人很方便) 等等…

    本例源代码:vc++按钮应用大全

    I按钮应用大全

    按钮是最常用的控件,使用也比较简单,因此介绍控件的用法就从按钮开始。本文计划通过四个阶段对按钮的使用进行详细阐述,即基础进阶高级特殊

    一、基础应用

    (一)在视图中创建按钮

    示例程序:Button

    1、普通按钮

    在视图中创建按钮非常简单,需要以下步骤:

    (1)在视图类中定义成员变量或CButton指针

    在CButtonView类上点击右键,选择Add Member Variable…,添加成员变量m_Btn,*p_Btn;

    (2)为按钮分配ID号

    我们可以为按钮分配超过100以上的任意ID号,但是规范的做法是在资源视图中选择String Table,在其中添加资源ID及其注解或标题。

    (图I-1)

    (3)为视图类添加windows消息处理函数OnCreate(…)

    一个窗口创建之后发送的第一个消息就是WM_CREATE消息,其消息响应函数为OnCreate(),因此在这个函数中创建按钮最合适。在CButtonView类上点击右键,选择Add Windows Message Handle…,在生成的对话框中选择WM_CREATE消息,生成函数。

    (4)首先获取资源中按钮的标题(当然也可以用任意标题,例如第二个按钮),如果定义的是成员变量,则直接调用Create函数创建按钮;如果是指针,则先new一个对象,然后用Create函数创建按钮。

    在OnCreate函数中添加如下代码(附注释):

    //定义字符串,用来存储按钮标题

           CString str_push1;

           //获取按钮1标题

           str_push1.LoadString(IDC_BUTTON_PUSH1);

           //创建按钮1

           m_Btn.Create(str_push1,WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON ,CRect(10,10,200,60),

                  this,IDC_BUTTON_PUSH1);

          

           //生成按钮对象

           p_Btn=new CButton();

           //创建按钮2

           p_Btn->Create(_T("第二个按钮"),WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON ,CRect(10,70,200,120),

                  this,IDC_BUTTON_PUSH2);

    Create函数具体用法这里就不赘述了,需要注意的是,按钮窗口风格包括以下内容:

    BS_3STATE 与复选框一样本样式按钮可被单击变暗。变暗状态通常用于指示本样式的按键正处于禁用状态。

    *.

    BS_AUTO3STATE 与三状态的复选框一样当用户选中它本按钮样式状态外观会改变。

    *.

    BS_AUTOCHECKBOX 与复选框一样,除了在用户点控件后会出现一个选中标志,当用户在下一次点选时,该标志会消失。

    *.

    BS_AUTORADIOBUTTON 与单先框一样,不同的是,用户点选它时会高亮显示,同时,会把同一组的其它同样的按钮的高亮状态转移到自己身上。

    *.

    BS_BITMAP 指定按钮以一张位图显示。

    *.

    BS_BOTTOM 把按钮标题放置到按钮矩形区域的底部。

    *.

    BS_CENTER 按钮标题在按钮的矩形区域中央显示。

    *.

    BS_CHECKBOX 在按钮的右边创建一个小方块(此样式必须与BS_LEFTTEXT结合使用。)

    *.

    BS_DEFPUSHBUTTON 创建一个通用的默认按钮该按钮有一个厚重的黑色边框。用户可以通过按回车键来点选本按钮,该按钮可以实现用户通常要使用的功能(即默认执行动作功能)。

    *.

    BS_FLAT 指定按钮为2D按钮,不采用3D控件所使用的阴影。

    *.

    BS_GROUPBOX 创建一个分组框来给控件分组,如果使用了标题,则标题会出现在分组框的左上角位置。

    *.

    BS_ICON 指定按钮上显示一个图标。

    *.

    BS_LEFT 在控件的矩形区域内左对齐标题。如果按钮是一个没有 BS_RIGHTBUTTON 样式的复选框或单选框 ,那么文本居将在复选框或单选框的右边居左对齐(这话有些多余,意思文本在复选框或单选框的那个可选被小方框或圆圈的右边。)。

    *.

    BS_LEFTTEXT 当按钮是单选或是复选框时,标题文本将出现在单选或复选框的客户区(即复选框的矩形框,单选框的圆形框)的左边。

    *.

    BS_MULTILINE 如果标题文本太长,将在绘制区域内对文本进行折行处理。

    *.

    BS_NOTIFY 激活按钮,使之可对父窗口发送BN_DBLCLK, BN_KILLFOCUS,  BN_SETFOCUS 消息,注意:不管有没有使用本样式,按钮都有一个 BN_CLICKED 可发送消息。

    *.

    BS_OWNERDRAW 创建一个自绘风格的按钮。当按钮的外观发生改变时,框架会调用DrawItem成员函数。本样式在使用CBitmapButton类时必须设置。

    *.

    BS_PUSHBUTTON 创建一个按钮(即最常见的按钮),该按钮在点击时,将向父窗口发送一个WM_COMMAND 消息。

    *.

    BS_PUSHLIKE 把(多选框,三态多选框,单选框)以按钮的形式显示,该按钮在未选种状态时是浮起的,但在选中状态时是陷入状态的。

    *.

    BS_RADIOBUTTON 创建单选框,该按钮有一个圆形的客户区,(在本样式不与 BS_LEFTTEXT 样式结合使用的情况下)标题文本在其右方。单选框通常用于有相关联的多个可选项里面,但相互之间只有作一个选择的情况下。

    *.

    BS_RIGHT 在按钮的绘制区域内右对齐文本。但如果按钮是一个没有BS_RIGHTBUTTON样式的单选或复选框,标题文本将在单选或复选框可点选区的右边居右对齐。

    *.

    BS_RIGHTBUTTON 设定单选框的圆形可选区或复选框的方开形复选区出现在按钮的矩形区域的右边。与 BS_LEFTTEXT 的效果一样。

    *.

    BS_TEXT 指定按钮将显示文本标题。

    *.

    BS_TOP 将标题文本显示在按钮的绘制区域的顶边。

    *.

    BS_USERBUTTON 已废弃不用,只作为兼容16位系统版本的Windows,基于32位windows系统的请用 BS_OWNERDRAW 样式取代。

    *.

    BS_VCENTER 设定按钮的标题在绘制区域的垂直方向居中。

    我们可以使用上述按钮风格的组合,创造出不同样式和种类的按钮。

    (5)使用指针的情况下,在析构函数中释放对象。

    delete p_Btn;

     

    2、复选按钮

    创建复选按钮的方法与普通按钮相同,只需要调整按钮风格即可,创建代码如下:

    //创建三态复选按钮

    m_BtnC.Create(_T("三态复选按钮"),WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTO3STATE,CRect(10,130,200,180),this,IDC_BUTTON_CHECK);

    3、单选按钮

    创建方法与前类似,但是由于单选按钮往往是成组出现的,需注意创建时第一个按钮必须加上windows风格WS_GROUP。创建代码如下:

    //创建单选按钮1

    m_BtnR1.Create(_T("单选按钮1"),WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTORADIOBUTTON | WS_GROUP,CRect(10,190,200,240),          this,IDC_BUTTON_RADIO1);

    //创建单选按钮2

    m_BtnR2.Create(_T("单选按钮2"),WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTORADIOBUTTON,CRect(10,250,200,300),

                  this,IDC_BUTTON_RADIO2);

    (二)为按钮添加消息响应函数

    由于是动态创建的按钮,因此不能简单的使用ClassWizard添加消息响应函数,只能手动添加,以第一个按钮为例,添加单击消息响应函数步骤如下:

    (1)在MESSAGE_MAP中添加响应函数。

    ON_BN_CLICKED(IDC_BUTTON_PUSH1,OnBtnClk)

    (2)在头文件中添加函数定义。

    //消息响应函数定义

    afx_msg void OnBtnClk();

    (3)正常编写消息响应函数的实现部分。例如:

    void CButtonView::OnBtnClk()

    {

           MessageBox(_T("点击了普通按压式按钮!"));

    }

    运行效果如图I-2

    二、进阶应用

    前文已经对按钮的创建和使用方法进行了介绍,通过上文我们已经可以在自己的程序中使用按钮了,但是如果想要更好的运用按钮,还必须对其中的函数有比较深刻的了解。

    (一)按钮的成员函数

    CButton类的成员函数比较少,而且简单,主要包括获取按钮状态(或风格)和设置按钮状态(或风格)两个方面内容。另外还有一个DrawItem()函数,在高级应用中我们将重点讲到它。按钮的成员函数主要包括如下内容:

    函数名称

    用途

    GetState

    检索按钮控件的选中状态、加亮状态和获得焦点状态

    SetState

    设置按钮控件的加亮状态

    GetCheck

    检索按钮控件的选中状态

    SetCheck

    设置按钮控件的选中状态

    GetButtonStyle

    检索按钮控件的风格

    SetButtonStyle

    设置按钮控件的风格

    GetIcon

    检索此前调用SetIcon设置的图标句柄

    SetIcon

    指定一个在按钮上显示的图标

    GetBitmap

    检索此前调用SetBitmap设置的位图的句柄

    SetBitmap

    设置在按钮上显示的位图

    GetCursor

    检索此前调用SetCursor设置的光标图像的句柄

    SetCursor

    设置在按钮上显示的光标图像

    1、首先我们先看一下获取和设置按钮风格(style)的函数。

    GetButtonStyle

    检索按钮控件的风格

    SetButtonStyle

    设置按钮控件的风格

    (1)CButton::GetButtonStyle

    UINT GetButtonStyle( ) const;

    返回值:返回CButton对象的按钮风格。

    说明:需注意的是,GetButtonStyle函数只返回BS_style的值,而不返回任何其它窗口风格的值。关于这一点可以查看msdn,另外有一点对于初学者很容易出现误解,BS_FLAT、BS_LEFT等之类的风格不包含在内,可以返回的仅限于如下风格:BS_AUTOCHECKBOX、BS_AUTORADIOBUTTON、BS_AUTO3STATE、BS_CHECKBOX、BS_DEFPUSHBUTTON、BS_GROUPBOX、BS_LEFTTEXT、BS_OWNERDRAW、BS_PUSHBUTTON、BS_RADIOBUTTON、BS_3STATE。

    (2)CButton::SetButtonStyle

    void SetButtonStyle( UINT nStyle, BOOL bRedraw = TRUE );

    参数:

    nStyle

    指定按钮的风格。

    bRedraw

    指明按钮是否需要重绘。非零值表示需要重绘,0表示不需要重绘。缺省时需要重绘。

    说明:本函数用于改变按钮的风格。同上,此函数只能改变上述风格。(改变其他风格可以使用ModifyStyle函数,具体方法下文示例详解)。

    下面我们在Button例子中实现如下功能,即通过点击第一个按钮(普通下压式按钮),动态改变第二个按钮为复选、框单选框和普通下压式按钮。

    步骤如下:

    (1)首先注释掉原代码:MessageBox(_T("点击了普通按压式按钮!"));

    (2)调用GetButtonStyle获取按钮2的风格,并进行条件判断。

    (3)调用SetButtonStyle改变按钮2的风格。

    代码如下:

    void CButtonView::OnBtnClk()

    {

           //MessageBox(_T("点击了普通按压式按钮!"));

           UINT style=p_Btn->GetButtonStyle();

           switch (style)

           {

           case BS_PUSHBUTTON:

                  p_Btn->SetButtonStyle(BS_AUTO3STATE);

                  break;

           case BS_AUTO3STATE:

                  p_Btn->SetButtonStyle(BS_AUTORADIOBUTTON);

                  break;

           case BS_AUTORADIOBUTTON:

                  p_Btn->SetButtonStyle(BS_PUSHBUTTON);

                  break;

                        

           }

    }

    如果我们想要为按钮设置其他风格怎么办呢?其实很简单,只需要改变一个函数,将SetButtonStyle函数改为ModifyStyle,该函数说明如下:

    CWnd::ModifyStyle

    BOOL ModifyStyle( DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0 );

    返回值:如果成功地修改了风格,则返回非零值;否则返回0。

    参数:

    dwRemove

    指定了在修改风格时要清除的窗口风格。

    dwAdd

    指定了在修改风格时要加入的窗口风格。

    nFlags

    要传递给SetWindowPos的标志,如果不应调用SetWinowPos,则为0。缺省值为0。预设的标志列表参见说明部分。

    说明:

    调用这个成员函数以修改窗口的风格。要加入或清除的风格可以用位或操作符(|)来组合。有关可用窗口风格的信息参见《Win32 SDK程序员参考》中的“通用窗口风格”主题和::CreateWindow。

    如果nFlags为非零值,则ModifyStyle调用Windows 的API函数::SetWindowPos,并将nFLags与下面的四个预定义值组合,以重画窗口:

    SWP_NOSIZE

    保持当前大小。

    SWP_NOMOVE

    保持当前位置。

    SWP_NOZORDER

    保持当前的Z轴顺序。

    SWP_NOACTIVATE

    不激活窗口。要修改窗口的扩展风格,参见ModifyStyleEx。

    例如,我们可以为普通下压式按钮增加BS_FLAT(2D风格)属性,我们在OnCreate函数中完成这个任务,代码如下:

    //改变第一个按钮为2D风格

    Btn.ModifyStyle(0,BS_FLAT);

    效果如图I-3所示

    2、下面我们再来看看设置和获取按钮状态的函数:

    GetState

    检索按钮控件的选中状态、加亮状态和获得焦点状态

    SetState

    设置按钮控件的加亮状态

    GetCheck

    检索按钮控件的选中状态(只对单选和复选按钮有效)

    SetCheck

    设置按钮控件的选中状态 (只对单选和复选按钮有效)

    为了节省篇幅,本文就不全部粘贴上述函数的相关说明了,只是对其中需要注意的事项进行一些说明,想要了解详情请自己去查msdn。

    上述后3个函数使用起来都比较容易,唯一可能会造成困扰的就是GetState函数,因为该函数的返回值比较复杂,为了说明方便,我把其说明粘贴如下:

    CButton::GetState

    UINT GetState() const;

    返回值:

    返回按钮控件的当前状态。可以使用以下的掩码取得所需的具体状态信息。

    掩码

    含义

    获取方法

    0x0003

    指定选中状态(选中与否,仅用于单选钮和复选框)。返回0表明未选中,1表明已选中。单选钮在选中时有一个黑圈。复选框选中时则有一个“ⅹ”号。返回2表明选中状态不定(仅用于有三种状态的复选框)。有三种状态的复选框如果处于半色调模式(halftone pattern),就是处于不确定状态

    myButton.GetState() & 0x0003

    0x0004

    指定按钮的加亮状态。非零值表明按钮处于加亮状态。用户单击并且保持鼠标左键于按下状态时,按钮是加亮的。在用户放开鼠标按钮时,加亮状态就不复存在了

    myButton.GetState() & 0x0004

    0x0008

    是否处于获得焦点状态。返回非零值表明按钮正获得焦点

    myButton.GetState() & 0x0008

    说明:本函数用于检索单选钮或者复选框的状态。

    让我们继续完善前面的例子,即实现如下功能:当我们点击第一个按钮时,弹出对话框,说明复选按钮的选中状态。(首先注释掉前面的代码,不注释掉也可以,但会稍微有些干扰。)

    代码如下:

    //获取按钮状态

           UINT state=m_BtnC.GetState() & 0x0003;

           switch (state)

           {

           case 0:

                  MessageBox(_T("未选中"));

                  break;

           case 1:

                  MessageBox(_T("选中"));

                  break;

           case 2:

                  MessageBox(_T("状态不确定"));

                  break;

           }

    3、最后,我们再来看看剩下的几个函数

    GetIcon

    检索此前调用SetIcon设置的图标句柄

    SetIcon

    指定一个在按钮上显示的图标

    GetBitmap

    检索此前调用SetBitmap设置的位图的句柄

    SetBitmap

    设置在按钮上显示的位图

    GetCursor

    检索此前调用SetCursor设置的光标图像的句柄

    SetCursor

    设置在按钮上显示的光标图像

    这些函数作用都是用图片来取代按钮上的标题。函数定义请自行查msdn,都相对比较简单,需要注意的是位图如果过大,将会被裁剪。

    下面的例子中我们要在Button例子的基础上,把第二个按钮增加一副位图,复选框增加一个图标,单选按钮增加一个光标。(图找的比较随意,别介意)

    步骤如下:

    (1)为Button工程添加位图、图标、光标资源。(在资源视图内点击相应资源项,添加即可。)

    (2)为需要设置图片的按钮设置相应的属性。根据前文所述,为按钮设置新属性(如:BS_BITMAP)需要使用ModifyStyle函数。

    (3)设置图片。

    代码如下:

           //为按钮设置图片

           //设置按钮属性

           p_Btn->ModifyStyle(0,BS_BITMAP);

           m_BtnC.ModifyStyle(0,BS_ICON);

           m_BtnR1.ModifyStyle(0,BS_ICON);

           //设置图片

           p_Btn->SetBitmap(::LoadBitmap(AfxGetInstanceHandle(),

                  MAKEINTRESOURCE(IDB_BITMAP_BTN)));

           m_BtnC.SetIcon(::LoadIcon(AfxGetInstanceHandle(),

                  MAKEINTRESOURCE(IDI_ICON_BTN)));

           m_BtnR1.SetCursor(::LoadCursor(AfxGetInstanceHandle(),

                  MAKEINTRESOURCE(IDC_CURSOR_BTN)));

    上述SetBitmap()、SetIcon()、SetCursor()三个函数为API函数,用来获取位图、图标和光标的句柄。AfxGetInstanceHandle()获取当前应用程序的实例句柄。

    (二)其他按钮类

    按钮的大多数用法已经介绍完了,上文中通过在按钮上安放各种图片,我们可以得到具有个性的按钮,但是可能大家觉得这十分不方便,而且按钮和位图还要有良好的匹配,否则就会非常难看。不过还好,微软已经帮我们考虑到了这一点,因此他为我们设计了一个新的按钮类CBitmapButton,通过这个类我们可以实现个性化按钮的梦想。下面我们就将介绍这个类的用法。

    其实CBitmapButton类使用非常简单,msdn中有比较详细的介绍,在这里我按照msdn中的内容为大家演示一下这个类的用法。

    1、在视图中使用CBitmapButton:下面我们就在Button例子中加入一个位图按钮,它包括四个状态,即:未按下(或正常)、按下(或选中)、获得焦点和被禁止存取。为了演示方便,我绘制了四个简单的位图,并在上面添加了文本说明,表示按钮的四个状态。

    如图I-4

     

    步骤摘录如下:

    (1)为按钮创建1到4个位图,导入资源,定义其ID。

    (2)构造CBitmapButton对象。

    (3)调用Create函数创建Windows按钮控件,并把它加到CBitmapButton对象上。这里需要注意的是在设置风格的时候一定要加上BS_OWNERDRAW风格,否则不会生效的哟!

    (4)调用成员函数LoadBitmaps加载位图资源。

    (5)最后别忘了调用SizeToContent函数使按钮大小和位图相匹配。

    代码如下:

    //生成CBitmapButton位图按钮

           m_BmpBtn.Create(NULL,WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON | BS_OWNERDRAW | BS_CENTER,CRect(210,10,390,60),

                  this,IDC_BITMAPBUTTON_VIEW);

           m_BmpBtn.LoadBitmaps(IDB_BITMAP_U,IDB_BITMAP_D,IDB_BITMAP_F,IDB_BITMAP_X);

           //设置按钮大小,使之与位图相一致

           m_BmpBtn.SizeToContent();

    另外,位图按钮的消息响应函数定义方法和CButton相同,这里就不再多说了,可以参考例子。

    2、在对话框中使用CBitmapButton:一般情况下,按钮在对话框中的使用方法都比较简单,本来不想多介绍了,但是CBitmapButton按钮在对话框中的使用有些小复杂(很小很小哟!),不像上述方法通用性那么强,初次接触的人可能还会有些阻碍,因此本人也做了一个简单的例子,供大家学习。

    首先在上述Button例子中建立一个模态对话框,具体建立方法离题有些远,本文就不多说了,然后在上面使用一个位图按钮。

    我们还要把菜单调整一下,在最后面追加一个功能菜单,在其中放置一个演示按钮选项,用来生成对话框。

    我们要在这个对话框上用两种方法建立两个按钮,一个将用到AutoLoad函数,另一个将用前文中使用的方法,请注意区别。

    好了下面我们开始创建位图按钮了,和前文一样,我将msdn中的创建过程摘录如下,为了表述清楚,我对其中内容稍作改动,注意这是使用AutoLoad函数的方法:

    在对话框控件中包含位图按钮的步骤如下:

    (1)为按钮创建1到4个位图。为了和前面例子中的按钮相区别,本例中再次导入4幅位图,名称简化为:U、D、F、X。

    (2)创建一个对话框模板,其中有一个自定义的按钮放在需要位图按钮的位置。模板中按钮的大小无关紧要。

    (3)把按钮的标题(Caption)设置为BUTTON,并为按钮定义ID(此ID的名称没有关系)。

    (4)这是十分关键的一步,先导入位图资源,然后分别为每个位图分配一个ID,ID的值为在步骤3中的标题(Caption)后加上如下的一个字母——U、D、F或X,分别代表正常、按下、获得焦点和禁止存取状态下的按钮。例如,标题设为BUTTON时,ID就应该是字符串:"BUTTONU"、"BUTTOND"、"BUTTONF"和"BUTTONX"。一定不要忘了加上引号,虽然这样做大家可能会觉得有些奇怪,因为不加引号的话,资源编辑器就会为资源赋上一个整数值,MFC在加载图像时就会失败。不要忘了,AutoLoad函数的作用是“自动”加载。

    (5)在应用的对话框类(从类CDialog继承而来)中加上一个CBitmapButton成员对象。

    (6)在CDialog对象的OnInitDialog例程中调用CBitmapButton对象的AutoLoad函数,参数是按钮的ID和CDialog对象的this指针。

    为对话框添加初始化消息响应函数OnInitDialog()。

    在其中添加代码创建位图按钮,代码如下:

    //创建位图按钮

    BmpDlg.AutoLoad(IDC_BMPBTN,this);

    当然我们也可以直接用LoadBitmaps函数像在视图中一样的方法在对话框中创建位图按钮,其中需要注意的是CBitmapButton对象必须关联按钮,步骤如下:

    (1)利用资源编辑器在对话框上添加按钮;

    (2)在对话框类中创建CBitmapButton对象;

    (3)为CBitmapButton对象关联前面添加的按钮;

    (4)使用LoadBitmaps加载位图;

    (5)使用SizeToContent调整按钮大小。

    下面我们在对话框上再创建一个位图按钮,使用的位图为第一次我们所使用的4幅位图。代码可以放在对话框初始化函数OnInitDialog中,如下:

           //将m_BmpDlg2与第二个按钮相关联

           m_BmpDlg2.SubclassDlgItem(IDC_BMPBTN2,this);

           //为第二个位图按钮设置位图

           m_BmpDlg2.LoadBitmaps(IDB_BITMAP_U,IDB_BITMAP_D,IDB_BITMAP_F,IDB_BITMAP_X);

           m_BmpDlg2.SizeToContent();

    很简单吧,利用这个类我们可以完成大部分的按钮创建工作,并制作出具有自己风格的按钮来,如果你还不满足的话,我再向你推荐一个类,名字叫CButtonST,在网上非常流行,网上有很多介绍,我就不再添乱了。下面我们开始按钮的高级应用……。

    三、高级应用

    (一)用DrawItem()实现自绘按钮

    上面关于按钮的介绍都是比较简单的,实现的功能也比较单一,想要随心所欲的控制按钮就必须要掌握按钮的自绘,也就是学会使用DrawItem函数,说白了,就是自己用代码画出按钮在不同状态下的外观。

    (在讲解DrawItem函数用法之前,首先需要说明一下。我看到网上有一个例子程序,名字好像叫做CXPButton,其后好像还写了个补遗,也能实现相同的功能,如果你能够看懂,那么后面的内容请无视。本文主要为了便于理解,因此不十分专业。)

    我们继续,首先这个函数是虚函数,也就是说,我们可以在子类中对其进行实现,添加绘制代码,对按钮进行绘制。其次,本函数是当自定义按钮的可视属性发生变化时,由框架调用的。这就说明我们可以在需要对按钮进行重绘的时候使按钮区域无效,并发生重绘,我们可以使用InvalidateRect函数完成这一功能,具体使用方法稍后再说。

    简单的说,我们可以首先绘出按钮正常状态下的样子,然后根据按钮的不同状态绘出按钮的样子。

    好了,现在我们可以归纳一下自绘按钮的实现思路了:

    1、首先我们要创建一个新的CButton派生类,这样我们就可以对其虚函数DrawItem进行重写了。

    2、用新类创建一个按钮,注意加上BS_OWNERDRAW属性。

    3、重写DrawItem虚函数,判断按钮状态,根据不同状态绘制按钮正常、按下、焦点、禁止时状态的样子。

    下面我们可以开始实现这个按钮了。

    1、点击Insert菜单,选择New Class…,增加一个新类,名字为CNewButton,其基类为CButton。

    2、在新的类上点击右键,选择Add Virtual Function..,选择DrawItem。

    在CXPButton的例子中,作者在加入了鼠标进入和离开按钮时按钮的变化,在一定程度上加大了代码理解的难度,本文就将上述功能进行分解实现,也就是说,先不实现鼠标进入和离开按钮的效果,并将代码精简到最简单的程度。

    3、不考虑鼠标进入和离开按钮时产生效果的情况下,按钮会有4种状态,即正常、按下、焦点、禁用。对于这4种状态,我们可以利用DrawItem函数的参数LPDRAWITEMSTRUCT lpDrawItemStruct,方便的进行判断。因此我们首先要对这个参数有一定的了解。简单的说,这是一个指向DRAWITEMSTRUCT结构体的指针,关于这个结构体,我将网上的说明粘贴如下:

    DRAWITEMSTRUCT

    DRAWITEMSTRUCT结构具有如下形式:

    typedef struct tagDRAWITEMSTRUCT

    {

      UINT  CtlType;

      UINT  CtlID;

      UINT  itemlD;

      UINT  itemAction;

      UINT  itemState;

      HWND  hwndltem;

      HDC   hDC;

      RECT  rcItem;

      DWORD itemData;

    } DRAWITEMSTRUCT;

    注释:

    DRAWITEMSTRUCT结构提供了控制属主决定如何绘制其控制所需要的信息。

    该控制的属主通过WM_DRAWITEM消息的lParam参数来获取指向此结构的指针。成员:

    CtlType

    控件类型。控件类型的取值如下:

    ·

    ODT_BUTTON

    自画按钮

    ·

    ODT_COMBOBOX

    自画组合框

    ·

    ODT_LISTBOX

    自画列表框

    ·

    ODT_MENU

    自画菜单

    ·

    ODT_LISTVIEW

    列表视控件

    ·

    ODT_STATIC

    自画Static控件

    ·

    ODT_TAB

    Tab 控件

    CtlID

    组合框,列表框或按钮的控制ID。对菜单不使用这个成员。

    itemID

    菜单的菜单项ID或是组合框或列表框中的项的索引。对于空的列表框或组合框,这个成员是一个负值,这允许应用程序只在rcItem成员指定的位置画出焦点矩形,既使控件中没有项。这样用户就可以知道列表框或组合框是否具有输入焦点。itemAction成员中位的设置决定了该矩形是否应当画得就象列表框或组合框拥有输入焦点那样。

    itemAction

    定义了要求的绘图动作。它可以是下面位中的一个或多个:

    ·

    ODA_DRAWENTIRE

    当需要画出整个控件时设置该位。

    ·

    ODA_FOCUS

    当控件获得或失去输入焦点时设置该位。如果要确定控件是否拥有输入焦点,应该检查itemState成员。

    ·

    ODA_SELECT

    当选择项发生变化时设置该位。如果要确定新的选择状态,应该检查itemState成员。

    itemState

    指定了完成当前绘图动作后项的可视状态。如果要使菜单项无效,则会设置ODS_GRAYED标志。状态标志如下:

    ·

    ODS_CHECKED

    如果要标记菜单项则设置该位。仅对菜单使用。

    ·

    ODS_DISABLED

    如果要把该项画成禁止状态则设置该位。

    ·

    ODS_FOCUS

    如果该项拥有输入焦点则设置该位。

    ·

    ODS_GRAYED

    如果要使该项变灰则设置该位。仅对菜单使用。

    ·

    ODS_SELECTED

    如果该项被选中则设置该位。

    ·

    ODS_COMBOBOXEDIT

    绘图发生在自画组合框控件的选择区域(编辑控件)。

    ·

    ODS_DEFAULT

    该项为缺省项。

    hwndItem

    指定了组合框,列表框和按钮控件的窗口句柄。指定了包含菜单项的菜单的句柄(HMENU)。

    hDC

    标识了一个设备环境。在控件上进行绘图操作时必须使用这个设备环境。

    rcItem

    hDC成员指定的设备环境中的矩形,定义了将要画出的控件的边界。Windows自动将画出的任何东西裁剪在组合框,列表框和按钮的设备环境之内,但是它不裁剪菜单项。在画出菜单项的时候,拥有者不能在rcItem成员所定义的矩形之外绘图。

    itemData

    对于组合框或列表框,这个成员包含了下面的函数传递给列表框的值:

    ·

    CComboBox::AddString

    ·

    CComboBox::InsertString

    ·

    CListBox::AddString

    ·

    CListBox::InsertString

    对于菜单,这个成员包含了下面的函数传递给菜单的值:

    ·

    CMenu::AppendMenu

    ·

    CMenu::InsertMenu

    ·

    CMenu::ModifyMenu

    判断按钮的状态,我们只要用到其中的itemState,下面我们开始重写DrawItem函数。为了简单起见,我用文本输出的方法表明了按钮的状态,如果你想绘制个性按钮,请自己添加更加复杂的代码。代码如下:

           CRect rc =  lpDrawItemStruct->rcItem;//获取按钮的大小

           CDC *pDC=CDC::FromHandle(lpDrawItemStruct->hDC);//临时设备环境指针

           int nSaveDC=pDC->SaveDC();//表明所保存的设备上下文的整数,如果出错,则返回0。调用RestoreDC恢复设备上下文时要用到这个返回值。

           //获取按钮状态

           UINT state = lpDrawItemStruct->itemState;

           //绘制普通状况下的按钮

           pDC->TextOut(2,2,_T("正常"));

           if (state & ODS_SELECTED)//按下按钮

           {

                  pDC->TextOut(2,2,_T("按下"));

           }

           else if(state & ODS_FOCUS)//按钮有焦点

           {

                  pDC->TextOut(2,2,_T("焦点"));

           }

           else if(state & ODS_DISABLED)//按钮被禁用

           {

                  pDC->TextOut(2,2,_T("禁用"));

           }

           pDC->RestoreDC(nSaveDC);//恢复设备上下文

    没有想象中复杂吧!DrawItem完成之后我们用前面的方法在OnCreate函数中把这个按钮创建出来,检查一下效果?也许不会出现理想中的效果,那是因为你可能忘了为按钮加上BS_OWNERDRAW属性。添加BS_OWNERDRAW属性的方法有很多,我们在创建按钮的时候添加也是可以的,但是通用的做法是在虚函数PreSubclassWindow中添加,我们可以添加虚函数,然后加入如下代码:

    ModifyStyle(0,BS_OWNERDRAW);

    4、好了,现在我们已经实现了一个我们自绘的按钮了,至少我们知道了实现的方法。下面我们来为按钮添加鼠标移入、离开时的效果。添加方法CXPButton的作者已经写的十分详细了,为了方便大家理解,这里我还是把它用我们的最简洁语句的方法再实现一下。

    首先添加鼠标移动消息添加处理函数:OnMouseMove。这里大家要特别注意,鼠标移动到按钮上和离开按钮的消息是不能用普通方法(ClassWizard)添加的,我们采用的办法是通过OnMouseMove函数,根据鼠标移动情况发送上述两个消息,这两个消息的名字为WM_MOUSELEAVE和WM_MOUSEHOVER。然后我们在手工添加消息响应,添加方法同前为按钮手工添加消息响应的方法类似。为了便于阅读,在此将此方法在重新说一下,大概分3个步骤:

    (1)在MESSAGE_MAP中添加响应函数。

    ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)

    ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)

    (2)在头文件中添加函数定义。

    //消息响应函数定义

    afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);

    afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam);

    (3)正常编写消息响应函数的实现部分。

    如何发送上述消息呢?这里就要用到一个函数_TrackMouseEvent(),注意前面的下划线不要忘了。此函数的功能是当在指定时间内鼠标指针离开或盘旋在一个窗口上时,用此函数发送消息。由于此函数使用方便,用途广泛,特别将此函数的有关说明粘贴于此(下面的内容均为百度百科转载)。

      函数原型:BOOL TrackMouseEvent(LPTRACKMOUSEEVENT lpEventTrack);

      参数:

      lpEventTrack;指向结构TRACKMOUSEEVENT的指针。

      返回值:如果函数调用成功,返回非零值;如果函数调用失败,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。

      此函数能发送如下消息:

      WM_MOUSEHOVER:在上次调用TrackMouseEvent指定的时间里,鼠标盘旋在窗口的客户区。当此消息产生时,盘旋跟踪停止。如果需要进一步的鼠标盘旋跟踪,应用程序应当再次调用TrackMouseEvent。

      WM_MOUSELEAVE:鼠标离开上次调用TrackMouseEvent时指定的窗口客户区。当此消息产生时,所有由TrackMouseEvent要求的跟踪都被取消。当鼠标再次进入窗口,并且要求进一步的鼠标盘旋跟踪时,应用程序必须调用TrackMouseEvent。

      该处使用自定义消息发送形式:

      ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)

      ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover)

      才能使用

      注意:WM_MOUSELEAVE响应函数为 void OnMouseLeave(WPARAM wp,LPARAM lp),若写成 void OnMouseLeave(),Release下运行会出现错误。

      备注:当鼠标指针在指定时间内停留在指定矩形内,就被认为是处于盘旋状态。调用函数SystemParameterslnfo并使用SPI_GETMOUSEAOVERWIDTH,SPI_GETMOUSEHOVERAEIGHT和SFI_GETMOOSEAOVERTIME值来取得矩形的大小和时间。

      速查:Windows NT 4.0及以上版本;Windows 98及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib。

      ::TrackMouseEvent 要使用它,请在源码中包含#define _WIN32_WINNT 0x0400

      TRACKMOUSEEVENT 结构体

      TRACKMOUSEEVENT结构体在TrackMouseEvent函数中用到。

      其定义如下:

      typedef struct tagTRACKMOUSEEVENT {

      DWORD cbSize;

      DWORD dwFlags;

      HWND hwndTrack;

      DWORD dwHoverTime;

      } TRACKMOUSEEVENT, *LPTRACKMOUSEEVENT;

      几个成员的含义:

      cbSize 定义TRACKMOUSEEVENT结构体的大小;

      dwFlags 定义服务请求,可以是下列值的组合:TME_CANCEL 取消前一次的跟踪请求;使用该项时必须指定要取消跟踪的类型,例如要取消hover跟踪,就必须同时传送TME_CANCEL和 TME_HOVER(TME_CANCEL|TME_HOVER)。TME_HOVER hover通知。可以发送WM_MOUSEHOVER消息。如果在hover跟踪处于激活状态时再次请求hover跟踪的话,hover的定时器将被重 置。TME_LEAVE 鼠标离开。发送TME_MOUSELEAVE消息。当鼠标不在指定的窗口或区域上时,将立即产生一个leave通知,不再做任何跟踪。TME_QUERY 这一项不是作为跟踪请求的。选中这一项时,当结构体被传送给TrackMouseEvent函数时,即产生当前跟踪。唯一不同的是返回的消耗时间,是真实 的消耗时间而不是HOVER_DEFAULT,即使之前TrackMouseEvent函数所请求的是HOVER_DEFAULT。

      hwndTrack 待跟踪窗口的句柄

      dwHoverTime 定义hover事件的耗尽时间(如果在dwFlags中有定义TME_HOVER的话),单位毫秒。 可以使用HOVER_DEFAULT来使用系统默认的hover事件耗尽时间。系统默认的hover事件耗尽时间为菜单下拉时间,即400毫秒。可以调用SystemParameterInfo函数并使用 SPI_GETMOUSEHOVERTIME来获取默认的hover耗尽时间。默认的hover矩形区与双击区一致。可以调用 SystemParameterInfo并使用SPI_GETMOUSEHOVERWIDTH和SPI_GETMOUSEHOVERHEIGHT来获取鼠 标在上面停留可以产生WM_MOUSEHOVER的区域。

    还有一个小问题。前面一直都说的是TrackMouseEvent函数,但实在上,在程序中,如果直接使用 TrackMouseEvent(&tme);时,会出现诸如“'TrackMouseEvent' : undeclared identifier”的错误。但如果你使用_TrackMouseEvent(&tme);就不会有错误了。为什么呢?

      这两个函数的区别,TrackMouseEvent函数的头文件是winuser.h,对应的库文件为user32.lib,而 _TrackMouseEvent函数则在commctrl.h里定义,而由COMCTRL32.DLL导出。

      使用 TrackMouseEvent函数必须用extern "C"导入此函数。如下:

      extern "C" WINUSERAPI BOOL WINAPI TrackMouseEvent (LPTRACKMOUSEEVENT

      lpEventTrack);

      NOTE:由上面说到的TrackMouseEvent函数的特点,通常都在OnMouseMove函数里添加该函数。另外,可以与 SetCapture函数联合使用,即使在鼠标移出窗口区时也能够响应。

    下面我们就在OnMouseMove中使用这个函数来发送鼠标进入和离开按钮的消息吧。代码如下:

           TRACKMOUSEEVENT tme;//定义TRACKMOUSEEVENT结构体

           tme.cbSize = sizeof(tme);//获取结构体大小

           tme.hwndTrack = m_hWnd;//为句柄赋值为当前按钮窗口

           tme.dwFlags = TME_LEAVE | TME_HOVER;//发送进入和离开消息

           tme.dwHoverTime = 1;//鼠标在按钮上盘旋1毫秒时即发送消息

           _TrackMouseEvent(&tme);//发送消息

    现在我们每当鼠标进入或者离开按钮时都会发出响应的消息了,下面我们就可以用前文的方法为这两个消息添加消息响应,具体添加方法请参照前文和例子,这里就不写了。

    为了表示鼠标进入和离开按钮的状态,我们为CNewButton添加了一个成员变量m_bOver,初始值为假,鼠标在按钮之上时为真,鼠标离开按钮为假,我们可以在构造函数中为其赋初值。然后分别在WM_MOUSELEAVE和WM_MOUSEHOVER消息响应函数中为其赋上相应的值。别忘了用InvalidateRect函数通知窗口更新。

    现在我们可以在DrawItem函数中进行判断了。添加代码如下:

    //判断鼠标移入、移出,鼠标离开时按钮恢复原状态

           if(m_bOver)

           {

                  //按钮在鼠标之上

                  pDC->TextOut(2,2,_T("移入"));

           }

    至于如何将按钮绘制的更加漂亮,并非本文所说之范围,另外这个例子还存在许多bug,例如添加鼠标移入状态之后,鼠标按下就无法显示了,不过本文只是为了让大家理解DrawItem的使用方法而已,相反,我认为这种带有缺陷的例子,更能反映出程序的本质(实际只是偷懒而已!),因此本人也不准备将这个例子做的很完善了。只要大家具备足够的绘图水平,相信一定会绘制出漂亮的按钮来。

    (二)为按钮添加声音

    当然为了按钮表现的更加完美,我们还要为其添上声音,当然这实在太简单了,不过是在相应的消息响应函数中加上如下代码:

    PlaySound((LPCTSTR)IDR_WAVE1, AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC);

    至于PlaySound函数的用法,这里就不多说了,注意包含头文件:mmsystem.h,并连接上winmm.lib库就可以了,方法大家自己去学吧。

    四、特殊应用

    通过前面的文章,大家对于按钮已经有了比较深的了解了,而且也可以设计出具有自己个性风格的按钮来了,但是大家一定也发现了,前文介绍的按钮永远是一成不变的矩形,相信大家一定非常不满意,下面我就为大家介绍一下如何改变按钮的形状。

    改变按钮的形状主要要用到一个类:CRgn,这个类可以为窗口设定一个有效区域,就好像是可以裁剪窗口一样,要详细说明这个类的用法,可能需要很长的内容,这里我只是简单的进行一下描述和比喻,其实使用这个类和我们制作石膏像非常相似,制作石膏像的过程有如下三个步骤:

    1、准备材料。

    2、制作模子。

    3、把石膏扣在上面,多余的去掉。

    使用CRgn也需要三个步骤:

    1、生成CRgn对象。(准备好制造石膏像模子的材料)

    CRgn rgn;

    2、生成CRgn区域。(制造模子)

    这个过程比较复杂,本文就不多说了,这里只用到CRgn的成员函数CreateEllipticRgn来制作一个椭圆按钮就可以了。当然我们可以深入学习一下CRgn的使用方法,制作出超级个性复杂的按钮,但是这并非本文内容,因此就不多说了。

    3、把窗口扣上去就完成了。

    这一步非常简单,只要知道一个函数就可以了:SetWindowRgn。

    多说一句,实际上,多数改变窗口外形的操作都是运用上面所述的方法实现的,熟练掌握上面的方法是十分必要的。

    现在我们可以来理清一下制作不规则按钮的思路了,简单的说就是把按钮作为一个窗口,然后扣到我们创造的CRgn区域中,就可以了。事实真的就是那么容易。这里我们一定要注意区分一下在对话框中(即使用对话框编辑器预先制作的按钮)和我们在视图中动态创建按钮这两种不同的情况,他们是不同的。

    (一)首先我们来看一下在对话框中如何创建不规则按钮,当然前文关于CXPButton的补遗中有所描述,这里我们还是将它进一步精简,方便大家理解。为了说明方便,本文也使用了CXPButton类补遗中的说明方法,先把对话框涂上蓝颜色。这个操作在对话框中消息处理函数OnEraseBkgnd中进行。

    现在我们可以开始在对话框中创建不规则按钮了,步骤如下:

    1、首先我们在添加一个新的类:CRgnDlgBtn

    2、使用对话框编辑器添加一个按钮。

    3、为CRgnDlgBtn类添加虚函数DrawItem、PreSubclassWindow,以及OnEraseBkgnd消息处理函数。

    4、DrawItem用来根据不同按钮状态绘图,这里我们将前面CNewButton中的代码粘贴过来,为了简单,去掉了鼠标经过按钮时的绘图。

    5、在PreSubclassWindow函数中为按钮自绘属性,然后开始设定区域,代码如下:

    //获取按钮控件举行区域大小

           CRect rc;

           GetClientRect(&rc);

           //定义区域

           CRgn rgn;

           //制作椭圆形的按钮区域,也就是模子

           rgn.CreateEllipticRgnIndirect(&rc);

           //把窗口扣到区域中

           SetWindowRgn((HRGN)rgn,TRUE);

    6、这时按钮实际上已经被设定了区域,使用鼠标点击按钮的四个角,已经不会发挥作用了。之所以会出现白色的边角,是因为按钮的OnEraseBkgnd消息处理函数还在发挥作用,为按钮绘制底色。我们只需要响应按钮的OnEraseBkgnd消息处理函数,不调用CButton::OnEraseBkgnd(pDC),直接返回TRUE,就可以让OnEraseBkgnd消息处理函数失去作用,从而不再为按钮绘制底色了。

    为对话框编辑器制作的按钮设定区域相对比较简单,这个例子和CXPButton的补遗中所描述的是一样的,大家可以结合着来看。相比较,在视图中(或者说动态)创建不规则按钮就相对比较麻烦了,下面我们就来在视图中动态创建一个不不规则按钮吧。

    (二)在视图中动态创建不规则按钮。

    有人会觉得,在视图中创建不规则按钮很简单,只要为上面建立的CRgnDlgBtn类生成一个对象,然后调用Create创建就行了。但是如果你那样做了,你会发现根本无法实现,甚至你的整个窗口都将失效,那么应该怎样做呢?此时我们不能将设置区域的操作放在PreSubclassWindow函数中,而是应该放在Create创建按钮之后,因为此时按钮才有了自己的实例。步骤和前面非常相似,过程如下:

    1、再新建一个类CrgnViewBtn;

    2、为CRgnViewBtn类添加虚函数DrawItem、PreSubclassWindow,以及OnEraseBkgnd消息处理函数。代码和前面基本一样,只是要把PreSubclassWindow代码中的有关设置区域的内容移动到CButtonView类中OnCreate()中,放在创建不规则按钮之后。OnCreate函数中添加代码如下:

           m_RVBtn.Create(NULL,WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON,CRect(210,130,390,180),

                  this,IDC_BUTTON_RGNVIEW);

           //获取按钮大小

           CRect rc;

           m_RVBtn.GetClientRect(&rc);

           //制作区域

           CRgn rgn;

           rgn.CreateEllipticRgnIndirect(&rc);

           m_RVBtn.SetWindowRgn((HRGN)rgn,TRUE);

           rgn.DeleteObject();

    好了,现在编译一下吧,椭圆按钮已经出现了?

    结束语:本文将有关按钮的大部分操作都做了详细的说明,通过前文,我们可以制作出任意形状样式的按钮,为我们的程序增光添彩。当然,有关按钮的操作还远不止上述内容,由于本人水平十分有限,就不能再过多的记述了。本人也是个初学者,写本文无非是为了激发自己的学习,不足之处一定不少,真心希望诸位老师朋友们批评指正。

    展开全文
  • 说到ionic返回按钮,可能第一想到的就是ionic在app.config中配置按钮的情况,小伙紫还不错嘛。 这篇blog想讨论的恰好不是这个,不过也和他有关啦,就因为这个按钮,在正常页面跳转时候,肯定是需要的。 凡事总...

    说到ionic返回按钮,可能第一想到的就是ionic在app.config中配置按钮的情况,小伙紫还不错嘛。



    这篇blog想讨论的恰好不是这个,不过也和他有关啦,就因为这个按钮,在正常页面跳转时候,肯定是需要的。


    凡事总有例外:


    很多情况下,比如说:
    1.你想从修改密码回到登录页面,然后再次登录账号进入SPA,
    2.你从SPA切换账号,要登录个新账号 回到登录页面,进行登录操作
    3.在页面跳转时,你发现,我屮艸芔茻。。。这尼玛有返回按钮,
    是不是满脑子一群‘泥马’狂奔而过。


    问题原因就是缓存与历史


    这问题就好办了,清缓存,清历史。


    问题来了,怎么清?


    二笔做法:
    重载即:在login 登录页面进行强制刷新。 window.reload();
    貌似也行 ,短暂空白,用户体验不好,路由中还需要清缓存,
    见过坑爹的事:路由不跳转。页面过去了,但是浏览器地址并不发生改变—-显然不是我搞(至于哪位仁兄,暂不清楚)


    其他方法怎么搞?


    app.config去配置完全不缓存,这方法比较邪恶,以后想用缓存都用不起来,即使路由搞了cache,貌似也没用。


    没副作用的方法:
    路由配置: cache:false,与历史清理 $ionicHistory.clearHistory()相结合, $ionicHistory.clearHistory()要在login页面的控制器里使用才是最好的,因为你不知道返回login页面的页面是哪个?O(∩_∩)O哈!


    至此,你还没成功,好吧,我无奈,把你代码搞过来,我给你show–show

    展开全文
  • Burp suite按钮简介和简单爬虫

    千次阅读 2019-04-14 16:55:43
    这一节我学会了一些简单的burpsuite的按钮,知道了它们的含义和一些作用, 还有通过一些视频和一些博客学会简单的spider爬虫。 1.Target(目标)——显示目标目录结构的的一个功能 2.Proxy(代理)——拦截HTTP/S的...
  • GUI测试之按钮

    千次阅读 2007-05-28 17:09:00
    l OK按钮总是在上方或者左方,而Cancel按钮总是在下方或右。l Cancel按钮的等价按键通常是Esc,而选中按钮的等价按钮通常是Enter保持一致。l 测试按钮能否正常的实现功能,常用按钮的功能为:l OK接受输入的数
  • c#重写TabControl控件实现关闭按钮

    万次阅读 2013-03-31 12:54:56
    2.有一些已经做好的第三控件,但是收费。 3.由于我的故障树推理诊断项目在绘图的时候允许同时打开多个文档进行操作,就要实现类似于浏览器的多标签功能,而且要可以关闭。 4.所以自己写一个类继承TabControl类,...
  • 【COM编程】如何往IE工具条添加按钮

    千次阅读 2012-04-17 10:06:12
    问题提出: 金山词霸、网络蚂蚁等软件安装后会向IE...从IE5开始便允许我们向工具栏添加自己的按钮,其本质就是修改注册表,添加创建此按钮所需的信息。 实现步骤: 1.创建此按钮的GUID(globally unique identifie
  • 前言: 子窗口控件是特殊的子窗口,不需要我们注册窗口类,系统已经注册好了,...常用的子窗口控件有按钮BUTTON、组合框COMBOBOX、编辑框EDIT、清单方块LISTBOX、静态框STATIC、滚动条SCROLLBAR、RichEdit等类型 ...
  • 如何更改MFC按钮的背景色

    千次阅读 2013-10-27 10:40:26
    今天打算给自己写的工程上点色。但是在给按钮上色的时候出了点问题。在网上找的方法基本上都...但是这个办法不免有些复杂,我这么懒的人,既不想为这么个小功能去重写一个类,也不想使用第三按钮类,所以只能另辟蹊
  • 1.c#里面的TabControl控件没有关闭按钮,而且很难看。 2.有一些已经做好的第三控件,但是收费。 3.由于我的故障树推理诊断项目在绘图的时候允许同时打开多个文档进行操作,就要实现类似于浏览器的多标签功能,...
  • 如何实现那种流行的平面按钮

    千次阅读 2007-08-28 11:36:00
    QA000029建立日期: 1998年10月1日 最后修改日期:2000年10月15日 所属类别: Visual Basic - 第三控制Visual Basic - Windows 9x控件Visual Basic - 标准控件 张立斌: 时下流行的那种按钮(平时是平面,...
  • 本文我们将讲解允许模拟位置在Android M下的坑。做地图类应用的同学应该都知道为了避免软件模拟位置影响正常流程的进行我们一般都会判断用户手机是否打开了模拟位置设置,若打开了则终止用户流程,提醒用户关闭模拟...
  • Blend创建一个自定义按钮

    千次阅读 2012-03-30 23:21:29
    在Expression Blend创建一个自定义按钮 2.为定制控件增加视觉状态效果 3.创建横幅文本的动画 1 在Expression Blend创建一个自定义按钮一般而言,Silverlight控件会把它们的逻辑与用模板生成的视觉外观进行分离。...
  • root-第三Recovery-升全中文-emesn-写号-全过程详解+要点+软件包 (本文已完成,软件包连接在3楼,补充在4楼) 1月24日,更新一下root和em写号的方法,还有中文ROM.Droidx已经变得非常简单易用了! ...
  • React Native之常用第三

    千次阅读 2017-01-01 21:49:38
    因此在很多深层次上还需要结合原生app做一定的兼容,还有就是现在好多控件,如Android中已是系统的控件的sidemenu、checkbox、gridview等,这些在react native中 系统是没有给我们提供的,这时候就借助了第三开源...
  • qq第三登录

    千次阅读 2017-07-21 15:58:33
    同事搞了个qq第三登录,学习下.  qq第三登录(qq oAuth2.0),在oauth的协议的基础上实现的(新浪,wx等一些第三登录都遵循这个原则),第三分网站与移动应用  网站接入:总体流程 QQ登录OAuth2.0总体处理流程如下...
  • Qt on Android:使用JNI与第三jar包

    万次阅读 热门讨论 2014-09-15 13:34:58
    怎样在Qt项目中添加Java代码,使用第三jar包
  • MAC如何允许安装任何来源的软件

    万次阅读 2017-06-07 17:29:06
    进入安全性与隐私,点击右下角的解锁按钮,选择允许从任何来源 有时候我们会看到,没有这任何来源选项 这时,我们只需要在终端,输入命令行:sudo spctl --master-disable 就可以看到任何来源...
  • tableBar 添加多个按钮的方法

    千次阅读 2012-07-23 12:05:28
    默认情况下,当按钮多于5个时,标签栏控制器允许拥护对按钮布局进行定制。要做到这一点,可以单击标有“更多”的标签, 然后单击随之出现的导航栏上的编辑按钮。你可以选择只对某些特定的标签进行定制,也可以完全...
  •  – 简洁快速的页面切换–MBXPageViewController,带有按钮控件的UIPageController,非常整洁、简单以及快速。该项目通过三种形式展示页面之间的切换,比如导航栏上的多个tab切换、页面左右两端箭头指示切换,以及...
  • 根据应用启动时获取的版本信息来决定显示还是隐藏第三授权按钮和用户名密码登录方式。 由于现在禁止app自己弹出版本更新的提示框,那么绝大多数应用都需要版本更新的,甚至在强制更新场景下,以前的版本接口或...
  • Java Web系统常用的第三接口

    万次阅读 2010-12-27 10:35:00
    允许重用代码的同时,可以重用代码背后的数据。使用 Web Service ,再也不必像以前那样,要先从第三购买、安装软件组件,再从应用程序中调用这些组件;只需要直接调用远端的 Web Service 就可以了。 ...
  • iOS 常用第三

    万次阅读 2018-06-04 15:37:23
    - 允许添加多视图控件,并且可以横向滚动。有点类似于Groupon应用程序。 HBHorizo​​ntalTableView - swift,TableView横向滚动小示例(仿照AppStore应用展示)。 Horizo​​ntalScrollCell - Horizo​​...
  •  安全码+APP包名---->才能允许申请,并且通过安全码和APP包名才能产生唯一的标识APPKEY  1.2、安全码来自Eclipse中的SHA1 fingerprint(88:29:C9:AC:D8:5C:FC:DF:D3:D4:90:F4:98:FF:78:3A:7B:27:B7:3F)  1.3...
  • 文章目录PyCharm安装第三库编写第一个GUI程序一个按钮多个按钮选择框文本输入框整数输入框 EasyGUI是一个Python GUI模块 PyCharm安装第三库 编写第一个GUI程序 一个按钮 import easygui res = ...
  • iOS 第三库、插件、知名博客总结

    万次阅读 2017-09-29 10:43:36
    用到的组件 1、通过CocoaPods安装 项目名称 项目信息 AFNetworking 网络请求组件 FMDB 本地数据库组件 SDWebImage 多个缩略图缓存组件 UICKeyChainStore ...一款提示框第三库 MWPhotoB
  • 第三支付原理

    千次阅读 2017-09-04 10:39:44
    1.什么是第三支付  所谓第三支付,就是一些和各大银行签约、并具备一定实力和信誉保障的第三独立机构提供的交易支持平台。在通过第三支付平台的交易中,买方选购商品后,使用第三平台提供的账户进行货款...
  • 标 题: 【下载】APK可视化修改工具:APK之理(APK IDE) 作 者: 青椒 时 间: 2013-04-10,11:03:12 链 接: http://bbs.pediy.com/showthread.php?t=168001  小米人APK之理(Apk IDE)是一款可视化的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 60,791
精华内容 24,316
关键字:

允许改方按钮