第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程序的基本操作
随机推荐
- SQL server 2012 阻塞分析查询
最近公司的数据库并发有点大,由于CPU不高.内存不高.硬盘正常.网络也正常等等,但系统还是会卡,所以就怀疑是数据库阻塞导致的,于是去查询资料,看书及经过用以下sql观查,经过几天对数据的分析找到原因并 ...
- ros service
Server部分: #!/usr/bin/env python import sys import os import rospy #from beginner.srv import * from b ...
- Command(命令)
意图: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作. 适用性: 抽象出待执行的动作以参数化某对象,你可用过程语言中的回调(call ...
- JAVA-随机生成四则运算
代码如下: package jiajianchengchu; import java.util.*; public class jisuan { public static String yuefen ...
- __all__的作用
https://blog.csdn.net/orangleliu/article/details/49848413
- 关于浏览器的eventflow(capture and bubble up)
因为,没有全面的学习javascript,及其事件原理: 全占的课程:4-5 浏览器 Bubble Up 事件模型中 不是很理解它所讲的.网上查找相关知识点.记录中在博客中: 理解了JS的加载 htt ...
- UVA-1614 Hell on the Markets(贪心+推理) (有待补充)
题目大意:一个整数序列a,1≤a[i]≤i.问能否通过在一些元素前加上负号,使得整个序列和为0. 题目分析:贪心.贪心策略:每次都先选最大的元素加负号(或保留,不加负号). 贪心依据:对于1≤a[i] ...
- Struts2基本使用(二)--配置文件简述
配置文件简述 引入Struts2框架之后项目中多了一个struts.xml,以及web.xml也多了一些代码 web.xml只要的功能就是拦截用户的请求其多出的代码如下: <filter> ...
- maven编译报错 -source 1.5 中不支持 lambda 表达式(转)
原文链接:http://blog.csdn.net/kai161/article/details/50379418 在用maven编译项目是由于项目中用了jdk 1.8, 编译是报错 -source ...
- 论integer是地址传递还是值传递(转)
原文链接:http://blog.csdn.net/witsmakemen/article/details/46874717 论integer是地址传递还是值传递 Integer 作为传参的时候是地址 ...