MFC windows程序设计(第三版)课后习题第一章

1-1什么是Windows API函数?

Windows API是Windows 系统和应用程序间的标准接口,为应用程序提供Windows支持的 函数定义参数定义消息格式等。
Visual C++提供两套完整的Windows程序开发系统:
直接使用Windows提供的API 函数;
Application Programming Interface
采用面向对象的方式,使用微软基础类库MFC 。
Microsoft Foundation Classes
为了设计Windows应用程序,Windows提供了大量预定义的用C语言编写的函数,这些函数叫做API(Application Programming Interface)函数。API函数几乎包含了Windows程序中所有操作功能。
标准Win32 API 函数可以分为以下几类:
窗口管理函数—窗口的创建、移动及修改;
图形设备函数—实现图形的绘制及操作;
系统服务函数—实现操作系统有关一些功能。

1-2. 查看windows.h文件,看一下Windows系统的句柄是什么数据类型的?

整型。
句柄—系统用来唯一标识某个Windows对象的一个无符号整数,相当于Windows对象的名字,应用程序只有通过句柄才能使用Windows对象。

1-3. 试说明以下是什么句柄。

(1)HWND
(2)HINSTANCE
(3)HDC
Windows常用句柄类型如下所示:
MFC windows程序设计(第三版)课后习题第一章_第1张图片

1-4. 什么是事件?试举例说明。

能触发程序作出相应反映的刺激叫做事件。例如键盘的输入,鼠标的单击或双击。

1-5. 如何显示和更新窗口?

调用 ShowWindows 函数显示窗口,调用UpdateWindows函数更新窗口。

1-6. 什么是消息循环?

在创建了窗口的应用程序中,应用程序将要不断地从消息队列中获取消息,并将消息指派给指定的窗口处理函数来处理,然后再回来从消息队列中获取消息,这个不断重复的过程叫做消息循环。

1-7.Windows应用程序的主函数有哪3个主要任务?

注册窗口类,创建应用程序的窗口和建立消息循环

1-8. 说明Windows应用程序的主函数,窗口函数与Windows系统之间的关系。

主函数和窗口函数都是Windows系统调用的函数;
主函数是应用程序启动后,系统首先调用的函数;
窗口函数是主函数在消息循环中获得消息并把消息发送给系统之后,有系统调用函数。

1-9.在创建Win32 Application工程时,在Win32 Application Step-1 of 1 对话框中选中 A typical “ hello world! ” Application 选项后并按下Finish按钮后,系统可以自动创建一个Windows SDK 的示例程序,请运行该程序并分析这个应用程序的代码。(附带详细注释,可能不完善)

// he.cpp : Defines the entry point for the application.定义应用程序的入口点
//

#include "stdafx.h" //是预编译处理器把stdafx.h文件中的内容加载到程序中来。
#include "resource.h"// 定义应用程序的入口点
//

#define MAX_LOADSTRING 100 	//定义最大加载字符串100

// Global Variables:全局变量
HINSTANCE hInst;								// 当前实例
TCHAR szTitle[MAX_LOADSTRING];								// 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING];								// 主窗口类名

// Foward declarations of functions included in this code module:此代码模块中包含的函数的前向声明:
ATOM				MyRegisterClass(HINSTANCE hInstance); 	// 注册窗口函数的声明
BOOL				InitInstance(HINSTANCE, int);		 // 初始化实例的函数声明
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);	 // 主窗口的回调函数
LRESULT CALLBACK	About(HWND, UINT, WPARAM, LPARAM);	 // "关于"对话框的回调函数
 // win32程序入口函数
