window内部运行机制

  • 窗口的使用

    1. 注册窗口类
WNDCLASS 窗口类
wcex.cbSize = sizeof(WNDCLASSEX);     //结构体大小
wcex.style          = CS_HREDRAW | CS_VREDRAW;
//当横向和竖向发生拉伸就会发生重绘事件
wcex.lpfnWndProc    = WndProc;  //窗口回调函数
wcex.cbClsExtra     = 0;      //窗口类关联额外的空间
wcex.cbWndExtra     = 0;      //窗口关联的额外空间
wcex.hInstance      = hInstance; //当前程序实例
wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32PROJECT1));
//图标
wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
//光标,图形光标和等待光标
wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
//窗口的背景  画刷
wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_WIN32PROJECT1);
//菜单
wcex.lpszClassName  = szWindowClass;
//应用程序类名,FindWindow就是通过类名和窗口名获取
wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
//小图标的使用
* 这里需要注册窗口类
RegisterClassEx();

相当于主题应用,什么风格的窗口
2. 创建窗口

创建窗口类有12个
CreateWindow(szWindowClass, szTitle, WS_MINIMIZEBOX | WS_SYSMENU,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
3. 显示更新窗口
   ShowWindow(hWnd, nCmdShow);  //显示窗口UpdateWindow(hWnd);          //更新窗口
4. 消息循环
    while (GetMessage(&msg, NULL, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}
5. 处理消息
* 窗口处理函数就可以处理了
* window窗口消息* 进队消息* 进队消息是用户输入的结果,如键盘点击,鼠标移动,鼠标单击,时钟消息,刷新消息,退出消息* postMessage,将信息传入到队列* 不进队消息* 调用特定的window函数* CreateWindow 发送WM_CREATE* Invaildate  发送WM_PAINT* GetWindowText 发送WM_GETTEXT* sendMessage发送消息

* 入口函数

WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCmdLine,   int showCmd)
  • 注意

    • 表示没有使用下面的参数
    UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);
* 避免窗口大小改变
    case WM_NCHITTEST://该消息避免屏幕大小的变化break;

这个消息的原理就是在窗口外的点击放置到窗口内,那么你就无法通过拖动和拉伸来改变窗口的大小了
* 移动窗口到正中央

        GetWindowRect(hWnd, &rect);//获取窗口的大小,原因坐标系在左上方wndx = rect.right - rect.left;  //矩形右边-矩形左边==窗口的长度wndy = rect.bottom - rect.top; //矩形下边-矩形上边 == 窗口的高度//获取系统屏幕大小也就是我们的分辨率screenx = GetSystemMetrics(SM_CXSCREEN);screeny = GetSystemMetrics(SM_CYSCREEN);MoveWindow(hWnd, (screenx - wndx) / 2, (screeny - wndy) / 2, wndx, wndy, true);

实现原理:获取屏幕大小和窗口大小,将窗口的左上方放置到(屏幕-窗口)/2的位置上就可以了。

