【WIN32API&DAPI】RegisterClass & CreateWindowEx & UpdateWindow

创建窗口:基本的步骤

使用低层Windows API函数创建窗口是一个繁琐但是易于理解的任务。为了创建一个窗口,开发者必须实现下面的三个步骤:

 1.首先必须注册一个新的窗口类(RegisterClass)。如果开发人员创建的窗口基于系统预定义的类,则该过程可以省略。

 2.然后使用窗口创建函数创建窗口(CreateWindowEx)。

 3.最后,将窗口显示在屏幕上(UpdateWindow)。如果在调用创建窗口函数时dwStyle参数中包括了WSVISIBLE风格标志,则这个过程可以省略。

2011011717525095.png

新建控制台程序

 

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.

转载于:https://www.cnblogs.com/keyvip/archive/2011/01/17/1937651.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值