第2课 GUI程序实例分析
1. GUI程序开发概述
(1)现代操作系统提供原生SDK支持GUI程序开发
(2)GUI程序开发是现代操作系统上的主流技术
(3)不同操作系统上的GUI开发原理相同
(4)不同操作系统上的GUI SDK不同
2. GUI程序开发原理
(1)GUI程序在运行时会创建一个消息队列
(2)系统内核将用户操作翻译成对应的程序消息
(3)程序在运行过程中需要实时处理队列中的消息
(4)当队列中没有消息时,程序将处于停滞状态
(5)不同操作系统支持相同的GUI开发原理
3. GUI程序开发的本质
(1)在代码中用程序创建窗口及窗口元素
(2)在消息处理函数中根据程序消息做出不同的响应
经典GUI程序开发模式
4. GUI程序开发实例
(1)多数操作系统以C函数的方式提供GUI SDK
(2)以Windows操作系统为例
函数名 |
功能 |
RegisterClass |
向系统注册GUI窗口样式 |
CreateWindow |
创建窗口或窗口元素 |
ShowWindow |
在屏幕上显示创建好的窗口 |
UpdateWindow |
刷新屏幕上的窗口 |
GetMessage |
获取程序消息队列中的消息 |
TranslateMessage |
翻译系统消息 |
DispatchMessage |
将消息发送到窗口处理函数 |
【编程实验】GUI程序开发初体验
#include <windows.h> #define STYLE_NAME L"MainForm"
#define BUTTON_ID 919 //主窗口定义
BOOL DefineMainWindow(HINSTANCE hInstance);
//主窗口创建
HWND CreateMainWindow(HINSTANCE hInstance, wchar_t* title);
//主窗口内部元素创建函数
HWND CreateButton(HWND parent, int id, wchar_t* text);
//主窗口显示函数
HWND DisplayMainWindow(HWND hWnd, int nCmdShow);
//主窗口消息处理函数
LRESULT CALLBACK WndProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam); static HWND MainWindow = NULL; //主窗口句柄 BOOL WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG Msg = { }; //1.自定义主窗口样式
if (!DefineMainWindow(hInstance)){
return FALSE;
} //2.创建主窗口
MainWindow = CreateMainWindow(hInstance, STYLE_NAME); if (MainWindow)
{
//3.创建主窗口中的控件元素
CreateButton(MainWindow, BUTTON_ID, L"My Button"); //4.在屏幕上显示主窗口
DisplayMainWindow(MainWindow, nCmdShow);
}
else
{
return FALSE;
} //5.进入消息循环
while (GetMessage(&Msg,NULL,,))
{
//6.翻释并转换系统消息
TranslateMessage(&Msg);
//7.分发消息到对应的消息处理函数
DispatchMessage(&Msg);
} return Msg.wParam;
} BOOL DefineMainWindow(HINSTANCE hInstance)
{
static WNDCLASS WndClass = { };//系统结构类型,用于描述窗口样式 WndClass.style = ;
WndClass.cbClsExtra = ;
WndClass.cbWndExtra = ;
WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW); //定义窗口背景色
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); //定义鼠标样式
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //定义窗口左上角图标
WndClass.hInstance = hInstance; //定义窗口样式属于当前应用程序
WndClass.lpfnWndProc =(WNDPROC)WndProc; //窗口消息处理函数
WndClass.lpszClassName = STYLE_NAME; //窗口样式名
WndClass.lpszMenuName = NULL; //将定义好的窗口样式注册到系统上
return RegisterClass(&WndClass);
} HWND CreateMainWindow(HINSTANCE hInstance, wchar_t* title)
{
HWND hWnd = NULL; hWnd = CreateWindow(STYLE_NAME, //通过定义好的窗口样式创建主窗口
title, //主窗口标题
WS_OVERLAPPEDWINDOW,//创建后主窗口的显示风格
CW_USEDEFAULT, //主窗口左上角x坐标
CW_USEDEFAULT, //主窗口左上角y坐标
CW_USEDEFAULT, //主窗口宽度
CW_USEDEFAULT, //主窗口高度
NULL, //父窗口
NULL, //主窗口菜单
hInstance, //主窗口属于当前应用程序
NULL);
return hWnd;
} HWND DisplayMainWindow(HWND hWnd, int nCmdShow)
{
ShowWindow(hWnd, nCmdShow); //显示窗口
UpdateWindow(hWnd); //刷新窗口 return hWnd;
} HWND CreateButton(HWND parent, int id, wchar_t* text)
{
HINSTANCE hInstance = (HINSTANCE)GetWindowLong(parent, GWL_HINSTANCE); HWND hWnd = NULL; hWnd = CreateWindow(L"button", //通过系统预定义的窗口样式创建元素
text, //窗口元素标题
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,//创建后窗口元素的显示风格
, //窗口元素在主窗口左上角x坐标
, //窗口元素在主窗口左上角y坐标
, //窗口元素宽度
, //窗口元素高度
parent, //父窗口
(HMENU)id, //窗口元素ID值
hInstance, //窗口元素属于当前应用程序
NULL);
return hWnd;
} LRESULT CALLBACK WndProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage();
break;
default:
//调用系统提供的默认消息处理函数
return DefWindowProc(hWnd, message, wParam, lParam);
} return ;
}
5. 小结
(1)现代操作系统提供原生SDK支持GUI程序开发
(2)不同操作系统上的GUI SDK不同
(3)不同操作系统上的GUI开发原理相同
(4)GUI程序开发包括:
①在代码中用程序创建窗口及窗口元素
②在消息处理函数中根据程序消息做出不同响应
第2课 GUI程序实例分析的更多相关文章
- 第1课 GUI程序原理分析
1. 命令行应用程序 (1)命令行应用程序的特点 ①是一种基于顺序执行结构的可执行程序 ②程序执行过程中不需要与用户产生交互 ③程序执行后给出最终的运行结果 (2)命令行应用程序的运行模式——程序运行 ...
- GUI程序原理分析
1,Qt 是一套跨平台的程序设计库,这套程序设计库主要用于 GUI 方面的程序设计开发,所以本系列博文主要是利用C++介绍 GUI 程序设计技术: 2,命令行应用程序: 1,命令行应用程序的特点(Co ...
- Asp.Net(C#)自动执行计划任务的程序实例分析
在业务复杂的应用程序中,有时候会要求一个或者多个任务在一定的时间或者一定的时间间隔内计划进行,比如定时备份或同步数据库,定时发送电子邮件等,我们称之为计划任务.实现计划任务的方法也有很多,可以采用SQ ...
- GUI程序分析实例
GUI程序开发概述 GUI程序开发原理 GetMessage(&msg)将消息队列中的消息取出来,在循环中进行处理. GUI程序开发的本质
- 用C++实现的数独解题程序 SudokuSolver 2.3 及实例分析
SudokuSolver 2.3 程序实现 用C++实现的数独解题程序 SudokuSolver 2.2 及实例分析 里新发现了一处可以改进 grp 算法的地方,本次版本实现了对应的改进 grp 算法 ...
- 用C++实现的数独解题程序 SudokuSolver 2.2 及实例分析
SudokuSolver 2.2 程序实现 根据 用C++实现的数独解题程序 SudokuSolver 2.1 及实例分析 里分析,对 2.1 版做了一些改进和尝试. CQuizDealer 类声明部 ...
- 用C++实现的数独解题程序 SudokuSolver 2.1 及实例分析
SudokuSolver 2.1 程序实现 在 2.0 版的基础上,2.1 版在输出信息上做了一些改进,并增加了 runtil <steps> 命令,方便做实例分析. CQuizDeale ...
- 用C++实现的数独解题程序 SudokuSolver 2.4 及实例分析
SudokuSolver 2.4 程序实现 本次版本实现了 用C++实现的数独解题程序 SudokuSolver 2.3 及实例分析 里发现的第三个不完全收缩 grp 算法 thirdGreenWor ...
- 第11课 Git GUI程序的基本功能
11-1 Git GUI程序的基本操作
随机推荐
- 使用 reshape2 重塑数据框
我们已经学习了如何筛选.排序.合并和汇总数据框.这些操作只适用于行和列,然而有时候我们需要做一些更复杂的事情.例如,下面这段代码读取了一个数据集,包含了两种产品不同日期的质量和耐久性的测试结果:toy ...
- npm安装vue详细教程(图片详解)
npm安装vue详细教程(图片详解) 一.总结 一句话总结:整个安装流程照着教程来,注意系统环境变量的配置,注意一下npm的本地仓库和缓存位置 教程 系统环境变量 仓库 缓存 1.什么情况下最适合用n ...
- 大白菜的装机U盘真不错
今天用大白菜制作了个启动U盘,然后在里面,把[电脑公司]的ghost文件拷贝进去. 重新安装WinXP成功. 注意: 1)直接用[电脑公司]的ISO文件,用Win32DiskImage写到U盘,不知为 ...
- Android手机无线adb
1.首先电脑,手机通过数据线链接电脑,然后通过adb devices 查看到已连接 2.输入:adb tcpip 5555 3.输入:adb connect 222.222.221.137:5555 ...
- JDK环境变化配置
JDK环境变化配置 第一"JAVA_HOME" JAVA_HOME的内容是jdk安装目录.如小编安装的位置:D: \Java\jdk1.7.0_60,并且后边不带分号 第二, CL ...
- 【Demo】CSS3元素旋转、缩放、移动或倾斜
CSS3元素旋转.缩放.移动或倾斜 代码: <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- MAP 最大后验——利用经验数据获得对未观测量的点态估计
Map (最大后验) 在贝叶斯统计学中,最大后验(Maximum A Posteriori,MAP)估计可以利用经验数据获得对未观测量的点态估计.它与Fisher的最大似然估计(Maximum Lik ...
- form表单post请求保护 隐藏秘钥
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 接口测试工具Soapui5.1.2参数化之Properties20150924
上次用天气预报的来给大家演示了下如何创建项目.测试套件.测试用例的操作,今天演示下如何参数化,废话不多说,跟着操作即可: 1.在一个用例中有两个步骤,我们想将第一个步骤中的响应中的值,传入第二个步骤中 ...
- UVA11732 "strcmp()" Anyone?【左儿子右兄弟Trie】
LINK1 LINK2 题目大意 给你一些字符串,并定义了一个函数(具体见题面) 问你把任意两个字符串放到函数里面得到的值的和是多少 思路 该怎么统计答案呢? 每次考虑当前插入的串和所有已经插入过的串 ...