曾经做过一个最简单的 Windows 程序: 新建一个 Delphi 控制台程序, 贴入以下代码, 即可运行.
同样的道理, 我们也可以使用 ShellAPI 单元下的 ShellAbout 调用一个关于窗口:
暂且抛弃使用 Forms.TForm 类的想法, 让一切从头开始, 也就是从 Windows API 开始.
现在我们能够想到的代码应该是这样:
首先要用 CreateWindow 创建窗口, 才能用 ShowWindow 显示窗口; 因为 ShowWindow 需要 CreateWindow 返回的句柄.
在 CreateWindow 的参数中, 位置与大小与窗口标题无须多说;
父窗口与菜单, 暂时都不需要, 先可置为 0;
程序实例的句柄, Delphi 已经为我们准备好了: HInstance; (参见原来的说明)
窗口样式在前面的例子中我们使用了: WS_OVERLAPPEDWINDOW, 它代表几种特点的组合, 表示了常规窗口.
CreateWindow 还有一个重要参数(第一个参数 lpClassName): 窗口类的名字.
Windows 要求我们要登记并注册一个窗口类以后, 才可以用 CreateWindow 建立窗口!
另附控件样式参考:
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; {只接受数字输入}