MFC (微软基础类库),Windows系统平台做GUI尚且OK,但不支持跨平台。

//Windows消息机制:

//1.SDK与API

Software Development Kit,为特定软件框架,硬件平台,操作系统等建立应用软件的开发工具的集合;

Application Programming Interface,操作系统提供给应用程序编程的接口;

//2.窗口和句柄

窗口,一个Windows程序至少有一个主窗口;

句柄,在Windows应用程序中,窗口是通过窗口句柄(HWND)来标识的。我们要对某个窗口进行操作,首先要得到这个窗口的句柄;

//ps:系统在创建各种资源(窗口,图标...)会为他们分配内存,并返回标识这些资源的标识号,即句柄。eg:图标句柄(HICON),光标句柄(HCURSOR),画刷句柄(HBRUSH)

//3.消息与消息队列

Windows是一种事件驱动方式的程序设计模式,主要是基于消息。

//4.WinMain 函数——Windows程序的入口函数,相当于DOS程序的main

一个完整的Win32程序实现步骤:

  ·WinMain函数的定义

  ·创建一个窗口

  ·进行消息循环

  ·编写窗口过程

//环境:VS2013,实测:VS2017,TranslateMessage函数未找到。

#include <windows.h>//底层实现窗口的头文件

//回调函数
//CALLBACK 代表参数_stdcall参数的传递顺序:从右到左入栈,函数返回前清空栈
LRESULT CALLBACK WindowProc(
HWND hwnd,//消息所属窗口句柄
UINT uNsg,//具体消息名称 WM_XXX格式
WPARAM wParam,//键盘附加消息
LPARAM lParam) {//鼠标附加消息 switch (uNsg) { //所有以xxxWindow结尾的方法,不进入消息队列,直接执行
case WM_CLOSE:
DestroyWindow(hwnd);//DestroyWindow 发送另一个消息WM_DESTROY
break;
case WM_DESTROY:
PostQuitMessage();//调用while循环中的break
break; case WM_LBUTTONDOWN://鼠标左键按下
{
int xPos = LOWORD(lParam);
int yPos = HIWORD(lParam); char buf[];//显示在窗口内
wsprintf(buf, TEXT("x=%d,y=%d"), xPos, yPos);//实现字符拼接
MessageBox(hwnd, buf, TEXT("鼠标左键按下"), MB_OK);
break;
} case WM_KEYDOWN://键盘按下
MessageBox(hwnd, TEXT("键盘按下"), TEXT("键盘按下"), MB_OK);
break; case WM_PAINT://绘图
{
PAINTSTRUCT ps;//绘图结构体
HDC hdc = BeginPaint(hwnd, &ps);//开始
TextOut(hdc, , , TEXT("HELLO"), strlen("HELLO"));
EndPaint(hwnd, &ps);//结束
break;
}
} return DefWindowProc(hwnd, uNsg, wParam, lParam);
} //程序入口函数
//WINAPI 代表参数_stdcall参数的传递顺序:从右到左入栈,函数返回前清空栈
int WINAPI WinMain(
_In_ HINSTANCE hInstance, //应用程序实例句柄
_In_opt_ HINSTANCE hPrevInstance,//上一个应用程序句柄,一般为NULL
_In_ LPSTR lpCmdLine, //char* argv[]
_In_ int nShowCmd) { //显示命令,最大/小化 //1.设计窗口
WNDCLASS wc; wc.cbClsExtra = ; //类的额外内存
wc.cbWndExtra = ; //窗口的额外内存
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//设置背景色
wc.hCursor = LoadCursor(NULL, IDC_HAND);//设置光标手,null默认风格
wc.hIcon = LoadIcon(NULL, IDI_ERROR);//设置图标,null同上
wc.hInstance = hInstance;//传入WinMain中的形参
wc.lpfnWndProc = WindowProc;//回调函数,窗口过程
wc.lpszClassName = TEXT("WIN");//指定窗口类名称
wc.lpszMenuName = NULL;//菜单名称
wc.style = ;//默认风格 //2.注册窗口
RegisterClass(&wc); //3.创建窗口
HWND hwnd = CreateWindow(
wc.lpszClassName,//lpClassName 类名
TEXT("Windows"),//lpWindowName 标题名
WS_OVERLAPPEDWINDOW,//dwStyle 默认风格 混合模式
CW_USEDEFAULT,// x坐标
CW_USEDEFAULT,// y
CW_USEDEFAULT,//nWidth宽高
CW_USEDEFAULT,//nHeight
NULL,// hWndParent 父窗口
NULL,//hMenu 菜单
hInstance,// hInstance 实例句柄
NULL);//lpParam 附加值 鼠标左右键 //4.显示和更新
ShowWindow(hwnd, SW_SHOWNORMAL);//正常大小 UpdateWindow(hwnd); //5.通过循环取消息
/*
*typedef struct tagMSG {
* HWND hwnd; //主窗口句柄
* UINT message; //具体消息名称
* WPARAM wParam; //键盘消息 附加消息
* LPARAM lParam; //鼠标消息 附加消息
* DWORD time; //消息产生时间,系统自算
* POINT pt; //鼠标位置
*}
**/
MSG msg; while () {
/*
GetMessageW(
_Out_ LPMSG lpMsg, 消息
_In_opt_ HWND hWnd, 捕获窗口,NULL代表捕获所有窗口
_In_ UINT wMsgFilterMin,
_In_ UINT wMsgFilterMax);(0,0)代表捕获所有消息
*/
if (GetMessage(&msg, NULL, , ) == FALSE) {
break;
} //翻译消息 eg:键入Ctrl+C不可直接打印,需译后再次进入消息队列
TranslateMessage(&msg); DispatchMessage(&msg);//分发消息 } //6.处理窗口过程 up return ; }

我参考的视频链接:

https://www.bilibili.com/video/av20005978/?p=8&t=328

MFC/QT 学习笔记(一)——认识windows基础库的更多相关文章

  1. MFC/QT 学习笔记(二)——MFC入门

    MFC以C++形式封装了Windows API //实践 编写MFC需要的头文件#include <afxwin.h> 程序执行流程: 实例化应用程序对象(有且只有一个) 执行程序入口函数 ...

  2. MFC/QT 学习笔记(四)——MFC基于对话框学习控件(上)

    新建项目->MFC模板->MFC应用程序->应用程序类型:基于对话框->...OK 解决方案资源管理器->资源文件->xxx.rc->进入:资源视图-> ...

  3. MFC/QT 学习笔记(三)——MFC模板创建

    新建项目->MFC模板->MFC应用程序->应用程序类型:单个文档:项目样式:MFC 标准->下一步...OK 此时点击运行,可直接弹出窗口. 调整 视图->类视图: · ...

  4. MFC/QT 学习笔记(四)——MFC基于对话框学习控件(下)

    //5.列表控件 ListControl 属性 报表模式 view:Report:添加变量 //Cdemo5Dlg.cpp ps:资源视图 右键 类向导 成员变量 查看对象所属类 // TODO: 在 ...

  5. qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果

    应大家的要求,还是把完整的project文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看执行效果,我用的群创7寸屏 ...

  6. Linux 学习笔记之超详细基础linux命令 Part 14

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 13---------------- ...

  7. Linux 学习笔记之超详细基础linux命令 Part 9

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 8----------------- ...

  8. Linux 学习笔记之超详细基础linux命令 Part 7

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 6----------------- ...

  9. Linux 学习笔记之超详细基础linux命令(the end)

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 14---------------- ...

随机推荐

  1. 靶机-droopyCTF Walkthrough

    droopyCTF https://www.vulnhub.com/?q=droopy&sort=date-des&type=vm CTF镜像合集:https://www.vulnhu ...

  2. c#数字图像处理(十二)图像的腐蚀与膨胀

    背景知识 腐蚀与膨胀基本原理:就是用一个特定的结构元素来与待处理图像按像素做逻辑操作:可以理解成拿一个带孔的网格板(结构元素矩阵中元素为1的为孔)盖住图像的某一部分,然后按照各种不同的观察方式来确定操 ...

  3. Python3基础之初识Python

    Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序, 作为ABC语 ...

  4. linux--->ab测试工具使用

    ab测试工具使用 ab简介 是apache自带的压力测试工具.其原理是ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问.它的测试目标是基于URL的,因此,它既可以用来测试ap ...

  5. Python学习,第八课 - 函数

    本次讲解函数,由于内容比较多,小编列了个大纲,主要有一下内容: 1. 函数基本语法及特性 2. 函数参数 3.局部变量 4. 返回值 5.嵌套函数 6.递归 7.匿名函数 8.高阶函数 9.内置函数 ...

  6. Maven: 把聚合工程下的项目导入 Ecplise

    1.右键点击import 2.Import Existing Maven Projects 3.选择要导入的工程 4.完成

  7. 微信小程序没有找到可以构建的npm包

    如果是云开发小程序 ,cmd窗口进入到小程序根目录下的miniprogram目录, 输入npm init 输入包的相关属性,随便输入即可. 完成后会出现一个package.json文件. 如果是其他类 ...

  8. CodeBlocks 断点调试

    启动调试器 1. 一般,调试器的按钮可以在工具栏找到 如果没有,可以从view菜单项中调出 2. 设置断点 使用调试器时需要让程序在需要的位置中断,在启动调试器前设置断点如下,鼠标点击编辑器的左边即可 ...

  9. 暑假第一周总结(在centos虚拟机上安装jdk以及hadoop并对hadoop进行配置)

    本周主要就是对虚拟机进行安装并在上边安装jdk以及hadoop并对其进行配置. 在看林子雨老师的教程时,下载了老师所给的全套的下载软件,在安装时发现老师所给的VirtualBox安装后无法正常启动,尝 ...

  10. java工具类方法

    1.生成16位数字(当时日期时间加随机两位数) public static String getNo16() { String getNo = getNo(); return getNo.substr ...