#include<windows.h>
#include<tchar.h>
#include "resource.h"
#define MAX 100
TCHAR className[MAX] = {0};
TCHAR wndTitle[MAX] = { 0 };
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
void initString(HINSTANCE hInstance)
{LoadString(hInstance, IDS_CLASSNAME, className, MAX);   //加载字符串LoadString(hInstance, IDS_WNDNAME, wndTitle, MAX);//MessageBox(NULL, className, wndTitle, MB_OK);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{initString(hInstance);//窗口初始化WNDCLASS wndc;wndc.cbClsExtra = 0;wndc.cbWndExtra = 0;wndc.style = CS_HREDRAW | CS_VREDRAW;//可以横向和竖向拉伸//背景图片wndc.hbrBackground = (HBRUSH)LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1));//wndc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);wndc.hCursor = LoadCursor(NULL, IDC_CROSS);wndc.hIcon = LoadIcon(NULL, IDI_ASTERISK);wndc.hInstance = hInstance;wndc.lpfnWndProc = WndProc;wndc.lpszClassName = className;wndc.lpszMenuName = NULL;//注册窗口类if (!RegisterClass(&wndc)){return -1;}//创建窗口类获取句柄HWND hwnd = CreateWindow(className, wndTitle, WS_VISIBLE | WS_OVERLAPPEDWINDOW, 0, 0, 500, 500, NULL, NULL, hInstance, NULL);//判断是否创建成功if (hwnd == NULL){/*MessageBox(NULL, className, wndTitle, MB_OK);*/return -1;}//显示更新窗口ShowWindow(hwnd, SW_SHOWNORMAL);UpdateWindow(hwnd);/*MessageBox(NULL, className, wndTitle, MB_OK);*///下面是消息循环MSG msg;while (GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;
}LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{RECT rect;int wndx, wndy;int clx, cly;int screenx, screeny;switch (message){case WM_CREATE://获取窗口大小GetWindowRect(hWnd, &rect);//获取窗口的大小,原因坐标系在左上方wndx = rect.right - rect.left;  //矩形右边-矩形左边==窗口的长度wndy = rect.bottom - rect.top; //矩形下边-矩形上边 == 窗口的高度//获取客户区域GetClientRect(hWnd, &rect);clx = rect.right - rect.left;cly = rect.bottom - rect.top;//获取系统屏幕大小也就是我们的分辨率screenx = GetSystemMetrics(SM_CXSCREEN);screeny = GetSystemMetrics(SM_CYSCREEN);MoveWindow(hWnd, (screenx - wndx) / 2, (screeny - wndy) / 2, wndx, wndy, true);//SetWindowPos(hWnd, NULL, (screenx - wndx-900) / 2, (screeny - wndy-636) / 2, 900 + wndx - clx, 636 + wndy - cly, 0);break;case WM_SIZE:break;//case WM_CLOSE://  ::DestoryWindow(hWnd);//  break;case WM_NCHITTEST://该消息避免屏幕大小的变化break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0;
}

window窗口运行机制相关推荐

  1. 真正理解微软Windows程序运行机制——窗口机制(第二部分)

    我是荔园微风,作为一名在IT界整整25年的老兵,今天说说Windows程序的运行机制.经常被问到MFC到底是一个什么技术,为了解释这个我之前还写过帖子,但是很多人还是不理解.其实这没什么,我在学生时代 ...

  2. 真正理解微软Windows程序运行机制——窗口机制(第三部分)

    我是荔园微风,作为一名在IT界整整25年的老兵,今天说说Windows程序的运行机制.经常被问到MFC到底是一个什么技术,为了解释这个我之前还写过帖子,但是很多人还是不理解.其实这没什么,我在学生时代 ...

  3. 真正理解微软Windows程序运行机制——窗口机制(第一部分)

    我是荔园微风,作为一名在IT界整整25年的老兵,今天说说Windows程序的运行机制.经常被问到MFC到底是一个什么技术,为了解释这个我之前还写过帖子,但是很多人还是不理解.其实这没什么,我在学生时代 ...

  4. 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理

    最近发现有不少介绍JS单线程运行机制的文章,但是发现很多都仅仅是介绍某一部分的知识,而且各个地方的说法还不统一,容易造成困惑. 因此准备梳理这块知识点,结合已有的认知,基于网上的大量参考资料,从浏览器 ...

  5. 钩子运行机制HOOK

    转载 javanetc 代码频道 :http://www.javanetc.com/vc/vc_1749.html 基本概念 钩子(Hook)是Windows消息处理机制的一个平台,应用程序可以在上面 ...

  6. js中当等于最小值是让代码不执行_从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理...

    前言 见解有限,如有描述不当之处,请帮忙及时指出,如有错误,会及时修正. ----------超长文+多图预警,需要花费不少时间.---------- 如果看完本文后,还对进程线程傻傻分不清,不清楚浏 ...

  7. web前端培训JS 运行机制的梳理

    展现形式:由于是属于系统梳理型,就没有由浅入深了,而是从头到尾的梳理知识体系, 重点是将关键节点的知识点串联起来,而不是仅仅剖析某一部分知识. 内容是:从浏览器进程,再到浏览器内核运行,再到JS引擎单 ...

  8. javascript运行机制

    阮一峰的网络日志 » 首页 » 档案 搜索 上一篇:乔布斯的管理课 下一篇:编译器的工作过程 分类: JavaScript JavaScript 运行机制详解:再谈Event Loop 作者: 阮一峰 ...

  9. JS 运行机制最全面的一次梳理

    前端Q 我是winty,专注分享前端知识和各类前端资源,乐于分享各种有趣的事,关注我,一起做个有趣的人- 公众号 点击上方 前端Q,关注公众号 回复加群,加入前端Q技术交流群 最近发现有不少介绍JS单 ...

最新文章

  1. 【POJ1509】Glass Beads 【后缀自动机】
  2. Access中复制表
  3. (原創) 如何正確的使用迴圈(使用for_each)? (C/C++) (STL) (template)
  4. 大规模的服务器如何管理--批量管理工具
  5. python中bytes转int的实例
  6. wxWidgets:wxRichTextHTMLHandler 类用法
  7. 赛门铁克调研发现越来越多的物联网设备被用于实施DDoS攻击
  8. LNMT、LAMT架构简单实例
  9. 华为手机助手 linux,HiSuite-华为手机助手上线!从此再也不担心手机数据导不进Mac电脑啦!...
  10. 量化交易让股市成为你的印钞机
  11. 系统内存占用率高导致电脑卡顿的解决方案
  12. 10 计算并联电阻的阻值
  13. windows命令行XCOPY命令
  14. Oreo对A2DP codec的支持
  15. 在线网校安装简易迅捷入门安装教程
  16. 环境监测中标准气体使用问题的探讨
  17. 1-IMU参数解析以及选择
  18. 东软睿道培训费用python
  19. 解决由于Turn off RST问题导致无法安装ubuntu
  20. 关于“测试缺陷报告”日常总结

热门文章

  1. 注册页面(HTML+css)
  2. 车辆销售系统用例_销售模块用例图
  3. 北京奥运金牌榜珍藏(中国-51金及照片)
  4. 计算机启动显示不正确的分区表,电脑开机黑屏出现无效分区表的原因和解决方法...
  5. 20行代码爬取王者荣耀全英雄皮肤!让你享受白嫖的快乐!
  6. 2019版尚硅谷Java入门视频项目三中的个人出现的报错Cannot resolve symbol ‘PC‘解决方法 ——idea工具
  7. 体验Linux USB 驱动
  8. Windows10安装Graalvm
  9. android apk 防止反编译技术第三篇-加密
  10. RFID应用在地磅称重