330 likes | 467 Views
CHAP1 WINDOWS API 编程基础. 1. Windows 应用程序的工程文件 1.1 创建一个 API 程序 APPWIZARD WIN32 具体步骤 : 1.2 工程文件的组成 1.2.1 工程文件 : 源文件的集合 通过编译连接成执行程序或 DLL DSP 代表一个工程文件 DSW 代表一个工作文件 , 可以包含多个工程文件 1.2.2 源代码文件 .H .CPP 1.2.3 资源文件 : 菜单 、 对话框、 图标、 光标、字符串. 2. Windows 数据类型和变量命名规则.
E N D
CHAP1 WINDOWS API 编程基础 1. Windows应用程序的工程文件 1.1 创建一个API程序 APPWIZARD WIN32 具体步骤: 1.2 工程文件的组成 1.2.1 工程文件: 源文件的集合 通过编译连接成执行程序或DLL DSP代表一个工程文件 DSW 代表一个工作文件,可以包含多个工程文件 1.2.2 源代码文件 .H .CPP 1.2.3 资源文件 : 菜单 、 对话框、 图标、 光标、字符串
2. Windows 数据类型和变量命名规则 2.1 Windows c/c++ 自定义数据类型
2.2 常用的数据结构 typedef struct tagPOINT { LONG x; LONG y; } POINT; typedef struct tagRECT { LONG left; LONG top; LONG right; LONG bottom; } RECT; typedef struct tagSIZE { LONG cx; LONG cy; } SIZE;
3. WINMAIN()函数——程序的入口点 • 功能: 创建并显示窗口 • 执行消息循环 • 3.1 函数原型 • int APIENTRY WinMain( • HINSTANCE hInstance, • HINSTANCE hPrevInstance, • LPSTR lpCmdLine, • int nCmdShow)
3.2 重要概念--Windows对象与句柄 • Windows对象: • 窗口,菜单,光标,图标,应用程序实例… • 句柄: • 提供对 Windows对象的访问途径 • 由操作系统给定 • 唯一代表 Windows对象的整型数 • HINSTANCE:代表一个应用程序的实列句柄 • HMEN:菜单 • HWND:窗口 • HICON:图标 • HCURSOR:光标
3.3 窗口的创建与显示 3.3.1 窗口与窗口类 窗口: 外观;矩形区域 要素:标题,菜单,边框,窗口工作区, 最大化 最小化 恢复框 功能:提供图形操作界面 主窗口——代表一个应用程序单元 窗口对象的访问: HWND 窗口类: 用于创建窗口的模板 决定了窗口的以下属性:图标、光标、菜单 决定窗口的功能(对用户操作的响应) WNDCLASS(EX)结构
WNDCLASSEX结构 typedef struct _WNDCLASSEX { UINT cbSize; //定义窗口类结构的大小,如sizeof(WNDCLASSEX). UINT style; //定义窗口样式,如CS_HREDRAW |CS_VREDRAW WNDPROC lpfnWndProc; //指向窗口过程函数的指针 int cbClsExtra; //分配在窗口类结构后的字节数 int cbWndExtra; //分配在窗口实例后的字节数 HINSTANCE hInstance; //定义窗口类应用程序的实例句柄 HICON hIcon; //窗口类的图标 HCURSOR hCursor; //窗口类的光标 HBRUSH hbrBackground; //窗口类的背景填充色 LPCTSTR lpszMenuName; //窗口类的菜单资源名 LPCTSTR lpszClassName; //窗口类的名称 HICON hIconSm; //与窗口类相关联的小图标句柄 } WNDCLASSEX, *PWNDCLASSEX;
3.3.2 了解有关API函数 注册窗口类:RegisterWndClass() ATOM RegisterClass( CONST WNDCLASS *lpWndClass ); 创建窗口:CreateWindow() HWND CreateWindow( LPCTSTR lpClassName, // 注册的窗口类名 LPCTSTR lpWindowName, // 窗口的标题名 DWORD dwStyle, // 窗口的风格 int x, // 窗口左上角的x坐标值 int y, // 窗口左上角的y坐标值 int nWidth, // 窗口的宽度 int nHeight, // 窗口的高度 HWND hWndParent, // 父窗口句柄 HMENU hMenu, // 主菜单句柄 HINSTANCE hInstance, // 应用程序的实例句柄 LPVOID lpParam // 指向一个传递给窗口的参数值指针 );
可以通过位或(|)操作实现窗口样式的自定义组合可以通过位或(|)操作实现窗口样式的自定义组合 例如: WS_VSCROLL| WS_POPUP表示窗口样式为有垂直滚动条的弹出式窗口
显示窗口:ShowWindow() 函数 BOOL ShowWindow( HWND hWnd,int nCmdShow ) 更新窗口: UpdateWindow()函数 BOOL UpdateWindow( HWND hWnd);
System class • BUTTON • COMBOBOX • EDIT • LISTBOX • RichEdit • RICHEDIT_CLASS • SCROLLBAR • STATIC
EX1.1 改变窗口类的属性,观察程序运行结果, 窗口类决定窗口的哪些属性。
3.4 消息循环 从消息队列中检取消息,并发送到窗口过程函数由程函数处理消息。 3.4.1重点概念: 消息、消息队列 消息: 每发生一个用户操作事件,操作系统产生一条对应的消息 WM_KEYDOWN WM_LBUTOWDOWN WM_COMMAND 消息可以不一定由用户操作产生 WM_PAINT WM_CREATE
了解MSG结构 typedef struct tagMSG { HWND hwnd; // identifies the window UINT message;//the message number WPARAM wParam; LPARAM lParam;//additional information DWORD time; // message posted time POINT pt; //cursor position } MSG;
WM_CREATE • WM_DESTROY • WM_PAINT • WM_SIZE • int cx=LOWORD(lParam); • int cy=HIWORD(lParam) • WM_KEYDOWN • wParam -virtual-key code of the nonsystem key • WM_LBUTTONDOWN • xPos = GET_X_LPARAM(lParam); • yPos = GET_Y_LPARAM(lParam);
消息队列: WINDOWS操作系统维护的缓冲区,WINDOWS为每一个应用程序的主线程创建一个消 息队列,用于存放消息,等待被消息循环捡取. 3.4.2 了解有关API函数 GetMessage() TranslateMessage() DispachMessage()
GetMessage()函数 • 从消息队列检取消息,放到消息结构变量中。 • 如果检取到除WM_QUIT消息外的消息,返回值非零; 如果检取到WM_QUIT消息,返回值为零。 • 如果消息队列中没有消息,把程序控制权转给其它程序。
函数原型: BOOL GetMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax );
TranslateMessage() 把按键消息翻译成字符消息,放入消息队列中 BOOL TranslateMessage( CONST MSG *lpMsg // address of structure with message); • DispatchMessae() 把消息发送到窗口过程函数。 • LONG DispatchMessage( CONST MSG *lpmsg // pointer to structure with message);
4. 窗口过程函数 • 4.1 函数原型: • LRESULT CALLBACK WndProc( • HWND hWn, • UINT message, • WPARAM wParam, • LPARAM lParam) • 4.2 功能: • 实现对消息处理, • WINDOWS程序的主要工作就是响应并处理消息
4.3响应消息 • ….. • switch(msg) { • case WM_ : • //Operation1 • break; • case WM_ : • //Operation2 • break; • ….. • case WM_DESTROY • PostQuitMessage(0); • break • default: • return DefaultWindowProc(hWnd,message,wParam,lParam ); • } • …..
4.4缺省窗口过程函数 • 功能: • 处理所有未被处理的消息, 某些消息必须进行缺省的处理, 如:WM_PAINT消息 EX1.2 消息处理实列 设计要求,把文本显示移动到鼠标的位置
5. 资源编辑答与资源文件 资源ID 唯一标识资源 5.1字符串与资源 ①编辑资源 ②使用字符串资源 LoadString( ) 5.2 图标资源 ①编辑 ②LoadIcon() 5.3光标资源 ①编辑 ②LoadCursor() EX 1.3 编辑资源
常用的窗口操作函数 • BOOL MoveWindow( • HWND hWnd, // handle to window • int X, // horizontal position • int Y, // vertical position • int nWidth, // width • int nHeight, // height • BOOL bRepaint // repaint option • );
BOOL EnableWindow( • HWND hWnd, // handle to window • BOOLbEnable // enable or disable input • );
6. 本章总结 • 6.1工程文件 • 集合了源程序(代码)与资源文件(数据), • 代码与数据分开 • 可以由多个源代码文件,但资源文件只能有一个。
6.2 WinMain( )函数 • 程序入口点 • 实现窗口的创建,显示等初始化工作, • 执行消息循环 • 一个工程中只有一个WinMain函数 • 6.3窗口过程函数 • 处理各种类型的消息一个窗口类对应一个窗口过程函数。
6.4资源 • 特殊形式的数据 • 资源有ID来标识; • 代码中使用资源需要通过函数装载; • 资源文件.RC,编译后.RES • 6.5 运行应用程序:DEBUG、RELEASE 两种版本。 • 编译:C\C++ -- .OBJ • .RC – .RES • 链接: .EXE
本章重点概念: 1. 消息(事件)驱动 2. 窗口类、窗口与窗口函数 3. 消息,消息循环与窗口函数
课堂练习 • 试述窗口、窗口类和窗口函数的功能及其间相互关系 • 试述WinMain函数和窗口函数各完成什么功能 • 试述消息队列、消息循环和窗口函数的功能及其间相互关系 • DefWindProc函数的功能,哪个消息不能缺省处理,如何处理。 • 如何设置窗口的位置和大小,改变光标形状和窗口背景颜色。 • 你对讲课内容或方式有什么问题和建议