对WINDOWS内部机制了解的高手请进,会给分的。不用DELPHI的可视化特性来编程(100分)

A

atoz

Unregistered / Unconfirmed
GUEST, unregistred user!
; 其实Delphi本质上仍是一种编程语言,只不过它的可视化特性太过强大,
使得程序员往往忘了这一点。使用纯C语言编制Windows应用程序的朋友都知道,
常规的方法是为Windows提供一个回调函数,在这个回调函数中处理各种消息,
而程序的入口是一个名为WinMain的函数。
; ;如果将Delphi看成一个单纯的PASCAL语言,就可以按上述的常规方法编制程序,
下面就是这样一个例子,最终生成的可执行程序十分小,只有不到10KB。
使用C语言编程的朋友可得会觉得下面的代码很眼熟。

program MyApp;

uses Windows, Messages;

// 回调函数
function AppWindowProc(
; ; hWnd:HWND; uMsg:UINT;
; ; wParam:WPARAM; lParam:LPARAM):LRESULT; stdcall;
begin
; Result := 0;
; case uMsg of
; ; WM_DESTROY:begin
; ; ; PostQuitMessage(0);
; ; ; Exit;
; ; end;
; end;
; Result :=
; ; DefWindowProc(hWnd, uMsg, wParam, lParam);
end;

var
; wc: TWndClass;
; hWnd: Integer;
; MSG: TMsg;
begin
; // 程序从这里开始执行
; wc.style := CS_VREDRAW or CS_HREDRAW;
; wc.lpfnWndProc := @AppWindowProc;
; wc.cbClsExtra := 0;

; wc.cbWndExtra := 0;
; wc.hInstance := HInstance;
; wc.hIcon := LoadIcon(0, IDI_APPLICATION);
; wc.hCursor := LoadCursor(0, IDC_ARROW);
; wc.hbrBackground := (COLOR_BTNFACE+1);
; wc.lpszMenuName := nil;
; wc.lpszClassName := 'My App';
; if RegisterClass(wc)=0 then Exit;
; hWnd := CreateWindow(
; ; wc.lpszClassName, 'TEST',
; ; WS_OVERLAPPEDWINDOW,
; ; CW_USEDEFAULT, CW_USEDEFAULT,
; ; CW_USEDEFAULT, CW_USEDEFAULT,
; ; 0, 0, HInstance, nil);
; if hWnd=0 then Exit;
; ShowWindow(hWnd, SW_SHOWNORMAL);
; while GetMessage(MSG, 0, 0, 0) do begin

; ; TranslateMessage(MSG);
; ; DispatchMessage(MSG);
; end;
; Halt(MSG.wParam);
end.
[red]请问谁能帮我解释一下这一程序编写的基本原理,先谢谢各位兄弟姐妹了[/red]
 
所有信息及窗体代码自定义!
也就是——Delphi帮你做的许多事,现在自己来做。
 
这我也知道,但它是怎么定义的呢,能说说它的基本原理吗
 
windows 的编程方法,不知你想知道什么[?]
 
WIN SDK风格的(非MFC的)都是这样的,很奇怪吗?
 
有什么大不了的!
 
去看一本叫 Programming Windows的书,很经典的,上面写了Windows编程的基础,网上有下的
4.5M,in CHM Format
 
是啊,你想知道什么呢?
你贴出来的代码就是创建一个窗口,建立消息循环
看代码就懂了。
AppWindowProc是你创建的那个窗口的过程
DefWindowProc是Delphi为你写的默认窗口过程
 
玩玩可以, 真的要这样做程序,不如去用VC吧
 
同意: htw
 
我就想知道DELPHI不用可视化编程是怎么做,比如建一个窗体它都要做些什么工作.
TO ZHUHUAN:请问Programming Windows的那本书在哪下载,能给个网址吗是中文书籍吗
 
详解如下:
首先是程序头:
如: ; ;
; ; program MyApp;
; ; uses Windows, Messages;
接下来一般是声明全局常量和变量:
如:
; ; const
; ; AppName = '我的程序';
; ; ...
; ; var
; ; x: integer;
; ; ...
然后是定义窗体进程,之所以进程定义放在主程序的前面,这样做的好处是可以直接使用程序中定义的过程:
如:回调(Callback)函数AppWindowProc
每一个标准的或者说是规范的Windows窗口都有一个回调函数,以处理发给该窗口的消息。
其中
; ; WM_DESTROY:begin
; ; PostQuitMessage(0); ;是收到关闭窗口消息时的处理。
; ; ...
到Result :=DefWindowProc(hWnd, uMsg, wParam, lParam);该句表示在处理过消息之后,调用默认函数,以完成标准的Windows程序应该执行的任务。
最后是主程序代码:
如:procedure WinMain; (这一句你贴的代码里漏了)
; ; ;var
; ; ; wc: TWndClass;
; ; ; hWnd: Integer;
; ; ; MSG: TMsg;
; ; ...
; 到wc.lpfnWndProc := @AppWindowProc;这一句取回调函数的地址
; 接下来又是一些资源定义
; 到wc.lpszMenuName := nil;
; ; wc.lpszClassName := 'My App';定义窗口类名
; 然后注册类名,接下来CreateWindow开始创建程序的主窗口,在该程序中是个虚拟窗口。
; 再到if hWnd=0 then Exit;
; ; ; ShowWindow(hWnd, SW_SHOWNORMAL);如果窗口创建成功,则显示窗口并进入消息循环。
; while GetMessage(MSG, 0, 0, 0) do begin 一句则表示进入消息循环,而且该循环将不断运行直到GetMessage返回0。
; ...
最后直到运行结束。

