创建窗口:基本的步骤
使用低层Windows API函数创建窗口是一个繁琐但是易于理解的任务。为了创建一个窗口,开发者必须实现下面的三个步骤:
1.首先必须注册一个新的窗口类(RegisterClass)。如果开发人员创建的窗口基于系统预定义的类,则该过程可以省略。
2.然后使用窗口创建函数创建窗口(CreateWindowEx)。
3.最后,将窗口显示在屏幕上(UpdateWindow)。如果在调用创建窗口函数时dwStyle参数中包括了WSVISIBLE风格标志,则这个过程可以省略。
新建控制台程序
program Project1;
uses
Windows,Messages;
{$R *.RES}
{核心API窗口的窗口过程}
function WindowProc(TheWindow: HWnd; TheMessage:UINT; WParam,LParam: Integer): Integer; stdcall;
begin
case TheMessage of
{收到WM_DESTROY消息后,退出程序}
WM_DESTROY: begin
PostQuitMessage(0);
Exit;
end;
end;
{对于所有未处理的过程调用默认的窗口过程}
Result := DefWindowProc(TheWindow, TheMessage, WParam, LParam);
end;
{ 注册窗口类 }
function RegisterClass: Boolean;
var
WindowClass: TWndClass;
begin
{设置新窗口类}
WindowClass.Style := CS_HREDRAW or CS_VREDRAW; {设置类风格}
WindowClass.lpfnWndProc := @WindowProc; {指向窗口过程的指针}
WindowClass.cbClsExtra := 0; {没有额外的类信息}
WindowClass.cbWndExtra := 0; {没有额外的窗口信息}
WindowClass.hInstance := hInstance; {程序实例}
WindowClass.hIcon := LoadIcon(0, IDI_APPLICATION); {载入预定义标志}
WindowClass.hCursor := LoadCursor(0, IDC_UPARROW); {载入预定义光标}
WindowClass.hbrBackground := COLOR_WINDOW; {使用预定义颜色}
WindowClass.lpszMenuName := nil; {没有菜单}
WindowClass.lpszClassName := 'TestClass'; {注册的类名称}
{设置完新的窗口类后在系统中注册}
Result := Windows.RegisterClass(WindowClass) <> 0;
end;
var
TheMessage: TMsg;
OurWindow: HWND;
begin
{注册新窗口类}
if not RegisterClass then
begin
MessageBox(0,'注册窗口类失败!',nil,MB_OK);
Exit;
end;
{在新窗口类的基础上建立窗口}
OurWindow := CreateWindowEx(0, {没有扩展风格}
'TestClass', {已注册的类名称}
'我们的窗口', {标题栏文本}
WS_OVERLAPPEDWINDOW or {通用窗口风格}
WS_HSCROLL, {初始化时不可见}
CW_USEDEFAULT, {默认水平位置}
CW_USEDEFAULT, {默认垂直位置}
CW_USEDEFAULT, {默认宽度}
CW_USEDEFAULT, {默认高度}
0, {父窗口句柄}
0, {没有菜单}
hInstance, {程序实例}
nil {没有附加信息}
);
{如果窗口没有建立成功,则退出程序}
if OurWindow=0 then
begin
MessageBox(0,'创建窗口失败!',nil,MB_OK);
Exit;
end
else
begin
ShowWindow(OurWindow, SW_SHOWNORMAL); {显示更新窗口}
UpdateWindow(OurWindow);
end;
{标准消息循环}
while GetMessage(TheMessage,0,0,0) do
begin
TranslateMessage(TheMessage);
DispatchMessage(TheMessage);
end;
end.