1. GUI用户界面元素

(1)操作系统提供了创建用户界面元素所需要的函数

(2)各种功能不同的函数依次调用,从而创建出界面元素

(3)操作系统提供的原生函数无法直接映射到界面元素

2. 面向对象的GUI程序设计

(1)GUI应用程序是为了解决非科学计算问题而诞生的

(2)GUI应用程序适用于非专业的日常生活领域

(3)面向过程程序设计方法学不适合GUI程序设计

(4)面向对象程序设计方法学更适合GUI程序设计

3. 另一种眼界

(1)用面向对象方法学看待GUI界面元素

(2)所有界面元素都可以看作实际的对象

(3)GUI用户界面是由各不相同的对象组成的(如菜单对象、按钮对象、文本框对象等)

(4)用面向对象的思想开发GUI应用程序(界面元素对应哪些类?)

  ①将界面元素定义为对应的

  ②通过抽象和封装可以隐藏界面元素的细节

  ③程序的创建过程就是组合不同界面元素对象的过程

【实例分析】面向对象的方法创建GUI程序

//Main.cpp

#include <windows.h>
#include "Application.h"
#include "MainWindow.h"
#include "PushButton.h" BOOL WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
Application a(hInstance, lpCmdLine); MainWindow w(hInstance, L"Main Window");
PushButton b(&w, L"My Button"); w.show(); return a.exec();
}

//Application.h

#pragma  once

#include <windows.h>

class Application
{
public:
Application(HINSTANCE hInstance, LPSTR lpCmdLine);
bool exec();
};

//Application.cpp

#include "Application.h"

Application::Application(HINSTANCE hInstance, LPSTR lpCmdLine)
{ } bool Application::exec()
{
MSG msg = { }; //进入消息循环
while ( GetMessage(&msg, NULL, , ))
{
//翻译并转换系统消息
TranslateMessage(&msg); //分发消息到对应的消息处理函数
DispatchMessage(&msg);
} return TRUE;
}

//Widget.h

#pragma  once

#include <windows.h>

class Widget
{
protected:
Widget* m_parent;
HWND m_hwnd;
public:
Widget();
Widget(Widget* parent);
HWND hwnd();
Widget* parent();
};

//Widget.cpp

#include "Widget.h"

Widget::Widget()
{
m_parent = NULL;
} Widget::Widget(Widget* parent)
{
m_parent = parent;
} HWND Widget::hwnd()
{
return m_hwnd;
} Widget* Widget::parent()
{
return m_parent;
}

//MainWidow.h

#pragma once

#include "Widget.h"

class MainWindow : public Widget
{
protected:
static const wchar_t STYLE_NAME[]; //主窗口定义
BOOL DefineMainWindow(HINSTANCE hInstance);
//主窗口创建
void CreateMainWindow(HINSTANCE hInstance, const wchar_t* title);
//主窗口消息处理函数
static LRESULT CALLBACK WndProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam); public:
MainWindow(HINSTANCE hInstance, const wchar_t* title);
void show();
};

//MainWindow.cpp

#include "MainWindow.h"

const wchar_t MainWindow::STYLE_NAME[] = L"MainForm";

//主窗口定义
BOOL MainWindow::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);
} //主窗口创建
void MainWindow::CreateMainWindow(HINSTANCE hInstance, const wchar_t* title)
{
m_hwnd = CreateWindow(STYLE_NAME, //通过定义好的窗口样式创建主窗口
title, //主窗口标题
WS_OVERLAPPEDWINDOW,//创建后主窗口的显示风格
CW_USEDEFAULT, //主窗口左上角x坐标
CW_USEDEFAULT, //主窗口左上角y坐标
CW_USEDEFAULT, //主窗口宽度
CW_USEDEFAULT, //主窗口高度
NULL, //父窗口
NULL, //主窗口菜单
hInstance, //主窗口属于当前应用程序
NULL);
} //主窗口消息处理函数
LRESULT CALLBACK MainWindow::WndProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage();
break;
default:
//调用系统提供的默认消息处理函数
return DefWindowProc(hWnd, message, wParam, lParam);
} return ;
} MainWindow::MainWindow(HINSTANCE hInstance, const wchar_t* title) :Widget(NULL)
{
DefineMainWindow(hInstance); CreateMainWindow(hInstance, title);
} void MainWindow::show()
{
ShowWindow(m_hwnd, SW_SHOWNORMAL); //显示窗口
UpdateWindow(m_hwnd); //刷新窗口
}

//PushButton.h

#pragma  once

#include "Widget.h"

class PushButton : public Widget
{
public:
PushButton(Widget* win, const wchar_t* text);
};

//Pushbutton.cpp

#include "PushButton.h"

PushButton::PushButton(Widget* win, const wchar_t* text)
{
HINSTANCE hInstance = (HINSTANCE)GetWindowLong(win->hwnd(), GWL_HINSTANCE); m_hwnd = CreateWindow(L"button", //通过系统预定义的窗口样式创建元素
text, //窗口元素标题
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,//创建后窗口元素的显示风格
, //窗口元素在主窗口左上角x坐标
, //窗口元素在主窗口左上角y坐标
, //窗口元素宽度
, //窗口元素高度
win->hwnd(), //父窗口
(HMENU)this, //窗口元素ID值
hInstance, //窗口元素属于当前应用程序
NULL);
}

4. QT的本质

(1)QT是利用面向对象方法学开发的一套GUI组件库

(2)QT将不同操作系统的GUI细节封装于类的内部

