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. ping 原理与ICMP协议[转]

    原文:http://blog.csdn.net/inject2006/article/details/2139149 ping 的原理     ping 程序是用来探测主机到主机之间是否可通信,如果不 ...

  2. 201621123006 《Java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...

  3. SqlServer缓存依赖 示例

    ------------------------------------------------------------c#代码----------------------using System; ...

  4. adb命令安装apk

    1.将需要安装的apk放在platform-tools下 2.将手机和电脑连接,在cmd中输入 adb devices查看 3.使用adb命令安装apk,在cmd中输入:adb install apk ...

  5. jenkins配置maven

    # 去官网下载maven # 安装 cd /opt wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.5.3/binari ...

  6. 《DSP using MATLAB》Problem 2.14

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  7. 前后端分离之让前端开发脱离接口束缚(mock)

    情景:     领导:小吴啊,最近在忙什么啊?     前吴:(心想:我擦勒,难道划水被领导发现了?也不能怪我啊,后台的哥们接口还没给呢,但要是实话实说不就对不起后台哥们了吗?)           ...

  8. 洛谷 P1039侦探推理

    /* 枚举罪犯和星期几,那么所有人说的话是真是假一目了然. 首先一个人不能既说真话又说假话. 即: I am guilty. I am not guilty. 因为非真即假,所以直接判断impossi ...

  9. WF从入门到精通学习目录

    WF从入门到精通(第一章):WF简介 WF从入门到精通(第二章):workflow运行时 WF从入门到精通(第三章):workflow实例 WF从入门到精通(第四章):活动及workflow类型介绍 ...

  10. TVS 选型

    TVS 选型 主要用于 IO 保护 TVS 的电压不要小于正常工作的电压,不然会影响正常工作. ESD 的电压很高,但是时间很短. TVS 有节电容,用于高速线路时要注意. 有双向的,也有单向的,还有 ...