win32+wtl开发速成总结

前言

任务要求使用到windows展现界面,因此速成学习了一段时间,在此做下总结。

以后写工具可以迅速使用win界面速成一个图形界面。这样很方便使用!

资料:
《Windows程序设计(第5版)》
MSDN
Stack Overflow

基本的win32开发

核心设计理念:
windows给程序发送消息,调用api是程序向win发送消息。

句柄:指向结构体的指针。具体结构体与资源的关系暂为猜测。句柄一般代表着系统资源对象。

命名:一般变量-小写字母开头表示类型,然后单词首字母大写。结构体变量-结构体小写形式开头或全部名。

编码:所有调用、字串使用T即可,可根据项目设定化为utf或多字节,编码与存储无关,存储的话一律用string。
不论什么编码一律用string,存的是字节,方便处理,不同编码接口处解析为不同的即可,特别是针对windows程序。仅在图形界面接口处转化存储格式或编码格式。推荐使用utf-8
关于编码处理:
https://blog.csdn.net/charlessimonyi/article/details/8722859
只要读的时候都用string读,在win界面上显示的时候转化为多字节或utf-16显示即可
windows显示的时候都是俩套api,显示的数据格式是宽字符或者多字节、显示的编码使用系统默认:图形下是UTF-16与GBK
windows的字符转化是将字符串映射到UTF-16(宽字符)字符串。来源的编码任意。或将UTF-16(宽字符)字符串映射到新字符串。新字符集编码任意可指定
因此读取utf-8(为不定字节编码),输出时转化为utf-16的宽字符即可输出。

基本信息注册:为了分阶段、部分信息重用,Create时已经填满了全部所需信息所以分配内存出来句柄了。
RegisterClassEx是窗口的注册,指定画刷、基本支持等,控件是系统注册好的。
这个是创建窗口类型,下面是用窗口类型创建窗口。
消息处理函数与窗口类型绑定

内部创建
CreateWindowEx提供了创建窗口所需的全部内容,在图内创建list、tree也只需要用它提供的定义即可。因为其指定了父、基于父的位置,大小等信息。

显示:此时用画刷擦好
ShowWindow(hWnd, nCmdShow);

重绘:此时发出重绘消息重绘
UpdateWindow(hWnd); 发送WM_PAINT消息。当部分或全部需要重绘时也会发送该消息。

经典的消息循环: 这个过程是自己在用代码驱动事件响应,系统只是负责传输和分发到具体的位置

1
2
3
4
5
6
7
8
9
10
11
//获取消息 000表示该线程全部消息
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
//转化
TranslateMessage(&msg);
//发给windows 让其分发到合适的窗口
DispatchMessage(&msg);
}
}

由于父创建的窗口消息可以部分或全部由父处理。基于此实现控件。
具体实现就是将子窗口的消息过程中调用SendMessage向父发送交由父处理,这种模式使子窗口预定义成为控件。
因此控件直接create就行。

消息是同步、有序的方式处理的,绑定线程,不会被打断。当窗口过程返回后DispatchMessage才返回,WM_PAINT处理完UpdateWindow才返回。

控件:
控件已经有系统注册好,并有预定义的名称,直接调用createWindow即可。
可以直接在对话框里当资源拖或者用代码在正常窗口中构造。
用MoveWindow调整其位置和大小。
并提供了方法可以父窗口将消息发送给子控件,来控制子控件。

用对话框使用控件更高层,因为处理了tab等焦点问题。

注册表实际上是一个层次型数据库,用来储存系统和应用的海量配置信息

其它坑

Runtime Library
MT MTd MD MDd 代表着win下运行库的选择
静态/动态*debug/relese
项目与库均需使用一种指示,
经测试组合冲突发生无特定规律….
目前还没试出来哪个组合会发生冲突..

cpp 类成员变量默认初始化,基本类型与类对象区别对待,基本类型与在类外一样-看具体位置获取初始值-即初始值不定。

wtl界面库

微软员工内部维护的图形库,基于ATL封装。使用只需添加一些.h文件

使c式的win32应用面向对象封装,并提供了大量方便的功能与宏封装,便于高效开发。

win32的资源通过rc文件建立id与具体文件的索引关系。

创建SDI:

  1. 派生框架类
  2. 宏指定工具条与菜单资源ID
  3. 添加消息处理

对话框创建时链接控件资源只需要:m_wndList.Attach ( GetDlgItem(IDC_LIST) );即可。

速成开发

熟悉基本概念后,直接使用wtl以对话框为view构建引导程序。之后使用控件拖拽速成界面,处理下size,主要消息可直接在控件消息处点击添加。
之后具体使用的控件消息、方法、结构体只需要MSDN+google+Stack Overflow即可解决。

VS 开发ide中的航空母舰…win自家的开发更是不要更爽…F1直接看文档

一些有点忘了的内容

使用lib需注意两个文件:
(1).h头文件,包含lib中说明输出的类或符号原型或数据结构。应用程序调用lib时,需要将该文件包含入应用程序的源文件中。
(2).LIB文件,静态链接库
就是linux的a,一个lib文件实际上也是任意个obj文件的集合

使用dll需注意三个文件:
(1).h头文件,包含dll中说明输出的类或符号原型或数据结构的.h文件。应用程序调用dll时,需要将该文件包含入应用程序的源文件中。
(2).LIB文件,是dll在编译、链接成功之后生成的文件,作用是当其他应用程序调用dll时,需要将该文件引入应用程序,用于带入dll的实现。如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载。
(3).dll文件,真正的可执行文件,开发成功后的应用程序在发布时,只需要有.exe文件和.dll文件,并不需要.lib文件和.h头文件。
就是linux的so

文件格式与elf类似,暂不详细分析..

项目

内部项目使用的logcat

地址:

数据分析展示工具

一个可自定义数据格式、自定义过滤条件、自定义数据展示的应用

地址:https://github.com/imbaya2466/AnyLog