第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程序的基本操作
随机推荐
- php while循环
<html> <body> <?php $i=; ) { echo "The number is " . $i . "<br>& ...
- 局域网内web地图的简单实现
首先,我先说一下这次的主要目的.我们的想法是在不连互联网的局域网中搭起来一个地图服务,类似于百度地图的网页版本,功能最少要有看地图.放缩.标记.批量标记.实时经纬度坐标.这个东西还是让我费了一番力气( ...
- openfalcon源码分析之hbs
openfalcon源码分析之hbs 本节内容 hbs功能 hbs源码分析 hbs设计优劣 1. hbs功能 hbs在整个open-falcon项目中承担的角色就是连接数据库,作为数据库缓存,缓存配置 ...
- Linux 需要掌握的一些命令
详情: 1. tar 创建一个新的tar文件 $ tar cvf archive_name.tar dirname/ 解压tar文件 $ tar xvf archive_name.tar 查看tar文 ...
- avast! 2014正式版下载
avast!官方简体中文网站: http://www.avast.com/zh-cn/index avast!官方英文网站: http://www.avast.com/index avast!免费版官 ...
- composer update 提示 username
解决办法 暂时修改composer.json "repositories": { "packagist": { "type": " ...
- Winform创建解决方案
Winform的开发工具可以使用VS2005---VS2013,版本在不断升级,VS的功能也越来越强大.本系列文章采用VS2012(以后全称VS)演示. 窗体是winform开发的基础,需要掌握窗体的 ...
- cousera 深度学习 吴恩达 第一课 第二周 学习率对优化结果的影响
本文代码实验地址: https://github.com/guojun007/logistic_regression_learning_rate cousera 上的作业是 编写一个 logistic ...
- ScrollView的基本用法丶代理方法
属性: - (void)viewDidLoad { [super viewDidLoad]; _scrollView.backgroundColor = [UIColor redColor]; //设 ...
- Win2D 中的游戏循环:CanvasAnimatedControl
Win2D 是 DirectX 的一个高层封装,提供了极大 DirectX 性能的同时,又具有很好用的 API 设计. 用 Win2D 除了能做出高性能的视觉效果之外,还可以轻而易举地搭建一个游戏循环 ...