学习《Windows程序设计》记录
概念贴士:
1. 每个GUI应用程序至少应该创建一个窗口,称为主窗口,它作为用户与应用程序间的主界面来提供服务。大多数应用程序也直接或间接地创建其他窗口,来完成与主窗口相关的工作。
2. 应用程序的主窗口包括标题栏、菜单栏、Windows系统菜单、最小化按钮、最大化按钮、回复按钮、关闭按钮、可改变大小的边框、窗口客户区、垂直滚动条和水平滚动条。
3. VC++6.0创建GUI程序: 1)创建VC++6.0,选择命令“文件”,点击“新建”;
2)选择“工程”,点击“Win32 Application”选项;
3)输入工程名、存放路径;
4)点击OK按钮,选择第二项“一个简单Win32应用程序”;
5)点击“完成”按钮,完成GUI程序工程创建。
4. Win32程序的入口函数将是WinMain函数,而不是控制台程序的main函数。
5. GUI应用程序的入口函数是WinMain,这是一个自定义的回调函数。其中APIENTRY是_stdcall的宏定义,说明WinMain函数采用的是Windows标准调用方式。
6. 用户创建窗口后,就要对窗口的行为负责。当Windows向程序发送消息时,它调用程序中的一个函数,这个函数的参数精确地描述了Windows发送的消息。在程序中称这个函数为窗口函数(Window Procedure)或消息处理函数。它是一个自定义的回调函数。
7. 系统为应用程序传递所有的输入到它的各个窗口,每个窗口都关联一个窗口函数,每当这个窗口有输入时,系统调用该函数。窗口函数处理输入,然后再将控制权交给系统。
8. 基于窗口界面的Windows应用程序是事件驱动(event-driven)的。为了取得输入,它们并不做显示的函数调用,而是等待系统传递输入给它们。
9. 在桌面上显示一个窗口的具体步骤(也就是主程序的结构流程):
1)注册窗口类(RegisterClassEx);
2)创建窗口(CreateWindowEx);
3)在桌面显示窗口(ShowWindow);
4)更新窗口客户区(UpdateWindow);
5)进入无限的消息获取和处理的循环。 首先是获取消息(GetMessage).如果有消息到达,则将消息分派到回到函数进行处理(DispatchMessage)。如果消息是WM_QUIT,则GetMessage函数返回FALSE,整个消息循环结束。消息具体的处理过程是在MainWndProc函数中进行的。
代码解释:
FirstWindow
PS:这是一个最简单的窗口程序源代码,作用是弹出一个典型的Windows窗口。这些代码可作为今后用API写Windows程序的基本框架。
1 // 窗口学习01.cpp : Defines the entry point for the application. 2 // 3
4 #include "stdafx.h"
5 LRESULT CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM); 6 int APIENTRY WinMain(HINSTANCE hInstance, 7 HINSTANCE hPrevInstance, 8 LPSTR lpCmdLine, 9 int nCmdShow) 10 { 11 // TODO: Place code here.
12 char szClassName[]="MainWClass"; 13 WNDCLASSEX wndclass; 14 //用于描述主窗口的参数填充WNDCLASSEX结构
15 wndclass.cbSize=sizeof(wndclass); //结构的大小
16 wndclass.style=CS_HREDRAW|CS_VREDRAW; //指定如果大小改变就重画
17 wndclass.lpfnWndProc=MainWndProc; //窗口函数指针
18 wndclass.cbClsExtra=0; //没有额外的类内存
19 wndclass.cbWndExtra=0; //没有额外的窗口内存;
20 wndclass.hInstance=hInstance; //实例句柄
21 wndclass.hIcon=::LoadIcon(NULL,IDI_APPLICATION); //使用预定义图标
22 wndclass.hCursor=::LoadCursor(NULL,IDC_ARROW); //使用预定义的光标
23 wndclass.hbrBackground=(HBRUSH)::GetStockObject(WHITE_BRUSH); //使用白色背景画刷
24 wndclass.lpszMenuName=NULL; //不指定菜单
25 wndclass.lpszClassName=szClassName; //窗口类的名称
26 wndclass.hIconSm=NULL; //没有类的小图标 27
28 //注册这个窗口类
29 ::RegisterClassEx(&wndclass); 30
31 //创建主窗口
32 HWND hwnd=::CreateWindowEx( 33 0, //dwExStyle,扩展样式
34 szClassName, //lpClassName,类名
35 "My first Window!", //lpWindowName,标题
36 WS_OVERLAPPEDWINDOW, //dwStyle,窗口风格
37 CW_USEDEFAULT, //X,初始X坐标
38 CW_USEDEFAULT, //Y,初始Y坐标
39 CW_USEDEFAULT, //nWidth,宽度
40 CW_USEDEFAULT, //nHeight,高度
41 NULL, //hWndParent,父窗口句柄
42 NULL, //hMenu,菜单句柄
43 hInstance, //hInstance,程序实例句柄
44 NULL); //lpParam,用户数据
45
46 if(hwnd==NULL) 47 { 48 ::MessageBox(NULL,"创建窗口出错!","error",MB_OK); 49 return -1; 50 } 51
52 //显示窗口,刷新窗口客户区
53 ::ShowWindow(hwnd,nCmdShow); 54 ::UpdateWindow(hwnd); 55
56 //从消息队列中取出消息,交给窗口函数处理,知道GetMessage返回FALSE,结束消息循环
57 MSG msg; 58 while(::GetMessage(&msg,NULL,0,0)) 59 { 60 //转化键盘消息
61 ::TranslateMessage(&msg); 62 //将消息发送到相应的窗口函数
63 ::DispatchMessage(&msg); 64 } 65
66 //当GetMessage返回FALSE时程序结束
67 retu