• 学习 Message(17): WM_SYSCOMMAND 消息[一]



    已有定义的系统命令常数(感觉有些有问题):
    SC_SIZE         = 61440;
    SC_MOVE         = 61456;
    SC_MINIMIZE     = 61472;
    SC_MAXIMIZE     = 61488;
    SC_NEXTWINDOW   = 61504;
    SC_PREVWINDOW   = 61520;
    SC_CLOSE        = 61536;
    SC_VSCROLL      = 61552;
    SC_HSCROLL      = 61568;
    SC_MOUSEMENU    = 61584;
    SC_KEYMENU      = 61696;
    SC_ARRANGE      = 61712;
    SC_RESTORE      = 61728;
    SC_TASKLIST     = 61744;
    SC_SCREENSAVE   = 61760;
    SC_HOTKEY       = 61776;
    SC_DEFAULT      = 61792;
    SC_MONITORPOWER = 61808;
    SC_CONTEXTHELP  = 61824;
    SC_SEPARATOR    = 61455;
    SC_ICON         = SC_MINIMIZE;
    SC_ZOOM         = SC_MAXIMIZE;
    

    未定义的系统命令常数:
    61441: 拖动左边框
    61442: 拖动右边框
    61443: 拖动上边框
    61444: 拖动左上角
    61445: 拖动右上角
    61446: 拖动下边框
    61447: 拖动左下角
    61448: 拖动右下角
    
    61458: 拖动标题栏
    
    61558: 横向滚动条滚动
    61574: 双击横向滚动条
    61575: 纵向滚动条滚动
    61559: 双击纵向滚动条
    61587: 点击最小化图标
    61490: 在非最大化时双击标题栏
    61730: 在最大化时双击标题栏
    
    //可能还有...
    

    WM_SYSCOMMAND 是做什么的? 咱们先看看把 WM_SYSCOMMAND 消息封锁掉是什么样子吧:

    代码文件:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    
    type
      TForm1 = class(TForm)
        Label1: TLabel;
        procedure FormCreate(Sender: TObject);
        procedure FormDblClick(Sender: TObject);
      protected
        procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.FormCreate(Sender: TObject);
    const
      br = #13#10;
    begin
      Label1.AutoSize := True;
      Label1.Caption :=
        '此窗体屏蔽了 SYSCOMMAND 消息!' + br +
        '将无法改变窗体大小;' + br +
        '将无法移动窗体;' + br +
        '将无法最大、最小化窗体;' + br +
        '也将无法通过常规途径关闭窗体.' + br +
        '' + br +
        '所以提供了双击窗体关闭的功能.';
      Label1.OnDblClick := OnDblClick;
    end;
    
    procedure TForm1.FormDblClick(Sender: TObject);
    begin
      Close;
    end;
    
    procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
    begin
    //  inherited; {取消这句的注释, WM_SysCommand 就活了}
    end;
    
    end.
    
    窗体文件:
    object Form1: TForm1
      Left = 0
      Top = 0
      Caption = 'Form1'
      ClientHeight = 172
      ClientWidth = 264
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      OldCreateOrder = False
      OnCreate = FormCreate
      OnDblClick = FormDblClick
      PixelsPerInch = 96
      TextHeight = 13
      object Label1: TLabel
        Left = 24
        Top = 24
        Width = 89
        Height = 33
        Caption = 'Label1'
      end
    end
    
  • 相关阅读:
    C#流(stream)
    高并发图片(缩略图)处理中间层服务架构设计
    WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化
    我们一起学习WCF 第六篇文件传输
    远程服务器返回了意外相应:(413) Request Entity Too Large。
    三层架构
    传说中的WCF(9):流与文件传输
    分享WCF文件传输---WCFFileTransfer
    分享基于EF+WCF的通用三层架构及解析
    Winform开发框架之框架演化
  • 原文地址:https://www.cnblogs.com/del/p/1323683.html
Copyright © 2020-2023  润新知