int APIENTRY WinMain(HINSTANCE hInstance,		//当前应用程序的实例句柄。
                     HINSTANCE hPrevInstance,				//	应用程序的先前实例的句柄。
                     LPSTR     lpCmdLine,						//指向本程序命令行的指针
                     int       nCmdShow)							//应用程序窗口显示方式的标志
{
 	// TODO: Place code here.	在此放置代码。
	MSG msg;		// 定义消息结构体对象
	HACCEL hAccelTable;		// 定义加速键句柄变量

	// Initialize global strings	初始化全局字符串
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);	 // 导入字符串资源
	LoadString(hInstance, IDC_HE, szWindowClass, MAX_LOADSTRING);	 // 同上一句
	MyRegisterClass(hInstance);		// 调用注册窗口函数

	// Perform application initialization:	执行应用程序初始化:
	if (!InitInstance (hInstance, nCmdShow)) 	//调用初始化实例函数
	{
		return FALSE;			//返回false
	}

	hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_HE);	// 导入

	// Main message loop:	 主消息循环:
	while (GetMessage(&msg, NULL, 0, 0)) 	 // API函数(GetMessage),消息循环
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))	//判断函数TranslateAccelerator 是否成功调用
		{
			TranslateMessage(&msg);	// 转换为字符消息。再被寄送到调用线程的消息队列利
			DispatchMessage(&msg);	//调用消息发送API函数将消息发送给系统
		}
	}

	return msg.wParam;	//返回一条退出的消息
}



//
//  FUNCTION: MyRegisterClass()
//
//  PURPOSE: Registers the window class.
//
//  COMMENTS:
//
//    This function and its usage is only necessary if you want this code
//    to be compatible with Win32 systems prior to the 'RegisterClassEx'
//    function that was added to Windows 95. It is important to call this function
//    so that the application will get 'well formed' small icons associated
//    with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance) 	// 注册窗口函数,实际调用的api 是 RegisterClassEx
{
	WNDCLASSEX wcex;		// 声明变量

	wcex.cbSize = sizeof(WNDCLASSEX); //WNDCLASSEX 的大小

	wcex.style			= CS_HREDRAW | CS_VREDRAW;	// 从这个窗口类派生的窗口具有的风格
	wcex.lpfnWndProc	= (WNDPROC)WndProc;				//窗口处理函数为指针
	wcex.cbClsExtra		= 0;													//窗口类无扩展
	wcex.cbWndExtra		= 0;												//窗口实例无扩展
	wcex.hInstance		= hInstance;									//当前实例句柄
	wcex.hIcon			= LoadIcon(hInstance, (LPCTSTR)IDI_HE);	///图标的句柄
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);				//窗口采用箭头光标
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);		//背景画刷的句柄
	wcex.lpszMenuName	= (LPCSTR)IDC_HE;								//指向菜单的指针
	wcex.lpszClassName	= szWindowClass;									//指向类名称的指针
	wcex.hIconSm		= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);	//和窗口类关联的小图标

	return RegisterClassEx(&wcex);		//注册窗口类
}

//
//   FUNCTION: InitInstance(HANDLE, int)  函数: InitInstance(HINSTANCE, int)
//
//   PURPOSE: Saves instance handle and creates main window	目的: 保存实例句柄并创建主窗口
//
//   COMMENTS:
//
//        In this function, we save the instance handle in a global variable and
//        create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)	// 初始化实例函数,此函数功能是创建并显示窗口,
实际使用的api 是CreateWindow,,ShowWindow
{
   HWND hWnd;		//窗口句柄

   hInst = hInstance; // Store instance handle in our global variable	将实例句柄存储在全局变量中

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,	
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);	//创建

   if (!hWnd)		//判断窗口是否创建成功
   {
      return FALSE;	//创建失败返回false
   }

   ShowWindow(hWnd, nCmdShow);		//显示窗口
   UpdateWindow(hWnd);		//刷新窗口

   return TRUE;		
}

//
//  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND	- process the application menu
//  WM_PAINT	- Paint the main window
//  WM_DESTROY	- post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)		//处理消息的窗口函数
{
	int wmId, wmEvent;		//循环变量
	PAINTSTRUCT ps;		//	定义绘图信息结构变量
	HDC hdc;					//定设备环境句柄
	TCHAR szHello[MAX_LOADSTRING];		//
	LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);		//

	switch (message) 	
	{
		case WM_COMMAND:		//响应两个按钮的按下消息。是从菜单选择一个索引、控件发送消息到父窗口、加速键被翻译时的消息,
			wmId    = LOWORD(wParam);	// 取低字节,菜单,控件,加速键的ID
			wmEvent = HIWORD(wParam); 	//;如果该消息是来自控件的,则处理和控制发出信息。否则,这个参数是无效的
			// Parse the menu selections:	分析菜单选项
			switch (wmId)				
			{
				case IDM_ABOUT:		//这个是响应ID为IDM_ABOUT的菜单,控件,或加速键消息
				   DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);	//对话框函数
				   break;			
				case IDM_EXIT:		//控件退出消息
				   DestroyWindow(hWnd);		//关闭窗口
				   break;		
				default:		
				   return DefWindowProc(hWnd, message, wParam, lParam);	//这个函数是系统提供的一个窗口消息处理函数,
				   //使系统对用户的每个没有处理的消息进行默认处理,是任何发送到该窗口的消息均能得到合适的处理
			}
			break;		
		case WM_PAINT:		//重画客户区消息
			hdc = BeginPaint(hWnd, &ps);		//获取重画的窗口的设备描述表句柄
			// TODO: Add any drawing code here...在此处添加绘图码
			RECT rt;			//定义一个矩形类变量
			GetClientRect(hWnd, &rt);	// 该函数获取窗口客户区的大小
			DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);	//在客户区中央输出
			EndPaint(hWnd, &ps);	//结束绘画
			break;	
		case WM_DESTROY:		//撤销窗口消息处理
			PostQuitMessage(0);		//产生退出消息WM_QUIT
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);	//其他转缺省窗口函数
   }
   return 0;
}

// Mesage handler for about box.   About Box的消息回调函数
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
		case WM_INITDIALOG:	//该状态下及以后对话框才能收到的消息,
		//该状态表明对话框及其所有子控件都创建完毕了。这个状态在调用显示对话框的函数之前。
				return TRUE;

		case WM_COMMAND:	//相应按钮的消息
			if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
			{
				EndDialog(hDlg, LOWORD(wParam));	//关闭对话框
				return TRUE;
			}
			break;
	}
    return FALSE;
}




可能出现的问题:
运行VC时总出现
Linking…
LINK : fatal error LNK1104: cannot open file “Debug/xx.exe”
Error executing link.exe.
xx.exe - 1 error(s), 0 warning(s)

在C:/Program Files/Microsoft Visual Studio/projiects下是找不到你写的工程文件的,因为在这个目录下写东西是需要管理员权限的,所以系统才会报“cannot open file”的错误,解决的办法是关闭软件,然后以管理员权限运行该软件,这样就可以完美运行调试程序了。
补充:还有碰到工程所在的文件夹如果是只读属性,也会有同样的错误,需要去掉只读属性。

2-1 在窗口类CFrameWnd 中需要封装那些成员?

窗口句柄、窗口类的定义、注册窗口类、创建窗口、显示更新窗口。

数据成员有:
m_bAutoMenuEnable,rectDefault。
Construction成员函数:CFrameWnd
Initialization成员函数:Create,LoadFrame,LoadAccelTable,LoadBarState,
SaveBarState,ShowControlBar,SetDockState,GetDockState
Overridables成员函数:OnCreateClient,OnSetPreviewMode,GetMessageBar,NegotiateBorderSpace
操作成员函数:
ActivateFrame,InitialUpdateFrame,GetActiveFrame,:SetActiveView,
GetActiveView,CreateView,GetActiveDocument,GetControlBar,GetMessageString,
IsTracking,SetMessageText,EnableDocking,DockControlBar,
FloatControlBar,BeginModalState,EndModalState,InModalState,
ShowOwnedWindows,RecalcLayout,
Command Handlers函数:OnContextHelp

2-2 应用程序类CWinApp应该具备哪些主要的功能?

创建、显示应用程序的窗口和建立消息循环。

2-3 在MFC程序设计中,如果要建立拥有自己风格的主窗口,应该重写什么函数?

继承CWinAPP类并需要重写该类的成员函数InitInstance。

你可能感兴趣的:(windows)