Windows 编程[2] - 学习窗体生成的过程二

曾经做过一个最简单的 Windows 程序: 新建一个 Delphi 控制台程序, 贴入以下代码, 即可运行.

program Project1;

uses Windows;

begin

  MessageBox(0,PChar('Ok!'),PChar('Title'),0);

end.


 
   
代码分析: 系统函数 MessageBox 即可生成一个消息窗口; 因为这个函数来自 Windows 单元, 需要 uses Windows;

同样的道理, 我们也可以使用 ShellAPI 单元下的 ShellAbout 调用一个关于窗口:

program Project1;

uses ShellAPI;

begin

  ShellAbout(0, '万一的 Delphi 博客', 'Copyright: 万一', 0);

end.


 
   
但这都是 Windows 固定模式和固定功能的窗口, 如果创建一个普通的窗口呢?

暂且抛弃使用 Forms.TForm 类的想法, 让一切从头开始, 也就是从 Windows API 开始.

现在我们能够想到的代码应该是这样:

program Project1;

begin

  //创建窗口 CreateWindow

  //显示窗口 ShowWindow

end.


 
   
认识 ShowWindow 函数:

ShowWindow(

  hWnd: HWND;       {要显示的窗口的句柄}

  nCmdShow: Integer {选项, 参加下表}

): BOOL;



//uCmdShow 参数可选值:

SW_HIDE            = 0;  {隐藏, 并且任务栏也没有最小化图标}

SW_SHOWNORMAL      = 1;  {用最近的大小和位置显示, 激活}

SW_NORMAL          = 1;  {同 SW_SHOWNORMAL}

SW_SHOWMINIMIZED   = 2;  {最小化, 激活}

SW_SHOWMAXIMIZED   = 3;  {最大化, 激活}

SW_MAXIMIZE        = 3;  {同 SW_SHOWMAXIMIZED}

SW_SHOWNOACTIVATE  = 4;  {用最近的大小和位置显示, 不激活}

SW_SHOW            = 5;  {同 SW_SHOWNORMAL}

SW_MINIMIZE        = 6;  {最小化, 不激活}

SW_SHOWMINNOACTIVE = 7;  {同 SW_MINIMIZE}

SW_SHOWNA          = 8;  {同 SW_SHOWNOACTIVATE}

SW_RESTORE         = 9;  {同 SW_SHOWNORMAL}

SW_SHOWDEFAULT     = 10; {同 SW_SHOWNORMAL}

SW_MAX             = 10; {同 SW_SHOWNORMAL}


 
   
认识 CreateWindow 函数:

CreateWindow(

  lpClassName: PChar;     {窗口类的名字}

  lpWindowName: PChar;    {窗口标题}

  dwStyle: DWORD;         {窗口样式, 参加下表}

  X,Y: Integer;           {位置; 默认的X,Y可以指定为: Integer(CW_USEDEFAULT)}

  nWidth,nHeight: Integer;{大小; 默认的宽度、高度可以指定为: Integer(CW_USEDEFAULT)}}

  hWndParent: HWND;       {父窗口句柄}

  hMenu: HMENU;           {主菜单句柄}

  hInstance: HINST;       {模块实例句柄, 也就是当前 exe 的句柄}

  lpParam: Pointer        {附加参数, 创建多文档界面时才用到, 一般设为 nil}

): HWND;                  {返回所创建的窗口的句柄}



//dwStyle 窗口样式参数可选值:

WS_OVERLAPPED       = 0;                {重叠式窗口, 应带标题栏和边框}

WS_POPUP            = DWORD($80000000); {弹出式窗口, 不能与 WS_CHILD 一起使用}

WS_CHILD            = $40000000;        {子窗口, 不能与 WS_POPUP 一起使用}

WS_MINIMIZE         = $20000000;        {最小化窗口}

WS_VISIBLE          = $10000000;        {初始时可见}

WS_DISABLED         = $8000000;         {禁止输入}

WS_CLIPSIBLINGS     = $4000000;         {裁剪子窗口, 也就是子窗口重绘不影响重叠的其他子窗口, 应与 WS_CHILD 一起使用}

WS_CLIPCHILDREN     = $2000000;         {在父窗口中绘图时绕开子窗口区域, 创建父窗口是使用}

WS_MAXIMIZE         = $1000000;         {最大化窗口}

WS_CAPTION          = $C00000;          {有标题栏}

WS_BORDER           = $800000;          {有细线边框}

WS_DLGFRAME         = $400000;          {对话框窗口}

WS_VSCROLL          = $200000;          {有垂直滚动条}

WS_HSCROLL          = $100000;          {有水平滚动条}

WS_SYSMENU          = $80000;           {带系统标题栏, 须同时指定 WS_CAPTION}

WS_THICKFRAME       = $40000;           {带宽边框, 宽边框用于改变窗口大小}

WS_GROUP            = $20000;           {能用方向键转移焦点}

WS_TABSTOP          = $10000;           {能用 TAB 转移焦点}

WS_MINIMIZEBOX      = $20000;           {有最小化按钮}

WS_MAXIMIZEBOX      = $10000;           {有最大化按钮}

WS_TILED            = WS_OVERLAPPED;

WS_ICONIC           = WS_MINIMIZE;