(3)QT提供一套跨平台的类,用于开发GUI程序

(4)QT遵循经典的GUI应用程序开发模式

5. 小结

(1)GUI程序开发更适合采用面向对象方法学

(2)所有的界面元素都可以看作实际的对象

(3)GUI用户界面是由各不相同的对象组成的

(4)QT是利用面向对象方法学开发的一套GUI组件库

(5)QT将GUI细节封装于类的内部,具有跨平台的特性

第3课 QT的诞生和本质的更多相关文章

  1. Qt的诞生和本质

    有没有发现,在这个主函数里面没有了消息循环了.消息循环到哪里去了呢? 我们知道,每个GUI应用程序都有消息循环,一般都需要将消息循环while那个函数写到main的最后位置.那既然如此,为了代码复用, ...

  2. 第32课 Qt中的文件操作

    1. Qt的中IO操作 (1)Qt中IO操作的处理方式 ①Qt通过统一的接口简化了文件和外部设备的操作方式 ②Qt中的文件被看作一种特殊的外部设备 ③Qt中的文件操作与外部设备的操作相同 (2)IO操 ...

  3. 第30课 Qt中的文本编辑组件

    1. 3种常用的文本编辑组件的比较 单行文本支持 多行文本支持 自定义格式支持 富文本支持 QLineEdit (单行文本编辑组件) Yes No No No QPlainTextEdit (多行普通 ...

  4. 第5课 Qt Creator工程介绍

    1. QT Creator工程管理(一个工程包含不同类型的文件) (1).pro项目文件 (2).pro.user用户配置描述文件 (3).h头文件 (4).cpp源文件 (5).ui界面描述文件 ( ...

  5. 第54课 Qt 中的多页面切换组件

    1. 多页面切换组件(QTabWidget) (1)能够在同一个窗口中自由切换不同页面的内容 (2)是一个容器类型的组件,同时提供友好的页面切换方式 2. QTabWidget的使用方式 (1)在应用 ...

  6. 第47课 Qt中的调色板

    1. QPalette类 (1)QPalette类提供了绘制QWidget组件的不同状态所使用的颜色. (2)QPalette对象包含了3个状态的颜色描述 ①激活颜色组(Active):组件获得焦点使 ...

  7. 第39课 Qt中的事件处理(下)

    1. 事件的传递过程 (1)操作系统检测到用户动作时,会产生一条系统消息,该消息被发送到Qt应用程序 (2)Qt应用程序收到系统消息后,将其转化为一个对应的QEvent事件对象,并调用QObject: ...

  8. 第38课 Qt中的事件处理(上)

    1. GUI程序原理回顾 (1)图形界面应用程序的消息处理模型 (2)思考:操作系统发送的消息如何转变为Qt信号 2. Qt中的事件处理 (1)Qt平台将系统产生的消息转换为Qt事件 ①Qt事件是一个 ...

  9. 第11课 Qt中的字符串类

    1. 历史遗留问题和解决方案 (1)历史遗留问题 ①C语言不支持真正意义上的字符串 ②C语言用字符数组和一组函数实现字符串操作 ③C语言不支持自定义类型,因此无法获得字符串类型 (2)解决方案 ①从C ...

随机推荐

  1. php 数值数组遍历

    <?php $cars=array("Volvo","BMW","Toyota"); $arrlength=count($cars); ...

  2. Adapter Class/Object(适配器)

    意图: 将一个类的接口转换成客户希望的另外一个接口.Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适用性: 你想使用一个已经存在的类,而它的接口不符合你的需求. 你想 ...

  3. [html5]HTML5中<section>和<article>的区别

    一.section元素 从字面理解就是区块.部分的意思,相对于article元素更加广泛,每个区块都可以使用,比如页面里的导航菜单.文章正文.文章的评论等. 1.section元素用于对网站或应用程序 ...

  4. 伪多项式时间 Pseudo-polynomial time

    2018-03-15 14:20:08 伪多项式时间:如果一个算法的传统时间复杂度是多项式时间的,而标准时间复杂度不是多项式时间的,则我们称这个算法是伪多项式时间的. 想要理解“伪多项式时间”,我们需 ...

  5. C# SQLite事务操作方法分析

    本文实例讲述了C# SQLite事务操作方法.分享给大家供大家参考,具体如下: 在 C#中执行Sqlite数据库事务有两种方式:SQL代码和C#代码 1. SQL代码: BEGIN… COMMIT / ...

  6. PowerDesigner16工具学习笔记-建立BPM

    根据不同用途,BPM分为分析性(Analysis).执行型(Executable)和协作型(Collaborative) BPM的类型 业务流程语言 描述  分析型  Analysis  提供流程层次 ...

  7. MySQL使用和操作总结(《MySQL必知必会》读书笔记)

    简介 MySQL是一种DBMS,即它是一种数据库软件.DBMS可分为两类:一类是基于共享文件系统的DBMS,另一类是基于客户机——服务器的DBMS.前者用于桌面用途,通常不用于高端或更关键应用. My ...

  8. mysql-connect-odbc连接

  9. 001PHP文件处理——文件处理disk_total_space disk_free_space basename dirname file_exists filetype

    <?php /** * 文件处理disk_total_space disk_free_space basename dirname file_exists filetype */ //disk_ ...

  10. 008——php字符串中的处理函数(七)

    <?php /** *字符串处理函数(六)get_magic_quotes_runtime set_magic_quotes_runtime strip_tags *get_magic_quot ...