zoukankan      html  css  js  c++  java
  • Delphi用Win32 API创建窗体

    program delphi;
    uses
    windows,
    messages;
    const
    hellostr='Hello World!';
    {$R delphi.res}
    //窗口消息处理函数.
    function MyWinProc(hWnd:THandle;uMsg:UINT;wParam,lParam:Cardinal):Cardinal;stdcall;
    var
    hdca,hdcb:THandle; //设备描述表句柄.
    rect:TRect; //矩形结构.
    font:HFont;
    ps:TPaintStruct; //绘图结构.
    begin
    result:=0;
    case uMsg of
    WM_PAINT:
    begin
    hdca:=BeginPaint(hWnd,ps);
    SetBkMode(hdca, Transparent);
    SetBkColor(hdca,GetBkColor(hdca));
    GetClientRect(hWnd,rect); //获取窗口客户区的尺寸.
    DrawText(hdca,Pchar(hellostr),-1,rect,DT_SINGLELINE or DT_CENTER or DT
    _VCENTER);
    // TextOut(hdc,100,40,hellostr,Length(hellostr));
    EndPaint(hWnd,ps);
    end;
    WM_CREATE:
    begin
    hdcb := GetDC(hWnd);
    font := CreateFont(45, 0, 0, 0, FW_normal, 0, 0, 0, ansi_charset, out
    _default_precis, clip_default_precis,
    default_quality, 34, PChar('Arial'));
    SelectObject(hdcb, font);
    ReleaseDC(hWnd, hdcb);
    end;
    WM_DESTROY:
    PostQuitMessage(0)
    else
    //使用缺省的窗口消息处理函数.
    result:=DefWindowProc(hWnd,uMsg,wParam,lParam);
    end;
    end;
    //主程序开始.
    var
    Msg :TMsg; //消息结构.
    hWnd,hInst :THandle; //Windows 窗口句柄.
    WinClass :TWndClassEx; //Windows 窗口类结构.
    begin
    hInst:=GetModuleHandle(nil); // get the application instance
    WinClass.cbSize:=SizeOf(TWndClassEx);
    WinClass.lpszClassName:='MyWindow'; //类名.
    WinClass.style:=CS_HREDRAW or CS_VREDRAW or CS_OWNDC;
    WinClass.hInstance:=hInst; //程序的实例句柄.
    //设置窗口消息处理函数.
    WinClass.lpfnWndProc:=@MyWinProc; //窗口过程.
    WinClass.cbClsExtra:=0; //以下两个域用于在类结构和Window
    s内部保存的窗口结构
    WinClass.cbWndExtra:=0; //中预留一些额外空间.
    WinClass.hIcon:=LoadIcon(hInstance,MakeIntResource('MAINICON'));
    WinClass.hIconsm:=LoadIcon(hInstance,MakeIntResource('MAINICON'));
    WinClass.hCursor:=LoadCursor(0,IDC_Arrow);
    //GetStockObject 获取一个图形对象,在这里是获取绘制窗口背景的刷子,返回一个白色刷
    子的句柄.
    WinClass.hbrBackground:=HBRUSH(GetStockObject(white_Brush));
    WinClass.lpszMenuName:=nil; //指定窗口类菜单.
    //向Windows 注册窗口类.
    if RegisterClassEx(WinClass)=0 then
    begin
    MessageBox(0,'Registeration Error!','SDK/API',MB_OK);
    Exit;
    end;
    //建立窗口对象.
    hWnd:=CreateWindowEx(
    WS_EX_OVERLAPPEDWINDOW, //扩展的窗口风格.
    WinClass.lpszClassName, //类名.
    'Hello Window', //窗口标题.
    WS_OVERLAPPEDWINDOW, //窗口风格.
    CW_USEDEFAULT, //窗口左上角相对于屏幕
    左上角的初始位置x.
    0, //....右y.
    CW_USEDEFAULT, //窗口宽度x.
    0, //窗口高度y.
    0, //父窗口句柄.
    0, //窗口菜单句柄.
    hInst, //程序实例句柄.
    nil); //创建参数指针.
    if hWnd=0 then
    begin
    MessageBox(0,'Window not Created!','SDK/API',MB_OK);
    UnregisterClass('MyWindow', hInst); 
    exit;
    end;
    ShowWindow(hWnd,SW_SHOWNORMAL); //显示窗口.
    UpdateWindow(hWnd); //指示窗口刷新自己.
    SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE);
    //主消息循环程序.
    while GetMessage(Msg,0,0,0) do
    begin
    TranslateMessage(Msg); //转换某些键盘消息.
    DispatchMessage(Msg); //将消息发送给窗口过程.
    end;
    end.
    其实Windows 编程是每个学写程序的人都要掌握的,学Delphi时也最好能先学习Windos编程(最少要知道).以上代码虽说不如在Delphi中直接来个New->Form来的快,但它能告诉你本质的东西.能让你更好的了解消息循环以及其他.而这些正是让New出来的窗体给掩盖的部分。
     
  • 相关阅读:
    不常用的cmd命令
    js获取宽度
    Marshaling Data with Platform Invoke 概览
    Calling a DLL Function 之三 How to: Implement Callback Functions
    Marshaling Data with Platform Invoke 之四 Marshaling Arrays of Types
    Marshaling Data with Platform Invoke 之一 Platform Invoke Data Types
    Marshaling Data with Platform Invoke 之三 Marshaling Classes, Structures, and Unions(用时查阅)
    Calling a DLL Function 之二 Callback Functions
    WCF 引论
    Marshaling Data with Platform Invoke 之二 Marshaling Strings (用时查阅)
  • 原文地址:https://www.cnblogs.com/huhu0013/p/1755378.html
Copyright © 2011-2022 走看看