📄 chapter2.txt
字号:
if(!hpreInst)
.
.
.
if(! RegisterClass(&wcApp))
return FALSE;
Windows 95和Windows NT通过检查hPreInst的值来确定多少个实例,而hPreInst总是NULL,所以就注册窗口类.
5.创建窗口
窗口通过调用CreateWindow()函数来创建。这个过程对所有版本的Windows都是一样的。窗口类定义了窗口的一般特征,允许同一个窗口类被用于多个不同的窗口,CreateWin-dow()函数的参数指明了关于窗口的更详细的信息。
CreateWindow()函数的参数信息包括以下内容:窗口类、窗口标题、窗口风格、幕位置、窗口的父句柄、菜单句柄、实例句柄以及32位的附加信息。在大部分应用程序中 ,这个函数会是下面这个样子:
hWnd=CreateWindow(szProgName,"Simple Windows Program",
WS-OVERLAPPEDWINDOW,CW-USEDEFAULT,
CW-USEDEFAULT,CW-USEDEFAULT,
CW-USEDEFAULT,(HWND)NULL,(HMENU)NULL,
(HANDLE)hInst,(LPSTR)NULL);
第一个域szProgName(已赋过值)定义了窗口的类,后面是窗口标题条上使用的标题。窗口的风格是第三个参数
下面的六个参数代表了窗口的x、y坐标和x、y方向的大小,然后是父窗口句柄和窗口菜单句柄。每个域都被赋予一个缺省值。hInst域包含了程序的实例句柄,后面是一个附加参数(NULL)。
显示和更新窗口
在Windows下,ShowWindow()函数被用来实际显示一个窗口。下面的代码示范了这个函数:
Show Window(hWnd,nCmdShow);
在调用CreateWindow()时生成的窗口句柄被用作hWnd参数。ShowWindow()的第二个参数是nCmdShow,决定了窗口被如何显示。这个显示状态也被称为窗口的可视状态。
显示窗口的最后一步是调用Windows的Update Window()函数。
UpdateWindow(hWnd);
6.消息循环
一旦调用Win-Main()函数并显示了窗口,应用程序就需要一个消息处理循环。最常用的实现方法是使用一个标准的while循环:
while (GetMessage (&lpMsg,NULL,0,0))
{
TranslateMessage(&lpMsg);
DispatchMessage(&lpMsg);
}
GETMESSAGE()函数:应用程序要处理的下一个消息可以通过调用Windows的GetMessage()函数来取得。
NULL参数指示函数取回这个应用程序的任何窗口的任何消息。最后两个参数0和0告诉GetMessage()不要使用任何消息过滤器。消息过滤器能够将接收到的消息限制在一个明确的范围之内,如键盘消息或鼠标消息等。
一般应用程序应该确认通向消息循环的所有步骤都已经正确地执行过了。这包括确认每个窗口类都已经注册过,都已经被创建。否则,一旦进入了消息循环,只有一个消息能够结束这个循环。无论何时处理了WM-QUIT消息,返回值是FALSE。这会引发主循环关闭例程。WM-QUIT消息是应用程序退出消息循环的唯一途径。
TRANSLATEMESSAGE()函数:通过TranslateMessage()函数,虚拟消息可以被转换为字符消息。
DISPATCHMESSAGE()函数:Windows通过DispatchMessage()函数将当前的消息发送到正确的窗口过程。
******* 窗口函数
所有的应用程序都必须包括一个WinMain()函数和一个回调窗口函数。因为一Win-dows应用程序从不直接访问任何窗口函数,每个应用程序都必须向Windows提出请求以执行规定的操作。
一个回调函数在Windows中注册,当Windows要对一个窗口进行操作时,它就被调用。各个应用程序的回调函数的实际代码长度会大不相同。窗口函数本身可以非常小,只处理一个或两个消息,也可以非常大而且复杂。
下面的代码段(不完整的应用程序说明语句)显示了在应用程序中的回调窗口函数WndProc()的一个范例:
LRESULT CALLBACK WndProc(HWND hWnd,UNIT messg,
WPARAM wParam,LPARAM 1Param)
HDC hdc;
PAINTSTRUCT ps;
switch(messg)
case WM-PAINT:
hdc=BeginPaint(hWnd,&ps);
.
.
.
ValidateRect(hWnd,NULL);
EndPaint(hWnd,&ps);
break;
case WM-DESTROY:
postQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd,messg,wParam,1param));
return(0);
Windows希望窗口类结构定义中wcApp,1pfnWndProc域的名字能够与回调函数的名
字匹配。后面用这个窗口类创建的所有窗口的回调函数都应该用WndProc()的名字。
下面的代码段讨论一个窗口类结构中回调函数名的位置和赋值:
.
.
.
wcApp.1pszClassName=szProgName;
wcApp.hInstance=hInst;
wcApp.1pfnWndProc=WndProc;
.
.
.
Windows有向百个消息可以发送给窗口函数。这些消息用“WM-”打头的标识符来
标识。
WndProc()的第一个参数是hWnd。hWnd包含了Windows发送消息的窗口句柄。
函数的第二个参数messg按WINUSER.H中的定义指明了即将被处理的实际消息。最后的两个参数wParam以及1Param,指明了处理每个消息所需的附加信息。
WndProc()函数继续定义了两个变量:hdc指明了显示设备句柄,ps指明了存储用户区
信息所需的一个PAINTSTRUCT结构。
回调函数被用于检查将被处理的消息并选择执行适当的动作。这个选择过程通常在一个标准的C语言的switch语句中完成。
模块定义文件
正如你在前面学到的,LINK提供了所有Windows应用程序需要的模块定义文件在命令行方式下的替代品。模块定义文件向链接器提供有关的定义和描述信息,这样链接器就可以知道如何来组织Windows应用程序的可执行文件。这些信息已经成为新执行文件格式的文件头的一部分。
注意:在Windows 95和Windows NT下面,你不太可能需要创建一个模块定义文件。这些信息是为了完整性和向后兼容。
第十节 VC++提供的windows编程工具
Visual C++编译器包含几个资源编辑器。单独的编辑器可以通过编译器主菜单中的Insert Resource菜单来运行。图形对象都是资源,象图标、光标、消息框、对话框、字体、位图、画笔、刷子等。资源代表应用程序的可执行文件中包含的数据。
资源编译器RC.EXE是一个Windows资源的编译器。。
资源以及附加的编译器的使用增加了应用程序开发的复杂性。但是它容易在项目工具中使用。
项目文件
项目文件提供了概览资源和程序代码编译过程的手段,同时也可以使应用程序的可执行版本保持最新。它们跟踪源文件的日期和时间以实现这些增强的功能。项目文件包含了有关特定程序的编译链过程的信息。项目文件是在集成的C或C++编辑环境中创建的。项目文件还支持增强的编译和链接。
资源
当你使用VisualC++编译器提供的资源编辑器时,用自己的图标、指针和位图来定制Windows应用程序非常容易。这些编辑器给你提供了一个开发图形资源的完整环境。这些编辑器同时也能帮助你开发菜单和对话框-Windows下数据输入的基本手段。这些编辑器还能帮你操纵单独的位图、加速键和字符串。。
资源编辑器
每一种编辑器都在VisualC++环境中提供,都是编译器的一个集成的部分。这样,每种编辑器都是在Windows下运行的完全集成的资源开发工具。你可以通过选择Insert Resource来启动每一种编辑器。
下面我们将通过教程演示资源编辑器的使用。请单击返回,然后运行教程。
? 第十一节 MFC的基本概念
基础类库为你提供了易于使用的对象。将Windows与C++联系起来是很自然的,这样就可以充分利用面向对象技术的优点。MFC开发组实现了大量的Windows应用程序编程接口(API)。这个C++库在一些可重用的类中封装了最重要的数据结构和API函数调用。
类似MFC这样的类库比起前面两章讨论的C程序员使用的函数库有很多优点。
下面列出了C++类的一些优点,比如:
*用类对数据和代码进行封装
*继承性
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -