创建窗口:基本的步骤
使用低层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.