Windows 编程[1] - 窗体生成的过程一

本例效果图:



新建一个控制台程序, 贴入下面代码即可运行:


program Project1;

uses
  Windows, Messages;

{等待调用的过程, 用于在窗体上绘制文本}
Procedure OnPaint(h: HDC);
const
  s = 'CodeGear Delphi 2007';
begin
  TextOut(h, 10, 10, PChar(s), Length(s));
end;

{窗口回调过程}
function WndProc(wnd: HWND; msg: UINT; wParam: Integer; lParam: Integer): Integer; stdcall;
var
  Handle: HDC;
  ps: PAINTSTRUCT;
begin
  case msg of
    WM_PAINT: begin
        Handle := BeginPaint(wnd, ps);
        OnPaint(Handle);
        EndPaint(wnd, ps);
        result := 0;
     end;
    WM_DESTROY: begin
        PostQuitMessage(0);
        result := 0;
      end;
   else
      Result := DefWindowProc(wnd, msg, wParam, lParam);
   end;
end;

{主程序}
var
  hWnd       : THandle;
  Msg        : TMsg;
  MyWndClass : TWndClass;
begin
   MyWndClass.style         := CS_HREDRAW or CS_VREDRAW;
   MyWndClass.lpfnWndProc   := @WndProc;
   MyWndClass.cbClsExtra    := 0;
   MyWndClass.cbWndExtra    := 0;
   MyWndClass.hInstance     := HInstance;
   MyWndClass.hIcon         := LoadIcon(0, IDI_QUESTION);
   MyWndClass.hCursor       := LoadCursor(0, IDC_ARROW);
   MyWndClass.hbrBackground := HBRUSH(GetStockObject(WHITE_BRUSH));
   MyWndClass.lpszMenuName  := nil;
   MyWndClass.lpszClassName := 'MyWindowClass';

   RegisterClass(MyWndClass);

   hWnd := CreateWindow('MyWindowClass', '这是窗口标题', WS_OVERLAPPEDWINDOW,
      100, 100, 250, 150, 0, 0, HInstance, nil);

   ShowWindow(hWnd, SW_SHOWNORMAL);
   UpdateWindow(hWnd);

   while(GetMessage(Msg, 0, 0, 0)) do
   begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
   end;
end.

计划从这里出发, 了解更多底层的东西; 先弄明白这些代码吧!