用Delphi写一个Windows下的纯SDK程序

来源:互联网 发布:网络使人更疏远的提问 编辑:程序博客网 时间:2024/06/10 04:57

技术主管给我的一个考题:用Delphi写一个Windows下的纯SDK程序

其实,无论是Delphi、C++ Builder,还是Visual C++,虽然这些IDE功能性能各异,但通过编译器编译出来的,在Windows上运行的二进制代码,其实是相通的。(其实到汇编层次你就会知道他们编译出的程序没有太大区别了)

纯的SDK,不包含任何其他库类,是一种符合Windows程序设计的通用的标准,不经过任何封装,通过消息机制驱动程序,最原始的反映了Windows的程序运行的基本流程。

对于SDK程序而言,C/C++能做到的,Delphi Pascal也能做到。虽然在语法上有所不同,但程序的结构上是完全相同的。当然,这里还是需要引用一些单元,这个同Visual C++中包含头文件的道理是一样的。

抛开语言的界限,其实都一样。

 

  1. //作者:zencher
  2. //
  3. //说明:这是一个完全基于Windows SDK的,由Delphi编写的程序。
  4. //该程序会创建一个有白色背景的窗口和一个按钮,点击按钮,窗口消
  5. //失,并生成系统托盘,双击系统托盘,窗口出现。
  6. //
  7. program SDK_Delphi;
  8. uses
  9.   Windows, Messages, ShellApi;
  10. var
  11.   msg: TMsg;             //消息结构体
  12.   wndClass: TWndClass;   //窗口类
  13.   hWnd: THandle;         //窗口句柄
  14.   ni: TNOTIFYICONDATA;   //关于通知图标的信息的结构体,用于生成系统托盘
  15. //窗口处理函数
  16. function WndProc(hwnd: THandle; MsgID: UINT; wParam, lParam: Integer):
  17. LRESULT;
  18.   stdcall;
  19. var
  20.   hCtrlWnd: THANDLE;    //按钮控件句柄
  21.   dc: HDC;
  22.   ps: TPaintStruct;
  23. begin
  24. //根据不同的消息做不同的处理
  25.   case MsgID of
  26.     1001:    //自定义消息,在双击系统托盘时产生
  27.       begin
  28.         if WM_LBUTTONDBLCLK = lParam then
  29.         begin
  30.           ShowWindow(hwnd, SW_NORMAL);
  31.           Shell_NotifyIcon(NIM_DELETE, @ni);
  32.         end;
  33.         Exit;
  34.       end;
  35.     WM_SYSCOMMAND:
  36.       begin
  37.         if wParam = SC_MINIMIZE then
  38.         begin
  39.           SendMessage(hwnd, WM_COMMAND, 10);
  40.         end
  41.         else
  42.           Result := DefWindowProc(hwnd, MsgID, wParam, lParam);
  43.       end;
  44.     WM_COMMAND:
  45.       begin
  46.         if wParam = 1 then
  47.         begin
  48.           ni.cbSize := sizeof(TNOTIFYICONDATA);
  49.           ni.Wnd := hwnd;
  50.           ni.uFlags := NIF_MESSAGE or NIF_INFO or NIF_TIP or NIF_ICON;
  51.           ni.uID := 1000;
  52.           ni.hIcon := LoadIcon(0, IDI_APPLICATION);
  53.           ni.uCallbackMessage := 1001;
  54.           ni.szInfo := '双击这里恢复窗口';
  55.           ni.szInfoTitle := '注意!';
  56.           ni.szTip := 'SDK_BY_DELPHI';
  57.           ni.uTimeout := 15;
  58.           Shell_NotifyIcon(NIM_ADD, @ni);
  59.           ShowWindow(hwnd, SW_HIDE);
  60.         end;
  61.       end;
  62.     WM_PAINT:
  63.       begin
  64.         dc := BeginPaint(hwnd, ps);
  65.         TextOut(dc, 2020'这是一个用Delphi写的SDK程序',
  66.           length('这是一个用Delphi写的SDK程序'));
  67.         EndPaint(hwnd, ps);
  68.         Exit;
  69.       end;
  70.     WM_CREATE:
  71.       begin
  72.         hCtrlWnd := CreateWindow('BUTTON',
  73.           'Click Here',
  74.           WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON,
  75.           2050,
  76.           10030,
  77.           hwnd, 1,
  78.           system.MainInstance, 0);
  79.         Exit;
  80.       end;
  81.     WM_CLOSE:
  82.       begin
  83.         if MessageBox(hwnd, '你确定要关闭吗?',
  84.           '哦?要关闭啊?', MB_YESNO) = IDYES then
  85.           PostQuitMessage(0);
  86.         Exit;
  87.       end;
  88.   else
  89.     Result := DefWindowProc(hwnd, MsgID, wParam, lParam);
  90.   end;
  91. end;
  92. begin
  93. //创建窗口类
  94.   wndclass.style := CS_HREDRAW or CS_VREDRAW;
  95.   wndclass.lpfnWndProc := @WndProc;
  96.   wndclass.cbClsExtra := 0;
  97.   wndclass.cbWndExtra := DLGWINDOWEXTRA;
  98.   wndclass.hInstance := system.MainInstance;
  99.   wndclass.hIcon := LoadIcon(0, IDI_APPLICATION);
  100.   wndclass.hCursor := LoadCursor(0, IDC_ARROW);
  101.   wndclass.hbrBackground := GetStockObject(WHITE_BRUSH);
  102.   wndclass.lpszMenuName := nil;
  103.   wndclass.lpszClassName := 'SDK_BY_DELPHI';
  104. //注册窗口类
  105.   if RegisterClass(wndclass) = 0 then
  106.   begin
  107.     Exit;
  108.   end;
  109. //创建窗口
  110.   hWnd := CreateWindow('SDK_BY_DELPHI',
  111.     'A SDK Program make by Delphi!',
  112.     WS_OVERLAPPEDWINDOW,
  113.     CW_USEDEFAULT,
  114.     CW_USEDEFAULT,
  115.     CW_USEDEFAULT,
  116.     CW_USEDEFAULT,
  117.     0,
  118.     0,
  119.     system.MainInstance,
  120.     0);
  121. //更新和显示窗口
  122.   ShowWindow(hwnd, SW_NORMAL);
  123.   UpdateWindow(hWnd);
  124. //消息循环
  125.   while GetMessage(&msg, 000do
  126.   begin
  127.     TranslateMessage(msg);
  128.     DispatchMessage(msg);
  129.   end;
  130. end.

写过SDK程序的朋友一定觉得很熟悉吧。

原创粉丝点击