《Windows程序设计》之多文档

#include <Windows.h>
#include "RESOURCE.H"

#define INIT_MENU_POS 0
#define HELLO_MENU_POS 2
#define RECT_MENU_POS 1

#define IDM_FIRSTCHILD 50000

//多个回调函数
LRESULT CALLBACK FrameWndProc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK CloseEnumProc(HWND,LPARAM);
LRESULT CALLBACK HelloWndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK RectWndProc(HWND,UINT,WPARAM,LPARAM);

//两个结构体
typedef struct tagHELLODATA
{
	UINT iColor;
	COLORREF clrText;
}
HELLODATA,*PHELLODATA;

typedef struct tagRECTDATA
{
	short cxClient;
	short cyClient;
}
RECTDATA,*PRECTDATA;

//四个标题
TCHAR szAppName[]=TEXT("MDIDemo");
TCHAR szFrameClass[]=TEXT("MdiFrame");
TCHAR szHelloClass[]=TEXT("MdiHelloChild");
TCHAR szRectClass[]=TEXT("MdiRectChild");
//全局句柄
HINSTANCE hInst;
//全局变量
HMENU hMenuInit,hMenuHello,hMenuRect;
HMENU hMenuInitWindow,hMenuHelloWindow,hMenuRectWindow;

//入口函数
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
	HACCEL hAccel;
	HWND hwndFrame,hwndClient;
	MSG msg;
	WNDCLASS wndclass;

	hInst=hInstance;
	//主窗口注册
	wndclass.style=CS_VREDRAW|CS_HREDRAW;
	wndclass.lpfnWndProc=FrameWndProc;
	wndclass.cbClsExtra=0;
	wndclass.cbWndExtra=0;
	wndclass.hInstance=hInstance;
	wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
	wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
	wndclass.hbrBackground=(HBRUSH)(COLOR_APPWORKSPACE+1);
	wndclass.lpszMenuName=NULL;
	wndclass.lpszClassName=szFrameClass;

	if(!RegisterClass(&wndclass))
	{
		MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);
		return 0;
	}
	//Hello窗口注册
	wndclass.style=CS_HREDRAW|CS_VREDRAW;
	wndclass.lpfnWndProc=HelloWndProc;
	wndclass.cbClsExtra=0;
	wndclass.cbWndExtra=sizeof(HANDLE);
	wndclass.hInstance=hInstance;
	wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
	wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
	wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.lpszMenuName=NULL;
	wndclass.lpszClassName=szHelloClass;

	RegisterClass(&wndclass);
	//矩形窗口注册
	wndclass.style=CS_VREDRAW|CS_HREDRAW;
	wndclass.lpfnWndProc=RectWndProc;
	wndclass.cbClsExtra=0;
	wndclass.cbWndExtra=sizeof(HANDLE);
	wndclass.hInstance=hInstance;
	wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
	wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
	wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.lpszMenuName=NULL;
	wndclass.lpszClassName=szRectClass;

	RegisterClass(&wndclass);
	//载入三个菜单资源(这个是横向的,就是客户区上方那一行),获取句柄
	hMenuInit=LoadMenu(hInstance,TEXT("MdiMenuInit"));
	hMenuHello=LoadMenu(hInstance,TEXT("MdiMenuHello"));
	hMenuRect=LoadMenu(hInstance,TEXT("MdiMenuRect"));
	//返回下拉菜单句柄
	hMenuInitWindow=GetSubMenu(hMenuInit,INIT_MENU_POS);
	hMenuHelloWindow=GetSubMenu(hMenuHello,HELLO_MENU_POS);
	hMenuRectWindow=GetSubMenu(hMenuRect,RECT_MENU_POS);
	//调用指定的加速键表,可打开资源文件查看键表
	hAccel=LoadAccelerators(hInstance,szAppName);
	//创建主窗口
	hwndFrame=CreateWindow(szFrameClass,TEXT("MDI Demonstration"),WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN,
		CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,hMenuInit,hInstance,NULL);
	//检查指定窗口的子窗口
	hwndClient=GetWindow(hwndFrame,GW_CHILD);
	ShowWindow(hwndFrame,iCmdShow);
	UpdateWindow(hwndFrame);

	
	//TranslateMDISysAccel该函数处理与指定MDI客户窗口相联系的多文档接口(MDI)子窗口的菜单命令的加速键响应
	//返回值:如果消息被转换为系统命令,则返回值为非零值。如果消息未转换为系统命令,则返回值为0。
	//TranslateAccelerator翻译加速键表
	
	while(GetMessage(&msg,NULL,0,0))
	{
		if(!TranslateMDISysAccel(hwndClient,&msg)&&!TranslateAccelerator(hwndFrame,hAccel,&msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
	//清理工作
	DestroyMenu(hMenuHello);
	DestroyMenu(hMenuRect);
	return msg.wParam;
}
//窗口的回调函数
LRESULT CALLBACK FrameWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	static HWND hwndClient;
	//客户区创建结构体
	CLIENTCREATESTRUCT clientcreate;
	HWND hwndChild;
	//子窗口创建结构体
	MDICREATESTRUCT mdicreate;

	switch(message)
	{
	case WM_CREATE:
		//创建时,设置资源菜单为hMenuInitWindow
		clientcreate.hWindowMenu=hMenuInitWindow;
		//设置主窗口客户区的ID
		clientcreate.idFirstChild=IDM_FIRSTCHILD;
		//创建
		hwndClient=CreateWindow(TEXT("MDICLIENT"),NULL,WS_CHILD|WS_CLIPCHILDREN|WS_VISIBLE,0,0,
							0,0,hwnd,(HMENU)1,hInst,(PSTR)&clientcreate);
		return 0;
		//点击菜单栏相应操作
	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		//点击NewHello后,填充结构体MDICREATESTRUCT
		case IDM_FILE_NEWHELLO:
			mdicreate.szClass=szHelloClass;
			mdicreate.szTitle=TEXT("Hello");
			mdicreate.hOwner=hInst;
			mdicreate.x=CW_USEDEFAULT;
			mdicreate.y=CW_USEDEFAULT;
			mdicreate.cx=CW_USEDEFAULT;
			mdicreate.cy=CW_USEDEFAULT;
			mdicreate.style=0;
			mdicreate.lParam=0;
			//发送消息给hwndClient(hwndClient是客户区句柄,也可以说是一个子窗口句柄)
			hwndChild=(HWND)SendMessage(hwndClient,WM_MDICREATE,0,(LPARAM)(LPMDICREATESTRUCT)&mdicreate);
			return 0;
		//点击NewRect后,填充结构体MDICREATESTRUCT
		case IDM_FILE_NEWRECT:
			mdicreate.szClass=szRectClass;
			mdicreate.szTitle=TEXT("Rectangles");
			mdicreate.hOwner=hInst;
			mdicreate.x=CW_USEDEFAULT;
			mdicreate.y=CW_USEDEFAULT;
			mdicreate.cx=CW_USEDEFAULT;
			mdicreate.cy=CW_USEDEFAULT;
			mdicreate.style=0;
			mdicreate.lParam=0;
			//发送消息给hwndClient(hwndClient是客户区句柄,也可以说是一个子窗口句柄)发送的消息为WM_MDICREATE
			hwndChild=(HWND)SendMessage(hwndClient,WM_MDICREATE,0,(LPARAM)(LPMDICREATESTRUCT)&mdicreate);
			return 0;
		case IDM_FILE_CLOSE:
			//发送消息给hwndClient,发送的消息为WM_MDIGETACTIVE
			hwndChild=(HWND)SendMessage(hwndClient,WM_MDIGETACTIVE,0,0);
			//当结束或者一个程序调用系统关闭功能的时候,WM_QUERYENDSESSION消息会被发送给尚未终止的所有窗口。
			//当程序在处理这个消息的时候,如果返回了false(0),那么系统将不结束对话或者关机(注销)。
			//这个地方就是发送一个WM_QUERYENDSESSION,返回非0的话,就发送一个WM_MDIDESTROY消息
			if(SendMessage(hwndChild,WM_QUERYENDSESSION,0,0))
				SendMessage(hwndClient,WM_MDIDESTROY,(WPARAM)hwndChild,0);
			return 0;
		//下面这些是点击一些菜单时,所进行的操作
		case IDM_APP_EXIT:
			SendMessage(hwnd,WM_CLOSE,0,0);
			return 0;
		case IDM_WINDOW_TILE:
			SendMessage(hwndClient,WM_MDITILE,0,0);
			return 0;
		case IDM_WINDOW_CASCADE:
			SendMessage(hwndClient,WM_MDICASCADE,0,0);
			return 0;
		case IDM_WINDOW_ARRANGE:
			SendMessage(hwndClient,WM_MDIICONARRANGE,0,0);
			return 0;
		case IDM_WINDOW_CLOSEALL:
			//枚举一个父窗口的所有子窗口,CloseEnumProc回调函数地址
			EnumChildWindows(hwndClient,CloseEnumProc,0);
			return 0;
			//如果点击其它地方,就是设为活动的
		default:
			hwndChild=(HWND)SendMessage(hwndClient,WM_MDIGETACTIVE,0,0);
			//如果是子窗口,就向子窗口发送一个WM_COMMAND的消息
			if(IsWindow(hwndChild))
				SendMessage(hwndChild,WM_COMMAND,wParam,lParam);
			break;
		}
		break;
	case WM_QUERYENDSESSION:
	case WM_CLOSE:
		SendMessage(hwnd,WM_COMMAND,IDM_WINDOW_CLOSEALL,0);
		if(NULL!=GetWindow(hwndClient,GW_CHILD))
			return 0;
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefFrameProc(hwnd,hwndClient,message,wParam,lParam);
}

BOOL CALLBACK CloseEnumProc(HWND hwnd,LPARAM lParam)
{
	//获取指定窗口的所有者窗口
	//这一块不明白什么意思,以后再想
	if(GetWindow(hwnd,GW_OWNER))
		return TRUE;
	SendMessage(GetParent(hwnd),WM_MDIRESTORE,(WPARAM)hwnd,0);
	if(!SendMessage(hwnd,WM_QUERYENDSESSION,(WPARAM)hwnd,0))
		return TRUE;
	SendMessage(GetParent(hwnd),WM_MDIDESTROY,(WPARAM)hwnd,0);
	return TRUE;
}
//下面的注释加不加去了,不理解,以后再看
LRESULT CALLBACK HelloWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	static COLORREF clrTextArray[]={RGB(0,0,0),RGB(255,0,0),RGB(0,255,0),RGB(0,0,255),RGB(255,255,255)};
	static HWND hwndClient,hwndFrame;
	HDC hdc;
	HMENU hMenu;
	PHELLODATA pHelloData;
	PAINTSTRUCT ps;
	RECT rect;

	switch(message)
	{
	case WM_CREATE:
		pHelloData=(PHELLODATA)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(HELLODATA));
		pHelloData->iColor=IDM_COLOR_BLACK;
		pHelloData->clrText=RGB(0,0,0);
		SetWindowLong(hwnd,0,(LONG)pHelloData);
		hwndClient=GetParent(hwnd);
		hwndFrame=GetParent(hwndClient);
		return 0;
	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case IDM_COLOR_BLACK:
		case IDM_COLOR_RED:
		case IDM_COLOR_GREEN:
		case IDM_COLOR_BLUE:
		case IDM_COLOR_WHITE:
			pHelloData=(PHELLODATA)GetWindowLong(hwnd,0);
			hMenu=GetMenu(hwndFrame);
			CheckMenuItem(hMenu,pHelloData->iColor,MF_UNCHECKED);
			pHelloData->iColor=wParam;
			CheckMenuItem(hMenu,pHelloData->iColor,MF_CHECKED);
			pHelloData->clrText=clrTextArray[wParam-IDM_COLOR_BLACK];
			InvalidateRect(hwnd,NULL,FALSE);
		}
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hwnd,&ps);
		pHelloData=(PHELLODATA)GetWindowLong(hwnd,0);
		SetTextColor(hdc,pHelloData->clrText);
		GetClientRect(hwnd,&rect);
		DrawText(hdc,TEXT("Hello,World!"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
		EndPaint(hwnd,&ps);
		return 0;
	case WM_MDIACTIVATE:
		if(lParam==(LPARAM)hwnd)
			SendMessage(hwndClient,WM_MDISETMENU,(WPARAM)hMenuHello,(LPARAM)hMenuHelloWindow);
		pHelloData=(PHELLODATA)GetWindowLong(hwnd,0);
		CheckMenuItem(hMenuHello,pHelloData->iColor,(lParam==(LPARAM)hwnd)?MF_CHECKED:MF_UNCHECKED);
		if(lParam!=(LPARAM)hwnd)
			SendMessage(hwndClient,WM_MDISETMENU,(WPARAM)hMenuInit,(LPARAM)hMenuInitWindow);
		DrawMenuBar(hwndFrame);
		return 0;
	case WM_QUERYENDSESSION:
	case WM_CLOSE:
		if(IDOK!=MessageBox(hwnd,TEXT("OK to close window!"),TEXT("Hello"),MB_ICONQUESTION|MB_OKCANCEL))
			return 0;
		break;
	case WM_DESTROY:
		pHelloData=(PHELLODATA)GetWindowLong(hwnd,0);
		HeapFree(GetProcessHeap(),0,pHelloData);
		return 0;
	}
	return DefMDIChildProc(hwnd,message,wParam,lParam);
}

