📄 subject_49302.htm
字号:
<p>
序号:49302 发表者:鹏程 发表日期:2003-08-08 20:39:02
<br>主题:请教朋友几个问题,谢谢
<br>内容:在下述程序中,有几点不明白,请朋友们帮忙,谢谢了:<BR>(1)在语句LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM)中,对“CALLBACK”和“LRESULT”的具体含义不明白。<BR><BR>(2)函数int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)和函数LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)的参数是不是由系统自动传入的?<BR><BR>(3)书上讲窗口类“WNDCLASS”是一个结构,定义如下:<BR>typedef def tagWNDCLASSW //其中,“typedef”,“def”,“tag”不明白,这不象类定义的形式呀?类怎能和结构混为一谈呢?<BR>{<BR> UNIT style; //“UNIT”是不是印错了?是不是应该为“UINT”呀?<BR> WINPROC lpfnWndProc;<BR> ...<BR> ...<BR> LPCWSTR lpszClassName;<BR>}WNDCLASS;<BR><BR>(4)在 ShowWindow(hwnd,iCmdShow)语句中,当我把参数“iCmdShow”换成“SW_SHOWMAXIMIZE”后,程序并不能最大化显示窗口,反而出错了,不知为什么?<BR><BR><BR><BR><BR>源程序如下:<BR>#include <windows.h><BR>//窗口函数声明<BR>LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);<BR><BR>//以下代码初始化窗口类<BR>int WINAPI WinMain(HINSTANCE hInstance,<BR> HINSTANCE hPrevInstance,<BR> LPSTR szCmdLine,<BR> int iCmdShow)<BR>{<BR> //窗口类名<BR> static TCHAR szAppName[] = TEXT("HelloWorld");<BR> //窗口标题名<BR> static TCHAR lpszTitle[] = TEXT("MY First Windows Program");<BR> HWND hwnd;<BR> MSG msg;<BR> WNDCLASS wndclass;<BR> //窗口类风格<BR> wndclass.style = CS_HREDRAW|CS_VREDRAW;<BR> //窗口处理函数为WndProc<BR> wndclass.lpfnWndProc = WndProc;<BR> //窗口类没有扩展<BR> wndclass.cbClsExtra = 0;<BR> //窗口类实例没有扩展<BR> wndclass.cbWndExtra = 0;<BR> //当前实例句柄<BR> wndclass.hInstance = hInstance;<BR> //窗口的最小化图标为默认图标<BR> wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);<BR> //窗口采用箭头光标<BR> wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);<BR> //窗口背景为白色<BR> wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);<BR> //窗口没有菜单<BR> wndclass.lpszMenuName = NULL;<BR> //窗口类名<BR> wndclass.lpszClassName = szAppName;<BR> //如果注册失败则发出警告声<BR> if(!RegisterClass(&wndclass))<BR> {<BR> MessageBox(NULL,<BR> TEXT("This Program requires Windows NT!"),<BR> szAppName,<BR> MB_ICONERROR);<BR> return 0;<BR> }<BR> hwnd = CreateWindow(szAppName,<BR> TEXT("The Hello Program"),<BR> WS_OVERLAPPEDWINDOW,<BR> CW_USEDEFAULT,<BR> CW_USEDEFAULT,<BR> CW_USEDEFAULT,<BR> CW_USEDEFAULT,<BR> NULL,<BR> NULL,<BR> hInstance,<BR> NULL);<BR> //显示窗口<BR> ShowWindow(hwnd,iCmdShow);<BR> //绘制用户区<BR> UpdateWindow(hwnd);<BR> //消息循环<BR> while(GetMessage(&msg,NULL,0,0))<BR> {<BR> TranslateMessage(&msg);<BR> DispatchMessage(&msg);<BR> }<BR> //消息循环结束(即程序终止)时将信息返回系统<BR> return msg.wParam;<BR>}<BR><BR>//窗口函数定义<BR>LRESULT CALLBACK WndProc(HWND hwnd,<BR> UINT message,<BR> WPARAM wParam,<BR> LPARAM lParam)<BR>{<BR> HDC hdc;<BR> PAINTSTRUCT ps;<BR> RECT rect;<BR> //消息处理语句<BR> switch (message)<BR> {<BR> case WM_CREATE:<BR> <BR> PlaySound(TEXT("helloworld.wav"),<BR> NULL,<BR> SND_FILENAME|SND_ASYNC);<BR> return 0 ;<BR> //当客户区的一部分或全部变为无效以致必须刷新时,将由这个消息通知程序<BR> case WM_PAINT:<BR> hdc = BeginPaint(hwnd,&ps);<BR> GetClientRect(hwnd,&rect);<BR> DrawText(hdc,<BR> TEXT("Hello World!"),<BR> -1,<BR> &rect,<BR> DT_SINGLELINE|DT_CENTER|DT_VCENTER);<BR> EndPaint(hwnd,&ps);<BR> return 0;<BR> //退出窗口<BR> case WM_DESTROY:<BR> //调用PostQuitMessage函数发出WM_QUIT消息<BR> PostQuitMessage(0); <BR> return 0;<BR> }<BR> return DefWindowProc(hwnd,message,wParam,lParam);<BR>}<BR><BR><BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:佳明 回复日期:2003-08-09 10:53:12
<br>内容:(1) #define CALLBACK __stdcall<BR> LRESULT Signed result of message processing.(消息函数的返回值)<BR>(2) 那两个函数的参数是系统传给的<BR>(3) UINT style ,WNDCLASS是结构,不是类,它是向Windows注册窗口类用的<BR>(4) 不是SW_SHOWMAXIMIZE,是SW_SHOWMAXIMIZED,用SW_MAXIMIZE也行<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:鹏程 回复日期:2003-08-09 12:01:05
<br>内容:谢谢,您再通俗解释一下“(1) #define CALLBACK __stdcall<BR> LRESULT Signed result of message processing.(消息函数的返回值)”好吗?<BR><BR>既然“WNDCLASS是结构,不是类”,那为什么书上说“WNDCLASS wndclass”声明了一个“窗口类”呢?<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:佳明 回复日期:2003-08-09 17:13:20
<br>内容:The __stdcall calling convention is used to call Win32 API functions. The callee cleans the stack, so the compiler makes vararg functions __cdecl. Functions that use this calling convention require a function prototype.<BR><BR>return-type __stdcall function-name[(argument-list)]<BR>这段是MSDN上的解释,大概是说__stdcall这个调用约定是用来调用Win32 API函数的<BR>LRESULT 和BOOL,UINT等一样,是函数的返回值类型,它是消息处理函数的返回值<BR>类型。我觉得像 CALLBACK,LRESULT ,HANDLE这些东西,只要知道它们是用在什么<BR>地方的,怎么用就行了,不用管它们究竟是什么。比如HANDLE实际上是void*,<BR>HWND 是HWND__*,但我们用的时候不用管这些<BR><BR>RegisterClass用来注册一个窗口类,在屏幕上显示的窗口(包括普通窗口,各种控件)<BR>都有它们所属的窗口类,这个类的概念我觉得(我不知道对不对)和C++里的类不是<BR>一回事,只是同名,我觉得这个类就是“同类”的类
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:鹏程 回复日期:2003-08-09 18:43:36
<br>内容:朋友说的是。<BR>顺便问一下:在VC++6中,为什么输入代码时字符的大小写不能自动转换呀?很容易出错的。是不是我的编译器设置的有问题?并且代码的左边也设置不出来行号,要怎样设置才行呢?<BR><BR>如果在VB6中,输入代码时字符的大小写是能够自动转换的,非常方便的,而且也不容易出错,非常好的。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:佳明 回复日期:2003-08-09 18:56:37
<br>内容:因为Basic不区分大小写,C语言是区分大小写的,也就是说,在Basic语言里,<BR>大写和小写的意义是一样的,所以可以转换.C语言里不行<BR><BR>VC6里怎么显示行号我不知道,不过VC7里很容易。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:鹏程 回复日期:2003-08-09 19:14:01
<br>内容:哦,谢谢朋友的指导!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -