windows编程中SendMessage函数是非常重要的,而且这个对于理解windows的消息机制也很重要。本文用代码的方式实现了一些功能,借以说明此函数之妙用。说明不当之处,希望批评指正,谢谢!

废话不多说了,代码说明了一切!!!

/*本程序主要为了演示SendMessage的用法,
*实现功能:
* --> 1: 完全去掉窗口标题栏和边框。
* --> 2: 在窗口客户区按住鼠标左键可以拖动窗口。
* --> 3: 每隔2秒变换一次窗口背景颜色。
* --> 4: 屏蔽Alt + F4组合键的关闭窗口功能。
* --> 5: 在窗口客户区双击鼠标左键,让窗口最大化。
* --> 6: 按钮实现的最大化窗口,最小化窗口,关闭窗口。
*
*/// 本程序在vs2012调试通过,保存文件时用cpp文件,用c++的方式编译。
#include<Windows.h>
#define ID_TIMER      1
#define WM_CHANGECOLOR (WM_USER + 1) // 自定义消息#define ID_COLOR      0
#define ID_MINIMIZE   1
#define ID_MAXIMIZE   2
#define ID_RESTORE    3
#define ID_FULLSCREEN 4
#define ID_CLOSE      5LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(HINSTANCE hInstace,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{WNDCLASS wndclass;wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);wndclass.hInstance = hInstace;wndclass.lpfnWndProc = WndProc;wndclass.lpszMenuName = NULL;wndclass.lpszClassName = TEXT("sunkang");RegisterClass(&wndclass);HWND hwnd = CreateWindow(TEXT("sunkang"),TEXT(""),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstace,NULL);ShowWindow(hwnd,SW_SHOWNORMAL);UpdateWindow(hwnd);MSG msg;while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}return 0;
}LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{static int cxClient,cyClient;static int cxScreen,cyScreen;static int btn_width,btn_height;static HBRUSH hBrush[5];static HWND hButton[6];static int indicator = 0; // 对应为红色switch(message){case WM_CREATE:{//得到应用程序实例句柄HINSTANCE hInstance = (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);COLORREF color[5] = {RGB(255,0,0),RGB(0,255,0),RGB(0,0,255),RGB(0,0,0),RGB(100,100,100)};TCHAR* title[6] = {TEXT("变换颜色"),TEXT("最小化"),TEXT("最大化"),TEXT("复位"),TEXT("全屏"),TEXT("关闭窗口")};for(int i = 0; i < 5; ++i)hBrush[i] = CreateSolidBrush(color[i]); // 创建画刷for(int i = 0; i < 6; ++i)hButton[i] = CreateWindow(TEXT("button"),title[i],WS_CHILDWINDOW | WS_VISIBLE | BS_DEFPUSHBUTTON,0,0,0,0,hwnd,HMENU(i),hInstance,NULL);SetTimer(hwnd,ID_TIMER,2000,0);  // 时间间隔为2秒cxScreen = GetSystemMetrics(SM_CXSCREEN); //静态变量cyScreen = GetSystemMetrics(SM_CYSCREEN); //静态变量SendMessage(hwnd,WM_CHANGECOLOR,0,0); // 改变一下背景颜色break;}case WM_SIZE:{cxClient = LOWORD(lParam); //静态变量cyClient = HIWORD(lParam); btn_width = cxClient / 6; //静态变量btn_height = cyClient / 5; for(int i = 0; i < 6; ++i) //依次设定button的位置MoveWindow(hButton[i],i * btn_width,0,btn_width,btn_height,TRUE);//具体看WM_CHANGECOLOR消息的实现break;}case WM_LBUTTONDOWN:{SendMessage(hwnd,WM_NCLBUTTONDOWN,HTCAPTION,lParam);break;}case WM_LBUTTONDBLCLK:{// 最大化窗口SendMessage(hwnd,WM_SYSCOMMAND,SC_MAXIMIZE,lParam);break;}case WM_TIMER:{//按照设定,时间间隔为2秒// 模拟鼠标的键击,点击"变换颜色"按钮SendMessage(GetDlgItem(hwnd,ID_COLOR),WM_LBUTTONDOWN,wParam,MAKELONG(btn_width / 2,btn_height / 2)); // 左键按下SendMessage(GetDlgItem(hwnd,ID_COLOR),WM_LBUTTONUP,wParam,MAKELONG(btn_width / 2,btn_height / 2)); // 左键释放// 键击位置为button中心// 可以看到每隔2秒窗口背景颜色会变换一次break;}case WM_CHANGECOLOR:{indicator = indicator == 4 ? 0 : indicator + 1;SetClassLong(hwnd,GCL_HBRBACKGROUND,LONG(hBrush[indicator]));InvalidateRect(hwnd,NULL,TRUE);UpdateWindow(hwnd);break;}case WM_COMMAND:{switch(LOWORD(wParam)){case ID_COLOR:SendMessage(hwnd,WM_CHANGECOLOR,wParam,lParam);break;case ID_MINIMIZE:SendMessage(hwnd,WM_SYSCOMMAND,SC_MINIMIZE,lParam);break;case ID_MAXIMIZE:SendMessage(hwnd,WM_SYSCOMMAND,SC_MAXIMIZE,lParam);break;case ID_RESTORE://下面这条语句要加上,不然会有点问题,这与windows内部保存的状态有关。SendMessage(hwnd,WM_SYSCOMMAND,SC_RESTORE,lParam);MoveWindow(hwnd,cxScreen / 8,cyScreen / 8,cxScreen * 3 / 4,cyScreen * 3 / 4,TRUE);break;case ID_FULLSCREEN://下面这条语句要加上,不然会有点问题,这与windows内部保存的状态有关。SendMessage(hwnd,WM_SYSCOMMAND,SC_RESTORE,lParam);MoveWindow(hwnd,0,0,cxScreen,cyScreen,TRUE);break;case ID_CLOSE:SendMessage(hwnd,WM_CLOSE,wParam,lParam);break;default:break;}SetFocus(hwnd); // 将焦点设为父窗口break;}case WM_CLOSE:{if(IDOK == MessageBox(hwnd,TEXT("确定退出吗?"),TEXT("关闭窗口"),MB_OKCANCEL | MB_ICONQUESTION))SendMessage(hwnd,WM_DESTROY,wParam,lParam);//当然也可以直接调用DestroyWindow(hwnd);break;}case WM_DESTROY:{KillTimer(hwnd,ID_TIMER);for(int i = 0; i < 5; ++i) //释放资源DeleteObject(hBrush[i]);PostQuitMessage(0);break;}case WM_NCCALCSIZE:{ //完全去掉标题栏和边框break;}case WM_SYSKEYDOWN:{if(GetKeyState(VK_F4) < 0) // 屏蔽Alt + F4 的关闭窗口功能break;elsereturn DefWindowProc(hwnd,message,wParam,lParam);}default:return DefWindowProc(hwnd,message,wParam,lParam);}return 0;
}

全屏效果的图片如下:

浅谈windows 编程中SendMessage函数的妙用!!!相关推荐

  1. html 怪异模式,CSS_浅谈CSS编程中的怪异模式,怪异模式盒模型 今天学习了 - phpStudy...

    浅谈CSS编程中的怪异模式 怪异模式盒模型 今天学习了一下css3的box-sizing属性,顺便又温习了一下css的盒模型,最后觉得有必要对盒模型做一个全面整理. 先不考虑css3的情况,盒模型一共 ...

  2. python程序调用写好的代码_扣丁学堂浅谈Python编程中NotImplementedError的使用方法...

    扣丁学堂浅谈Python编程中NotImplementedError的使用方法 2018-07-04 14:08:02 2559浏览 本篇文章扣丁学堂 Python编程中raise可以实现报出错误的功 ...

  3. 浅谈并行编程中的任务分解模式

     并行编程使用线程来使得多个操作能够同时运行.并行编程主要包括应用程序中线程设计,开发和部署以及线程间相互协调和各自的操作. 在下文中我们将讨论怎样分割适合线程化大小的编程任务来多任务化一个应用程 ...

  4. 浅谈软件编程中的8大数据结构

    文章目录 前言 一.为什么要研究数据结构 二.数据结构的分类 1.数组(Array) 2.链表(Linked List) 3.队列(Queue) 4.栈(Stack) 5.散列表(Hash) 6.树( ...

  5. java synthetic_浅谈Java编程中的synthetic关键字

    导读 正文 java synthetic关键字.有synthetic标记的field和method是class内部使用的,正常的源代码里不会出现synthetic field.小颖编译工具用的就是ja ...

  6. 浅谈asp木马中自定义函数加密的解密

    现在市面上流传了N种asp的大马.就是常说的webshell.有什么全免杀版本,什么提权加强版本.但是其中很多shell都是加密的,而且存在一些后门. 很有可能同学了忙了半天入侵了一个站,是为别人忙活 ...

  7. html怪异模式是什么,浅谈CSS编程中的怪异模式

    怪异模式盒模型 今天学习了一下css3的box-sizing属性,顺便又温习了一下css的盒模型,最后觉得有必要对盒模型做一个全面整理. 先不考虑css3的情况,盒模型一共有两种模式,一种是标准模式, ...

  8. 浅谈网络编程中的常见问题

    OSI七层模型 OSI七层协议模型主要是: 应用层(Application) 表示层(Presentation) 会话层(Session) 传输层(Transport) 网络层(Network) 数据 ...

  9. 单例设计模式java,浅谈Java编程中的单例设计模式

    写软件的时候经常需要用到打印日志功能,可以帮助你调试和定位问题,项目上线后还可以帮助你分析数据.但是Java原生带有的System.out.println()方法却很少在真正的项目开发中使用,甚至像f ...

最新文章

  1. 祝全天下的教师,节日快乐!
  2. 一条正确的Java职业生涯规划,顺利拿到offer
  3. Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)
  4. 朱宁:70%散户跑不赢大盘?因为机构利用了他们的错误
  5. flask项目从本地迁移到服务器上遇到net::ERR_CONNECTION_R问题
  6. 微观计量经济学_微观经济学与数据科学
  7. 为什么会有那么多人放弃编程?
  8. SQL Server where语句使用举例
  9. Hurst exponent(赫斯特指数)代码与R/S值计算——python
  10. Android如何通过shareduserid获取系统权限
  11. 【24】淘宝sdk——入门实战之左右悬浮模块
  12. ORA-01113问题的简单分析
  13. 炫酷好玩好用的卫星全景地图
  14. vue:如何设计网页的微信扫码登录功能
  15. Springboot+Mybatis接口快速上手
  16. 物理学的各种诡异现象
  17. Python+Selenium+Appium环境搭建
  18. 微信小程序——消息推送配置
  19. 用户与OA厂商:一荣俱荣,一损俱损
  20. python3_scrapy爬取腾讯视频“最新上架”影片信息

热门文章

  1. 逆向知识内存ARM常用的汇编指令合集
  2. NetToPlcSim_PLC_西门子PLC访问DEMO
  3. 个人对于区块链技术的理解
  4. 中望3D 2021 自动标注
  5. 第十届蓝桥杯(国赛)——拼接
  6. 计算机系统时间的修复,电脑时间总是不对,小编教你如何恢复正常
  7. alibaba/COLA 4.0框架 使用记录
  8. getSharedPreferences()与getSharedPreferences()与getDefaultSharedPreferences()的区别
  9. 最全面的常用Delphi第三方控件汇总—报表、图表、界面、数据库等
  10. 使用kubecm管理k8s多集群环境