LRESULT CALLBACK RectWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	static HWND hwndClient,hwndFrame;
	HBRUSH hBrush;
	HDC hdc;
	PRECTDATA pRectData;
	PAINTSTRUCT ps;
	int xLeft,xRight,yTop,yBottom;
	short nRed,nGreen,nBlue;

	switch(message)
	{
	case WM_CREATE:
		pRectData=(PRECTDATA)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(RECTDATA));
		SetWindowLong(hwnd,0,(long)pRectData);
		SetTimer(hwnd,1,250,NULL);
		hwndClient=GetParent(hwnd);
		hwndFrame=GetParent(hwndClient);
		return 0;
	case WM_SIZE:
		if(wParam!=SIZE_MINIMIZED)
		{
			pRectData=(PRECTDATA)GetWindowLong(hwnd,0);
			pRectData->cxClient=LOWORD(lParam);
			pRectData->cyClient=HIWORD(lParam);
		}
		break;
	case WM_TIMER:
		pRectData=(PRECTDATA)GetWindowLong(hwnd,0);
		xLeft=rand()%pRectData->cxClient;
		xRight=rand()%pRectData->cxClient;
		yTop=rand()%pRectData->cyClient;
		yBottom=rand()%pRectData->cyClient;
		nRed=rand()&255;
		nGreen=rand()&255;
		nBlue=rand()&255;
		
		hdc=GetDC(hwnd);
		hBrush=CreateSolidBrush(RGB(nRed,nGreen,nBlue));
		SelectObject(hdc,hBrush);

		Rectangle(hdc,min(xLeft,xRight),min(yTop,yBottom),max(xLeft,xRight),max(yTop,yBottom));

		ReleaseDC(hwnd,hdc);
		DeleteObject(hBrush);
		return 0;
	case WM_PAINT:
		InvalidateRect(hwnd,NULL,TRUE);
		hdc=BeginPaint(hwnd,&ps);
		EndPaint(hwnd,&ps);
		return 0;
	case WM_MDIACTIVATE:
		if(lParam==(LPARAM)hwnd)
			SendMessage(hwndClient,WM_MDISETMENU,(WPARAM)hMenuRect,(LPARAM)hMenuRectWindow);
		else
			SendMessage(hwndClient,WM_MDISETMENU,(WPARAM)hMenuInit,(LPARAM)hMenuInitWindow);
		DrawMenuBar(hwndFrame);
		return 0;
	case WM_DESTROY:
		pRectData=(PRECTDATA)GetWindowLong(hwnd,0);
		HeapFree(GetProcessHeap(),0,pRectData);
		KillTimer(hwnd,1);
		return 0;
	}
	return DefMDIChildProc(hwnd,message,wParam,lParam);
}