能不能理解就看你的造化了!呵呵!
打得我也困了,睡去也。。。。。。
 
把你的代码解释了一下,不一定都是对的,希望对你有帮助
program MyApp;

uses Windows, Messages;

// 回调函数
function AppWindowProc(
; ; hWnd:HWND; uMsg:UINT;
; ; wParam:WPARAM; lParam:LPARAM):LRESULT; stdcall;
begin
; Result := 0;
; case uMsg of ; ; ; ; ; ; ; ; //判断消息,如果是WM_DESTROY则使GetMessage返回0,既推出消息循环
; ; WM_DESTROY:begin
; ; ; PostQuitMessage(0);
; ; ; Exit;
; ; end;
; end;
; Result :=
; ; DefWindowProc(hWnd, uMsg, wParam, lParam); ; ; ; ;//其他的消息交给默认的窗体过程处理
end;

var
; wc: TWndClass;
; hWnd: Integer;
; MSG: TMsg;
begin
; // 程序从这里开始执行
; wc.style := CS_VREDRAW or CS_HREDRAW; ; ; ; ; ; ; ; ;//长和宽变化后重画窗体
; wc.lpfnWndProc := @AppWindowProc; ; ; ; ; ; ; //窗体过程地址
; wc.cbClsExtra := 0; ; ; ; //?

; wc.cbWndExtra := 0; ; ; ; //?
; wc.hInstance := HInstance; ; ; ; //程序实例句柄
; wc.hIcon := LoadIcon(0, IDI_APPLICATION); ; ; ; //图标
; wc.hCursor := LoadCursor(0, IDC_ARROW); ; ; ; //鼠标样式
; wc.hbrBackground := (COLOR_BTNFACE+1); ; ; ; ; ; ; ; //背景刷子
; wc.lpszMenuName := nil; ; ; ; //主菜单,无
; wc.lpszClassName := 'My App'; ; ; ; //窗体类名
; if RegisterClass(wc)=0 then Exit; ; ; ; //注册不成功退出
; hWnd := CreateWindow( ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//创建窗体
; ; wc.lpszClassName, 'TEST', ; ; ; //窗体类名,标题
; ; WS_OVERLAPPEDWINDOW, ; ; ; ; ; //窗体样式
; ; CW_USEDEFAULT, CW_USEDEFAULT, ; ; ; ; ; ; ; ; ; ; ;//窗体的x,y位置和width,height,使用默认值
; ; CW_USEDEFAULT, CW_USEDEFAULT,
; ; 0, 0, HInstance, nil); ; ; ; ; ; ; ; ; ; ; ; ; ; ; //父窗体句柄,主菜单句柄,实例句柄,创建参数
; if hWnd=0 then Exit; ; ; ; //创建失败退出程序
; ShowWindow(hWnd, SW_SHOWNORMAL); ; ; ; //显示窗体
; while GetMessage(MSG, 0, 0, 0) do begin ; ; ; ; ; ; ;//消息循环

; ; TranslateMessage(MSG); ; ; ; //翻译键盘消息
; ; DispatchMessage(MSG); ; ; ; //发送消息
; end;
; Halt(MSG.wParam); ; ; ; //返回退出消息让windows处理
end.
 
; ;非常感谢YB_unique和不不能在深夜为我作出如此详细的解释,真的很感动啦,
这是我第一次发出自已的问题,得到这么多人的热心帮助,真令我。。。。
希望已后我也能为他们做点什么。
; ; 对于我提出的这个问题,我想通过别人解释一下例程是不可能彻底弄明白的,
但对我的确有帮助,我想最好的方法还是找一本相关的比较好的[red][/red]来看,
有人能为我提供这方面的信息吗。(也就是关于一个程序,WINDOWS内部到底都有做什么工作的书籍。)
; ; 我没有用过C 写WINDOWS程序,(本人是PASCAL 的忠实爱好者),
所以最好书上的描述语言最好是PASCAL,如果网上能下载,
并请提供相关网址,如果要到书店买,请提供书名,作者,出版社,价钱,谢谢了。
 
首推当然是《Windows核心编程》
该书相关源代码——http://www.5xsoft.com/data/200109/0513400501.htm
该电子书下载网址——http://ieq.533.net/book/win.htm
没事看看这里的也不错——http://ieq.533.net/book/delphi.htm
 
对于《Windows核心编程》这一书,书中是用PASCAL 为描述语言吗,从书名看可能是用C吧。
http://ieq.533.net/book/delphi.htm上,关于DELPHI的书太多了,
哪一本有这方面的详细解说呢?
 
走进Delphi,你可以很快学会编程,但你走出Delphi,进入C/C++的领域,你才会觉得
恍然大悟,以前Delphi中那么多的为什么就会豁然开朗。

线程安全、信号量、命名管道、远过程调用、钩子、守护进程...知识的海洋。
 
有道理,正拼命学VC
 
只要理解 Windows 编程时基于消息这一点,消化上面程序就容易多了。
程序的输入等都依靠消息。
//注册窗体,这样就把你定义的回调函数AppWindowProc加入Windows的消息处理中(wc.lpfnWndProc := @AppWindowProc)
if RegisterClass(wc)=0 then Exit;
//开始消息循环,不停的获取消息,这样你的回调函数获得消息
; while GetMessage(MSG, 0, 0, 0) do
; begin
; ; TranslateMessage(MSG);
; ; DispatchMessage(MSG);
; end;
//然后在回调函数中分检消息,进行处理。
 
Delphi真正强大就在于它的VCL,因此如果使用API来开发程序,就用VC.
 
顶部