Windows 编程[6] - 学习窗体生成的过程六: 最终的代码!


program Project1;



uses

  Windows, Messages;



{回调函数; 其中要处理的消息很多, 最好用 case 语句}

function WndProc(wnd: HWND; msg: UINT; wParam: Integer; lParam: Integer): Integer; stdcall;

begin

  Result := 0;

  case msg of

    WM_DESTROY: PostQuitMessage(0); {收到 WM_DESTROY 后, 发送 WM_QUIT 消息指示退出}

  else

    {其他消息交 DefWindowProc 处理; DefWindowProc 会返回回调函数需要的返回值}

    Result := DefWindowProc(wnd, msg, wParam, lParam);

  end;

end;



{登记与注册窗口类的函数}

function RegMyWndClass: Boolean;

var

  MyWndClass: TWndClass;

begin

  {指定窗口类型}

  MyWndClass.style         := CS_HREDRAW or CS_VREDRAW;  {改变大小时重绘}

  MyWndClass.lpfnWndProc   := @WndProc;                  {回调函数指针}

  MyWndClass.cbClsExtra    := 0;                         {没有额外的窗口类信息}

  MyWndClass.cbWndExtra    := 0;                         {没有额外的窗口信息}

  MyWndClass.hInstance     := HInstance;                 {程序实例句柄}

  MyWndClass.hIcon         := 0;                         {没指定图标}

  MyWndClass.hCursor       := LoadCursor(0, IDC_ARROW);  {选用了系统提供的指针}

  MyWndClass.hbrBackground := HBRUSH(COLOR_BTNFACE + 1); {背景色使用 Windows 默认的按钮颜色}

  MyWndClass.lpszMenuName  := nil;                       {不指定默认菜单}

  MyWndClass.lpszClassName := 'MyWindowClass';           {给窗口类型命名}



  Result := RegisterClass(MyWndClass) <> 0;              {注册窗口类型}

end;



{主程序}

var

  hWnd: THandle;

  Msg : TMsg;

begin

  {调用登记与注册窗口的函数}

  if not RegMyWndClass then

  begin

    MessageBox(0, '窗口类注册失败!', '提示', MB_OK + MB_ICONERROR);

    Exit;

  end;



  {建立窗口并返回句柄; 既然有 CreateWindowEx 就不使用 CreateWindow 了}

  hWnd := CreateWindowEx(0,                      {不使用扩展风格}

                         'MyWindowClass',        {窗口类型名}

                         '新窗口',               {标题}

                         WS_OVERLAPPEDWINDOW,    {窗口的常规样式}

                         Integer(CW_USEDEFAULT), {默认水平位置}

                         Integer(CW_USEDEFAULT), {默认垂直位置}

                         Integer(CW_USEDEFAULT), {默认宽度}

                         Integer(CW_USEDEFAULT), {默认高度}

                         0,                      {无父窗口}

                         0,                      {无主菜单}

                         HInstance,              {实例句柄}

                         nil                     {无附加信息}

                         );



  if hWnd = 0 then {如果窗口建立失败}

  begin

    MessageBox(0, '窗口建立失败!', '提示', MB_OK + MB_ICONERROR);

    Exit;

  end;



  {显示窗口与更新窗口}

  ShowWindow(hWnd, SW_SHOWNORMAL);

  UpdateWindow(hWnd);



  {消息循环; GetMessage 在收到 WM_QUIT 消息时会返回 False, 从而终止循环}

  while(GetMessage(Msg, 0, 0, 0)) do

  begin

    TranslateMessage(Msg); {需要对部分键盘消息的再处理}

    DispatchMessage(Msg);  {将消息发送给回调函数}

  end;

  Halt(Msg.wParam); {没有了消息循环程序自然会退出; 加上这句, 程序会根据退出码主动退出}

end.


 
   

你可能感兴趣的:(windows)