前面有三章只是大体看了下,没有写代码,先放一下吧,这个是多文档的,也有一些不理解的东西,在这很有纪念意义的时间,6.1,开始我觉得用处很大的多任务和多线程了。
第1部分 基础知识   第1章 起步   1.1 Windows环境   1.1.1 Windows简史   1.1.2 Windows的方方面面   1.1.3 动态链接   1.2 Windows编程选项   1.2.1 API及内存管理模式   1.2.2 语言选择   1.2.3 编程环境   1.2.4 API文档   1.3 你的第一个Windows程序   1.3.1 字符模式   1.3.2 Windows对应程序   1.3.3 头文件   1.3.4 程序入口   1.3.5 MessageBox函数   1.3.6 编译、链接及运行   第2章Unicode简介   2.1 字符集简史   2.1.1 美国标准   2.1.2 美国以外的世界   2.1.3 扩展ASCII   2.1.4 双字节字符集   2.1.5 Unicode的解救方案   2.2 宽字符和c语言   2.2.1 char数据类型   2.2.2 更宽的字符   2.2.3 宽字符库函数   2.2.4 维护一个源代码文件   2.3 宽字符和Windows   2.3.1 Windows头文件的类型   2.3.2 Windows函数调用   2.3.3 Windows的字符串函数   2.3.4 在Windows中使用printf   2.3.5 格式化的消息框   2.3.6 国际化之于本书   第3章 窗口与消息   3.1 窗口的创建   3.1.1 系统结构概述   3.1.2 HELLOWIN程序   3.1.3 通盘考虑   3.1.4 窗口类的注册   3.1.5 窗口的创建   3.1.6 窗口的显示   3.1.7 消息循环   3.1.8 窗口过程   3.1.9 消息的处理   3.1.10 声音文件的播放   3.1.11 WM_PAINT消息   3.1.12 WM_DESTROY消息   3.2 Windows编程中的若干难点   3.2.1 究竟是谁调用谁   3.2.2 队列消息和非队列消息   3.2.3 速战速决   第4章 文本输出   4.1 绘制和重绘   4.1.1 WM_PAINT消息   4.1.2 有效矩形和无效矩形   4.2 GDI简介   4.2.1 设备环境   4.2.2 获取设备环境句柄:方法一   4.2.3 绘制信息结构   4.2.4 获取设备环境句柄:方法二   4.2.5 TEXTOUT函数详解   4.2.6 系统字体   4.2.7 字符大小   4.2.8 文本尺寸的度量   4.2.9 文本的格式化   4.2.10 综合使用   4.2.11 SYSMETSl.C窗口过程   4.2.12 空间不够   4.2.13 客户区的尺寸   4.3 滚动条   4.3.1 滚动条的范围和位置   4.3.2 滚动条消息   4.3.3 加入滚动条的SYSMET   4.3.4 程序的绘制代码的结构   4.4 效果更好的滚动   4.4.1 滚动条信息函数   4.4.2 最远可以卷动到哪里?   4.4.3 新的SYSMETS   4.4.4 可我不想用鼠标   第5章 绘图基础   5.1 GDI的结构   5.1.1 GDI原理   5.1.2 GDI函数调用   5.1.3 GDI的基本图形   5.1.4 其他   5.2 设备环境   5.2.1 获取设备环境句柄   5.2.2 获取设备环境的信息   5.2.3 DEVCAPSl程序   5.2.4 设备的尺寸   5.2.5 色彩ABC   5.2.6 设备环境属性   5.2.7 保存设备环境   5.3 点和线的绘制   5.3.1 设定像素   5.3.2 直线   5.3.3 边框绘制函数   5.3.4 贝塞尔样条曲线   5.3.5 使用现有画笔   5.3.6 创建、选择和删除画笔   5.3.7 填充空隙   5.3.8 绘图模式   5.4 绘制填充区域   5.4.1 Polygon函数和多边形填充模式   5.4.2 用画刷填充内部   5.5 GDI映射模式   5.5.1 设备坐标和逻辑坐标   5.5.2 设备坐标系统   5.5.3 视口和窗口   5.5.4 使用MMTEXT   5.5.5 度量映射模式   5.5.6 自定义的映射模式   5.5.7 WHATSIZE程序   5.6 矩形、区域和剪裁   5.6.1 处理矩形   5.6.2 随机矩形   5.6.3 建立和绘制区域   5.6.4 矩形与区域的剪裁   5.6.5 CLOVER程序   第6章 键盘   6.1 键盘基础   6.1.1 忽略键盘   6.1.2 谁获得了焦点?   6.1.3 队列和同步   6.1.4 击键和字符   6.2 击键消息   6.2.1 系统键击和非系统键击   6.2.2 虚拟键代码   6.2.3 1param信息   6.2.4 转义状态   6.2.5 使用击键消息   6.2.6 为SYSMETS加上键盘处理功能   6.3 字符消息   6.3.1 四类字符消息   6.3.2 消息排序   6.3.3 控制字符的处理   6.3.4 死字符消息   6.4 键盘消息和字符集   6.4.1 KEYVIEW1程序   6.4.2 非英语键盘问题   6.4.3 字符集和字体   6.4.4 Unicode解决方案   6.4.5 TrueType字体和大字体   6.5 插入符号(不是光标)   6.5.1 一些关于插入符号的函数   6.5.2 TYPER程序   第7章 鼠标   7.1 鼠标的基础知识   7.1.1 一些基本术语   7.1.2 鼠标的复数形式是什么?   7.2 客户区鼠标消息   7.2.1 简单的鼠标处理示例   7.2.2 处理Shift键   7.2.3 鼠标双击   7.3 非客户区鼠标消息   7.3.1 击中测试消息   7.3.2 消息引发消息   7.4 程序中的击中测试   7.4.1 一个假想的例子   7.4.2 一个简单的程序   7.4.3 使用键盘模仿鼠标操作   7.4.4 在CHECKER中增加键盘接口   7.4.5 在击中测试中使用子窗口   7.4.6 CHECKER程序中的子窗口   7.4.7 子窗口和键盘   7.5 捕获鼠标   7.5.1 设计一个矩形   7.5.2 捕获的解决方案   7.5.3 BLOKOUT2程序   7.6 鼠标的滚轮   第8章 计时器   8.1 计时器的基本知识   8.1.1 系统和计时器   8.1.2 计时器消息不是异步的   8.2 使用计时器的三种方法   8.2.1 方法一   8.2.2 方法二   8.2.3 方法三   8.3 使用计时器作为时钟   8.3.1 数字时钟   8.3.2 获取当前时间   8.3.3 显示数字和冒号   8.3.4 考虑国际化   8.3.5 模拟时钟   8.4 在状态报告上使用计时器   第9章 子窗口控件   9.1 按钮类   9.1.1 创建子窗口   9.1.2 子窗口传递信息给父窗口   9.1.3 父窗口传递信息给子窗口   9.1.4 按钮   9.1.5 复选框   9.1.6 单选按钮   9.1.7 组合框   9.1.8 改变按钮文本   9.1.9 可见的按钮和启用的按钮   9.1.10 按钮和输入焦点   9.2 控件和颜色   9.2.1 系统颜色   9.2.2 按钮的颜色   9.2.3 WMCTLCOLORBTN消息   9.2.4 自绘按钮   9.3 静态类   9.4 滚动条类   9.4.1 COLORS1程序   9.4.2 自动键盘接口   9.4.3 窗口子类   9.4.4 背景着色   9.4.5 给滚动条和静态文本着色   9.5 编辑类   9.5.1 编辑类的样式   9.5.2 编辑控件的通知消息   9.5.3 使用编辑控件   9.5.4 传递给编辑控件的消息   9.6 列表框类   9.6.1 列表框的样式   9.6.2 向列表框中添加字符串   9.6.3 项目的选择和提取   9.6.4 接收来自列表框的消息   9.6.5 简单的列表框程序   9.6.6 列出文件   9.6.7 Windows的HEAD程序   第10章 菜单和其他资源   10.1 图标、鼠标指针、字符串和自定义资源   10.1.1 向程序添加图标   10.1.2 获得图标的句柄   10.1.3 在应用程序中使用图标   10.1.4 使用自定义鼠标指针   10.1.5 字符串资源   10.1.6 自定义资源   10.2 菜单   10.2.1 和菜单有关的概念   10.2.2 菜单结构   10.2.3 定义菜单   10.2.4 在程序中引用菜单   10.2.5 菜单和消息   10.2.6 范例程序   10.2.7 菜单设计中的规范   10.2.8 定义菜单的繁琐方式   10.2.9 浮动弹出菜单   10.2.1 0使用系统菜单   10.2.1 1改变菜单   10.2.1 2其他菜单命令   10.2.1 3菜单的另类用法   10.3 键盘加速键   10.3.1 为什么你应该使用键盘加速键   10.3.2 指定加速键的一些规则   10.3.3 加速键表   10.3.4 加载加速键表   10.3.5 翻译按键   10.3.6 接收加速键消息   10.3.7 带有菜单和加速键的POPPAD程序   10.3.8 启用菜单项   10.3.9 处理菜单项   第11章 对话框   11.1 模态对话框   11.1.1 创建一个About对话框   11.1.2 对话框及其模板   11.1.3 对话框过程   11.1.4 激活对话框   11.1.5 主题变换   11.1.6 更复杂的对话框   11.1.7 对话框控件的应用   11.1.8 OK和Cancel按钮   11.1.9 避免全局变量   11.1.1 0Tab停靠和选项组   11.1.1 1在对话框上绘图   11.1.1 2关于对话框的其他函数.   11.1.1 3定义程序自己的控件   11.2 非模态对话框   11.2.1 模态与非模态对话框的区别   11.2.2 新的COLORS程序   11.2.3 HEXCALC:窗口还是对话框?   11.3 公用对话框   11.3.1 完善POPPAD   11.3.2 Unicode文件的读/写操作   11.3.3 改变字体   11.3.4 查找和替换   11.3.5 只调用一个函数的Windows程序   ……   第Ⅱ部分 关于图的那些事儿   第Ⅲ部分 高级主题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值