既然在WinMain的前面声明了Wndproc(而且在Winmain后面定义了),为什么在Winmain中用一个指向这个函数的指针?直接调用不就行了吗?既然WinMain的返回值是int型,为什么还要加上WINAPI修饰?就好像: int vector main一样荒唐!在C++中没有见过这种用法啊!为什么有两个修饰词?static TCHAR szAppName[] = TEXT ("HelloWin") 可不可以改成static CHAR szAppName[] ="HelloWin"? WinMain的最后返回一个msg.wParam,并不是一个int型啊!这里:GetClientRect (hwnd, &rect) ;
既然RECT结构型都用了引用&rect,为什么HWND不用引用&hwnd呢?“WNDPROC lpfnWndProc”既然“lpfnWndProc”是指向函数的指针,是不是就等于"WNDPROC (*lpfnWndProc)()"?这几个问题请高手指点!
既然RECT结构型都用了引用&rect,为什么HWND不用引用&hwnd呢?“WNDPROC lpfnWndProc”既然“lpfnWndProc”是指向函数的指针,是不是就等于"WNDPROC (*lpfnWndProc)()"?这几个问题请高手指点!
wndproc是给WINDOWS系统调用的,这样设计是有他的理由的,每个程序只能有一个WINPROC函数处理消息,消息机制是多进程的基础。
不明白自己看Programming Windows.
不要小瞧了微软的设计师们,他们大多是天才。
-------------------------------------------------------------------------
PASCAL约定和C约定正好相反,它规定参数是从左向右传递,由被调用者恢复堆栈。Win16采用了PASCAL约定, 因为PASCAL约定产生的代码量要小。当不知道参数的个数时,C约定特别有用。如在函数wsprintf () 中, wsprintf预先并不知道要传递几个参数,所以它不知道如何恢复堆栈。STDCALL是C约定和PASCAL约定的混合体,它规定参数的传递是从右到左,恢复堆栈的工作交由被调用者。Win32只用STDCALL约定,但除了一个特例,即:wsprintf。C 编译器要求您的源代码有必须有一个函数叫 WinMain。否则 C 无法知道将哪个函数和有关的前后代码链接。相对C,汇编语言提供了较大的灵活性,它不强行要求一个叫 WinMain 的函数。
-----------------------------------------------------------------------
在连接阶段,链接器需要把启动代码和用户的代码组合成可执行文件,而启动代码里面就有call main
等等
这是main/winmain为什么必须存在的原因呵呵
; tcstart.asm
; for d000 code only, external eprom on memory card
; FOR PC ROM
extrn _main:far; /* 说明外部的C语言的MAIN() 函数,这也是 C 语言为什么非要从MAIN()开始的原因 */
_text segment byte public "CODE" ; /* C语言生成的代码段 */
_text ends
_textend segment para public "CODEEND"; /* 代码段的结束段 */
_textend ends
_data segment para public "DATA"; /* C语言生成的初始化数据段 */
_data ends
_dataend segment para public "DATAEND"; /* 初始化数据段的结束段 */
_dataend ends
_bss segment para public "BSS" ;/* C语言生成的非初始化数据段 */
_bss ends
_bssend segment byte public "BSSEND";/* C语言生成的非初始化数据结束段 */
_bssend ends
_stack segment para stack "STACK" ; /* 堆栈段 */
_stack ends
DGROUP group _DATA, _DATAEND, _BSS, _BSSEND /* 把数据的段构成一个组,代码连在一起 */
CGROUP group _TEXT, _TEXTEND /* 把代码的段构成一个组,代码连在一起 */
_TEXT segment ; /* 代码段 */
assume CS:CGROUP, DS:DGROUP, ES:DGROUP, SS:_STACK start: cli ; disable interrupts
mov ax, _STACK ; initialise stack
mov ss, ax
mov ax, offset stackend
mov sp, ax
mov ax, seg _BSS ; /* BSS SEG CLEAR */
mov es, ax
mov cx, offset DGROUP:endbss
mov di, 0
mov ax, 0
rep stosb ; write to ES:DI
mov ax, seg DGROUP ;初始化数据段
mov es, ax ; point ES to _DATA
mov cx, offset DGROUP:enddata
mov si, 0
mov di, 0
assume ds:CGROUP
mov ax, seg _TEXTEND:codeend
inc ax
mov ds, ax ; point DS to _CONST
rep movsb ; copy _CONST to _DATA
push es ; point DS to _DATA
pop ds
;下面内容非PC 机可以不要
mov al, 80h ; enable NMI
out 0a0h, al
mov al, 0bch ; enable 8259 PIC 1011-1100 (irq0,1,6 enabled)
out 21h, al
;上面内容非PC 机可以不要
sti ; enable interrupts
call _main ; CALL C MAIN()
jmp start ;
_TEXT ends
_TEXTEND segment
public codeend
db 16 dup(?) ; a paragraph, thus _CONST is one byte more
codeend label byte
_TEXTEND ends
_STACK segment
db 1024 dup ("STACK");/* 预留的堆栈空间 */
stackend label word
_STACK ends
_BSSEND segment
public endbss
endbss label byte
_BSSEND ends
_DATAEND segment
public enddata
enddata label byte
_DATAEND ends
end
编译连接:
tasm /mx tcstart
bcc -a- -c -f- -G- -K -B -ml -M -N- -O- -r- -v- -y- -Z- -S -O- 1.c
tlink /m tcstart 1 tclib, 1, 1 呵呵
既然RECT结构型都用了引用&rect,为什么HWND不用引用&hwnd呢?“WNDPROC lpfnWndProc”既然“lpfnWndProc”是指向函数的指针,是不是就等于"WNDPROC (*lpfnWndProc)()"?”
哪朋友能指点一下?
typedef UINT WPARAM;TCHAR 不能换成char ,是为了使用unicode
GetClientRect(HWND hWnd,LPRECT rc);
所以在使用中必须用
RECT rc;
GetClientRect(hWnd,&rc);
int i=rc.right;这个和hWnd要不要用call-by-reference一点儿关系都没有.早就看到了这个帖,总觉得楼主问问题时一副"他妈的,这是怎回事?"的口气,所以就放下了.后来看到有人up,想想可能对其他人或许有些参考作用,才写了这几句.敬请楼主"视而不见".
如果,对指针在使用&hWnd话,那传递给GetClientRect()函数的就是hWnd 这个指针变量的地址了,而不是这个指针变量所指向的内容了。以上是俺的一点浅显认识,还望各位前辈指教。。
C++板块是有不少骂人的!但和我无关,“总觉得楼主问问题时一副"他妈的,这是怎回事?"的口气,”这句话毫无根据!
1. 为什么在Winmain中用一个指向这个函数的指针?直接调用不就行了吗?(如果直接调用就是不WINDOW 编程了,引自"rivershan(笨猫)",从此看来你的WINDOW编程的初学者).
2. 为什么还要加上WINAPI修饰?就好像: int vector main一样荒唐!(如果你是初学者,就不要指责一个已经几十年的函数是荒唐的,说句实话,第一次读你帖子到这儿时,我首先感到就是,鲁班门前又来了一个).
3. 在C++中没有见过这种用法啊!为什么有两个修饰词?(读到这里,更有一种感觉,楼主仿佛已经通晓C++,现在看到了一个C++没有的东东,于是唐吉诃德挺起了长矛,向...冲去).
4. WinMain的最后返回一个msg.wParam,并不是一个int型啊!(再次被楼主深深地感动,我已经看到多少个感叹号,多少个反问号?天啊,莫不是屈夫子又回来了)再次声明,我指责的是你的"口气"或者是说"态度",我并没有在诬蔑你骂人.我认为一个初学者在发现问题后经过思考,再到这里提问,应该本着一种请教的态度.最后声明,楼主是请高手指教的.我不是高手,我不是指教,我只是"唠叨两句".
最后说一句,CSDN是大家讨论知识学习的地方,不是辩论的战场,希望大家能共同珍惜维护这样一个好的学习环境,呵呵...多说了几句,不会介意吧 :)