2019年12月

资源ID管理插件

https://www.codeproject.com/Articles/1244/Resource-ID-Organiser-Add-In-for-Visual-C-5-0-6-0

 

新版本:

https://www.riverblade.co/products/resorg/downloads/

GTK For Windows下界面美化调优

1.安装相应的界面引擎:

mingw-w64-x86_64-gtk-engine-murrine

mingw-w64-x86_64-gtk-engines

mingw-w64-i686-gtk-engine-murrine

mingw-w64-i686-gtk-engines

2.安装一个Windows10的界面优化包,需要手工安装,下载地址:

https://github.com/B00merang-Project/Windows-10

将其中的gtk-2.0、gtk-3.0、gtk-3.20都拷贝到share/themes/Windows10目录下,Windows10目录需要自己建立

3.修改etc/gtk-2.0、etc/gtk-3.0,放入一个settings.ini文件,内容如下:

[Settings]gtk-theme-name=Windows10
gtk-font-name
=Segoe UI 9

mingw-w64及w32均有etc,都需要放一份

再启动GTK的程序,就能够看到界面已经漂亮多了

VC的编译器下,有好几个OS子系统宏,分别是:

WIN32/_WIN32/WIN64/_WIN64

其中WIN32是在windows.h中定义的

WIN64/_WIN64宏通常是通过工程文件配置预定义宏开关完成

其中_WIN32这个宏最特殊,属于没有定义会被强制定义,所有32位系统、64位系统下均有此宏定义

比如64位工程,编译时指定了WIN64/_WIN64,其实编译时会有三个宏

_WIN32/WIN64/_WIN64

因此,在区分OS类别时,则通常应该如此定义:

#if (defined _WIN64 || defined WIN64 || defined _WIN32 || defined WIN32 || defined WINCE)

#elif (defined ANDROID)

#else

#endif

区分64位的WINDOWS与32位,只能如此定义:

#if (defined _WIN64 || defined WIN64)

#elif (defined _WIN32 || defined WIN32)

#else

#endif

极容易踩到这个坑,定义这样:

#if (defined _WIN32 || defined WIN32)

#elif (defined _WIN64 || defined WIN64)

#else

#endif

 

CMakeLists.txt中可以指定多个目标,比如编译两个库:

add_library(xxx SHARED ............

add_library(yyy SHARED ............

 

而希望分别指定不同的编译开关,应在之前保存好相应的编译开关参数,比如:

set(CMAKE_xxx_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DONLY_SDK -std=c++11")
set(CMAKE_yyy_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -Dyyy_SDK -DONLY_SDK -std=c++11")

然后在add_library之后,使用set_target_properties修改目标的编译参数

set_target_properties(xxx PROPERTIES COMPILE_FLAGS ${CMAKE_xxx_CXX_FLAGS})

set_target_properties(yyy PROPERTIES COMPILE_FLAGS ${CMAKE_yyy_CXX_FLAGS})

 

c++ 模板中,提供了根据类型输出类型的值域范围类模板,即

limits中的numeric_limits类模板函数max和min

使用时,需要注意,容易与C语言的宏定义min/max冲突

此时有几种解决办法:

1.先取消min/max的宏定义,使用完后恢复

如下:

 

#ifdef min#define __save_min
#undef min
#endif#ifdef max#define __save_max
#undef max
#endiftemplate<typename T = unsigned int>
classXNumberLimit
{
public:staticT get_min()
{
return std::numeric_limits<T>::min();
}
staticT get_max()
{
return std::numeric_limits<T>::max();
}
};

#ifdef __save_min
#define min(a, b) (((a) < (b)) ? (a) : (b)) #undef __save_min #endif#ifdef __save_max#define max(a, b) (((a) > (b)) ? (a) : (b)) #undef __save_max #endif

第二种办法,将min/max使用括号括起来,这样就可以绕开C语言的宏函数判断了

(std::numeric_limits<T>::min)();
(std::numeric_limits
<T>::max)();