技术主管给我的一个考题:用Delphi写一个Windows下的纯SDK程序
其实,无论是Delphi、C++ Builder,还是Visual C++,虽然这些IDE功能性能各异,但通过编译器编译出来的,在Windows上运行的二进制代码,其实是相通的。(其实到汇编层次你就会知道他们编译出的程序没有太大区别了)
纯的SDK,不包含任何其他库类,是一种符合Windows程序设计的通用的标准,不经过任何封装,通过消息机制驱动程序,最原始的反映了Windows的程序运行的基本流程。
对于SDK程序而言,C/C++能做到的,Delphi Pascal也能做到。虽然在语法上有所不同,但程序的结构上是完全相同的。当然,这里还是需要引用一些单元,这个同Visual C++中包含头文件的道理是一样的。
抛开语言的界限,其实都一样。
- //作者:zencher
- //
- //说明:这是一个完全基于Windows SDK的,由Delphi编写的程序。
- //该程序会创建一个有白色背景的窗口和一个按钮,点击按钮,窗口消
- //失,并生成系统托盘,双击系统托盘,窗口出现。
- //
- program SDK_Delphi;
- uses
- Windows, Messages, ShellApi;
- var
- msg: TMsg; //消息结构体
- wndClass: TWndClass; //窗口类
- hWnd: THandle; //窗口句柄
- ni: TNOTIFYICONDATA; //关于通知图标的信息的结构体,用于生成系统托盘
- //窗口处理函数
- function WndProc(hwnd: THandle; MsgID: UINT; wParam, lParam: Integer):
- LRESULT;
- stdcall;
- var
- hCtrlWnd: THANDLE; //按钮控件句柄
- dc: HDC;
- ps: TPaintStruct;
- begin
- //根据不同的消息做不同的处理
- case MsgID of
- 1001: //自定义消息,在双击系统托盘时产生
- begin
- if WM_LBUTTONDBLCLK = lParam then
- begin
- ShowWindow(hwnd, SW_NORMAL);
- Shell_NotifyIcon(NIM_DELETE, @ni);
- end;
- Exit;
- end;
- WM_SYSCOMMAND:
- begin
- if wParam = SC_MINIMIZE then
- begin
- SendMessage(hwnd, WM_COMMAND, 1, 0);
- end
- else
- Result := DefWindowProc(hwnd, MsgID, wParam, lParam);
- end;
- WM_COMMAND:
- begin
- if wParam = 1 then
- begin
- ni.cbSize := sizeof(TNOTIFYICONDATA);
- ni.Wnd := hwnd;
- ni.uFlags := NIF_MESSAGE or NIF_INFO or NIF_TIP or NIF_ICON;
- ni.uID := 1000;
- ni.hIcon := LoadIcon(0, IDI_APPLICATION);
- ni.uCallbackMessage := 1001;
- ni.szInfo := '双击这里恢复窗口';
- ni.szInfoTitle := '注意!';
- ni.szTip := 'SDK_BY_DELPHI';
- ni.uTimeout := 15;
- Shell_NotifyIcon(NIM_ADD, @ni);
- ShowWindow(hwnd, SW_HIDE);
- end;
- end;
- WM_PAINT:
- begin
- dc := BeginPaint(hwnd, ps);
- TextOut(dc, 20, 20, '这是一个用Delphi写的SDK程序',
- length('这是一个用Delphi写的SDK程序'));
- EndPaint(hwnd, ps);
- Exit;
- end;
- WM_CREATE:
- begin
- hCtrlWnd := CreateWindow('BUTTON',
- 'Click Here',
- WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON,
- 20, 50,
- 100, 30,
- hwnd, 1,
- system.MainInstance, 0);
- Exit;
- end;
- WM_CLOSE:
- begin
- if MessageBox(hwnd, '你确定要关闭吗?',
- '哦?要关闭啊?', MB_YESNO) = IDYES then
- PostQuitMessage(0);
- Exit;
- end;
- else
- Result := DefWindowProc(hwnd, MsgID, wParam, lParam);
- end;
- end;
- begin
- //创建窗口类
- wndclass.style := CS_HREDRAW or CS_VREDRAW;
- wndclass.lpfnWndProc := @WndProc;
- wndclass.cbClsExtra := 0;
- wndclass.cbWndExtra := DLGWINDOWEXTRA;
- wndclass.hInstance := system.MainInstance;
- wndclass.hIcon := LoadIcon(0, IDI_APPLICATION);
- wndclass.hCursor := LoadCursor(0, IDC_ARROW);
- wndclass.hbrBackground := GetStockObject(WHITE_BRUSH);
- wndclass.lpszMenuName := nil;
- wndclass.lpszClassName := 'SDK_BY_DELPHI';
- //注册窗口类
- if RegisterClass(wndclass) = 0 then
- begin
- Exit;
- end;
- //创建窗口
- hWnd := CreateWindow('SDK_BY_DELPHI',
- 'A SDK Program make by Delphi!',
- WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT,
- CW_USEDEFAULT,
- CW_USEDEFAULT,
- CW_USEDEFAULT,
- 0,
- 0,
- system.MainInstance,
- 0);
- //更新和显示窗口
- ShowWindow(hwnd, SW_NORMAL);
- UpdateWindow(hWnd);
- //消息循环
- while GetMessage(&msg, 0, 0, 0) do
- begin
- TranslateMessage(msg);
- DispatchMessage(msg);
- end;
- end.
写过SDK程序的朋友一定觉得很熟悉吧。