WS_SIZEBOX          = WS_THICKFRAME;

WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED or WS_CAPTION or WS_SYSMENU or WS_THICKFRAME or WS_MINIMIZEBOX or WS_MAXIMIZEBOX);

WS_TILEDWINDOW      = WS_OVERLAPPEDWINDOW;

WS_POPUPWINDOW      = (WS_POPUP or WS_BORDER or WS_SYSMENU);

WS_CHILDWINDOW      = (WS_CHILD);



//另外还有一些扩展样式:

WS_EX_DLGMODALFRAME    = 1;      {指定双边界窗口; 藉此指定 WS_CAPTION 创建标题栏}

WS_EX_NOPARENTNOTIFY   = 4;      {在窗口创建或取消时不向父窗口发送 WM_PARENTNOTIFY 消息}

WS_EX_TOPMOST          = 8;      {在所有非最顶层窗口的上面}

WS_EX_ACCEPTFILES      = $10;    {可接受拖放文件}

WS_EX_TRANSPARENT      = $20;    {透明样式, 在同属窗口已重画时该窗口才可重画}

WS_EX_MDICHILD         = $40;    {创建一个 MDI 子窗口}

WS_EX_TOOLWINDOW       = $80;    {工具窗口}

WS_EX_WINDOWEDGE       = $100;   {带立体的边框}

WS_EX_CLIENTEDGE       = $200;   {带阴影的边界}

WS_EX_CONTEXTHELP      = $400;   {标题包含一个问号标志, 不能与 WS_MAXIMIZEBOX 和 WS_MINIMIZEBOX 同时使用}

WS_EX_RIGHT            = $1000;  {窗口具有右对齐属性}

WS_EX_LEFT             = 0;      {窗口具有左对齐属性, WS_EX_LEFT 是缺省设置}

WS_EX_RTLREADING       = $2000;  {窗口文本从右到左}

WS_EX_LTRREADING       = 0;      {窗口文本从左到右, WS_EX_LTRREADING 是缺省设置}

WS_EX_LEFTSCROLLBAR    = $4000;  {垂直滚动条在左边界, 只用于特殊语言环境}

WS_EX_RIGHTSCROLLBAR   = 0;      {垂直滚动条在右边界, WS_EX_RIGHTSCROLLBAR 是缺省设置}

WS_EX_CONTROLPARENT    = $10000; {允许用户使用 Tab 键在窗口的子窗口间搜索}

WS_EX_STATICEDGE       = $20000; {窗口不可用时创建一个三维边界}

WS_EX_APPWINDOW        = $40000; {当窗口可见时, 将一个顶层窗口放置到任务条上}

WS_EX_OVERLAPPEDWINDOW = (WS_EX_WINDOWEDGE or WS_EX_CLIENTEDGE); {立体边框并带阴影}

WS_EX_PALETTEWINDOW    = (WS_EX_WINDOWEDGE or WS_EX_TOOLWINDOW or WS_EX_TOPMOST); {立体边框、工具条窗口样式、在顶层}

WS_EX_LAYERED          = $00080000; {分层或透明窗口, 该样式可使用混合特效}

WS_EX_NOINHERITLAYOUT  = $00100000; {子窗口不继承父窗口的布局}

WS_EX_LAYOUTRTL        = $00400000; {从右到左的布局}

WS_EX_COMPOSITED       = $02000000; {用双缓冲从下到上绘制窗口的所有子孙}

WS_EX_NOACTIVATE       = $08000000; {处于顶层但不激活}


 
   
分析:

首先要用 CreateWindow 创建窗口, 才能用 ShowWindow 显示窗口; 因为 ShowWindow 需要 CreateWindow 返回的句柄.

在 CreateWindow 的参数中, 位置与大小与窗口标题无须多说;
父窗口与菜单, 暂时都不需要, 先可置为 0;
程序实例的句柄, Delphi 已经为我们准备好了: HInstance; ( 参见原来的说明)
窗口样式在前面的例子中我们使用了: WS_OVERLAPPEDWINDOW, 它代表几种特点的组合, 表示了常规窗口.

CreateWindow 还有一个重要参数(第一个参数 lpClassName): 窗口类的名字.
Windows 要求我们要登记并注册一个窗口类以后, 才可以用 CreateWindow 建立窗口!

另附控件样式参考:

ES_LEFT        = 0;     {左对齐}

ES_CENTER      = 1;     {居中}

ES_RIGHT       = 2;     {右对齐}

ES_MULTILINE   = 4;     {多行}

ES_UPPERCASE   = 8;     {全大写}

ES_LOWERCASE   = $10;   {全小写}

ES_PASSWORD    = $20;   {掩码字符}

ES_AUTOVSCROLL = $40;   {自动垂直滚动}

ES_AUTOHSCROLL = $80;   {自动水平滚动}

ES_NOHIDESEL   = $100;  {始终显示选中部分}

ES_OEMCONVERT  = $400;  {允许 ANSI 和 OEM 互相转换}

ES_READONLY    = $800;  {只读}

ES_WANTRETURN  = $1000; {可接受回车换行}

ES_NUMBER      = $2000; {只接受数字输入}


 
   

你可能感兴趣的:(windows)