文档章节

学习 Message(22): WM_SYSCOMMAND 消息[六] : 系统菜单综合操作示例

涂孟超
 涂孟超
发布于 2014/09/26 15:38
字数 491
阅读 3
收藏 0
本例效果图:



代码文件:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  protected
    procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{定义两个菜单命令 ID 常数, 自定义的此类常数应该小于 $F000, 因为系统使用的都大于这个数}
const
  MenuCmdID1 = 101;
  MenuCmdID2 = 102;

{添加}
procedure TForm1.Button1Click(Sender: TObject);
var
  h: HMENU;
begin
  {系统菜单句柄}
  h := GetSystemMenu(Handle, False);
  AppendMenu(h, MFT_STRING, MenuCmdID1, '新添加的菜单项');
end;

{插入}
procedure TForm1.Button2Click(Sender: TObject);
var
  h: HMENU;
begin
  h := GetSystemMenu(Handle, False);
  {这是插入在 "还原" 菜单(SC_RESTORE) 前面}
  InsertMenu(h, SC_RESTORE, MFT_STRING, MenuCmdID2, '插入的菜单项');
end;

{修改}
procedure TForm1.Button3Click(Sender: TObject);
var
  h: HMENU;
begin
  h := GetSystemMenu(Handle, False);
  ModifyMenu(h, SC_MOVE, MF_BYCOMMAND, SC_MOVE, '这是我改的');
end;

{删除}
procedure TForm1.Button4Click(Sender: TObject);
var
  h: HMENU;
begin
  h := GetSystemMenu(Handle, False);
  {这是删除的 "关闭" 菜单, 此时窗口的关闭按钮会变灰}
  DeleteMenu(h, SC_CLOSE, MF_BYCOMMAND);
end;

{恢复}
procedure TForm1.Button5Click(Sender: TObject);
begin
  GetSystemMenu(Handle, True);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Button1.Caption := '添加';
  Button2.Caption := '插入';
  Button3.Caption := '修改';
  Button4.Caption := '删除';
  Button5.Caption := '恢复';
end;

procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
var
  h: HMENU;
  buf: array[Byte] of Char;
begin
  h := GetSystemMenu(Handle, False);
  case Message.CmdType of
    MenuCmdID1: begin
      GetMenuString(h, MenuCmdID1, buf, Length(buf), MF_BYCOMMAND);
      ShowMessage(buf);
    end;
    MenuCmdID2: begin
      GetMenuString(h, MenuCmdID2, buf, Length(buf), MF_BYCOMMAND);
      ShowMessage(buf);
    end;
  end;
  inherited;
end;

end.

 
 
 
 
 

 

 

  
窗体文件:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 191
  ClientWidth = 206
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 48
    Top = 20
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 48
    Top = 51
    Width = 75
    Height = 25
    Caption = 'Button2'
    TabOrder = 1
    OnClick = Button2Click
  end
  object Button3: TButton
    Left = 48
    Top = 82
    Width = 75
    Height = 25
    Caption = 'Button3'
    TabOrder = 2
    OnClick = Button3Click
  end
  object Button4: TButton
    Left = 48
    Top = 113
    Width = 75
    Height = 25
    Caption = 'Button4'
    TabOrder = 3
    OnClick = Button4Click
  end
  object Button5: TButton
    Left = 48
    Top = 144
    Width = 75
    Height = 25
    Caption = 'Button5'
    TabOrder = 4
    OnClick = Button5Click
  end
end

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2008/10/31/1323992.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
windows消息(一)

SendMessage函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队...

jinx88
2016/06/18
10
0
MFC的SendMessage函数详解

SendMessage函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队...

长平狐
2012/10/08
3.1K
0
几个WM消息其lParam和wParam参数定义

几个WM消息其lParam和wParam参数定义 鼠标消息 lParam:低字组为x 座标,高字组为y 座标,这两个座标是相对于窗口显示区域左上角的位置。 Wparam:指示滑鼠按键以及Shift和Ctrl 键的状态。可...

IMGTN
2012/10/03
0
1
GetSystemMenu(FALSE)

参数为False时返回当前窗口系统菜单(窗口标题栏右键弹出的移动、大小、最大化等)的句柄。 系统菜单是指我们点击窗体左上角的小图标时所弹出的菜单,其中好象有“恢复”.“移动”.“最大化”....

云栖希望。
2017/12/04
0
0
MFC下多线程与消息机制的结合使用

前面一段时间,一直在想怎么样实现在全局的线程函数中实现调用窗体的一些函数(比如说在线程里面调用按钮单击处理函数,以及窗体的一些操作)。最近在网络 闲逛中发现了实现的方法,特意贴出...

长平狐
2012/07/12
172
0

没有更多内容

加载失败,请刷新页面

加载更多

百度黄埔学院将培养一批首席AI架构师,为“国之重器”赋能

深度学习高端人才不仅是AI发展的重要养分,也是企业转型AI巨大推动力。2019年1月19日,百度黄埔学院——深度学习架构师培养计划在百度科技园举行开学典礼,深度学习技术及应用国家工程实验室...

深度学习之桨
24分钟前
1
0
扒站wget仿站

wget -c -r -p -np -k http://xxx.com/xxx 其中: -c, --continue (断点续传) 接着下载没下载完的文件 -r, --recursive(递归) specify recursive download.(指定递归下载) -p, --page...

临江仙卜算子
26分钟前
1
0
Nextjs+React非页面组件SSR渲染

@随风溜达的向日葵 Nextjs Nextjs是React生态中非常受欢迎的SSR(server side render——服务端渲染)框架,只需要几个步骤就可以搭建一个支持SSR的工程(_Nextjs_的快速搭建见Next.js入门)...

随风溜达的向日葵
今天
0
0
如何在 Linux 系统查询机器最近重启时间

在你的 Linux 或类 UNIX 系统中,你是如何查询系统上次重新启动的日期和时间?怎样显示系统关机的日期和时间? last 命令不仅可以按照时间从近到远的顺序列出该会话的特定用户、终端和主机名...

来来来来来
今天
3
0
Redis协议是什么样的

前言 我们用过很多redis的客户端,有没有相过自己撸一个redis客户端? 其实很简单,基于socket,监听6379端口,解析数据就可以了。 redis协议 解析数据的过程主要依赖于redis的协议了。 我们...

春哥大魔王的博客
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部