win32 button 可以设置icon大小

背景

记录一下win32编程,其实这种东西没有任何意义,只是回味一下win32编程,只是现在工具用的win32开发的,不想用第三方的界面库。

加载icon

方法一,这种无法设置icon的大小

    HICON folderico = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1));
    ::SendMessage(btn_control_home, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)folderico);

方法二,可以设置大小

    HANDLE new_image = LoadImage(NULL, L"res\\Power.ico", IMAGE_ICON, 28, 28, LR_LOADFROMFILE); 
    ::SendMessage(btn_control_power, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)new_image);

总结

win32 因为所有控件都是窗口,所以设置属性或者获取属性都是发送消息,但参数各式各样,这个谁记得住呢,所以才需要封装,点几个属性设置一下就可以了。。。所以win32界面开发的话,效率是过时的。如果不重要界面的话,那就无所谓。减少体积挺好的。

visual studio 运行库 mt md

我们经常运行软件的时候提示运行库缺失,导致程序运行不了,这个时候我们就要下载对应的运行库,这个运行就是c语言的运行库,提示缺失是因为我们编译程序的选择md ,C语言的运行库用的dll。那么必须系统带有运行库,否则运行失败,这样子我们采用2种做法,一种采用mt 静态编译,那么c语言库就在程序里面,要么我们自己把运行库直接放在程序里面,这样子也能正常运行。当初用动态编译是为了减少程序大小,感觉带了运行库,跟静态编译差别不打,如果小程序还是建议静态编译。

SendMessage WM_COPYDATA 拒绝错误

背景

SendMessage WM_COPYDATA 我们经常用来进程通信,今天突然改了一下代码加载方式,突然发现消息无法通信,我不断的通过打印日志来确定问题,最终觉得自己代码没有问题,但就是无法发送消息到另外一个进程。突然想到GetLastError() 看一下有什么错误,通过打印发现出现错误5,然后通过vs 带的错误查询,发现是拒绝错误。

解决方案

通过GetLastError, 我的脑海大概猜测是权限问题,于是搜索SendMessage WM_COPYDATA 拒绝错误,然后我找到这篇 https://blog.csdn.net/aa1991/article/details/19504557 ,固然验证是权限问题。如果是按照文章调用 ChangeWindowMessageFilter(WM_COPYDATA, 1); 就可以了

总结

排错需要更加系统化,尽可能了解不同知识点,更重要是思考方式,学会不断调节