window窗口运行机制
window内部运行机制
- 窗口的使用
- 注册窗口类
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窗口运行机制相关推荐
- 真正理解微软Windows程序运行机制——窗口机制(第二部分)
我是荔园微风,作为一名在IT界整整25年的老兵,今天说说Windows程序的运行机制.经常被问到MFC到底是一个什么技术,为了解释这个我之前还写过帖子,但是很多人还是不理解.其实这没什么,我在学生时代 ...
- 真正理解微软Windows程序运行机制——窗口机制(第三部分)
我是荔园微风,作为一名在IT界整整25年的老兵,今天说说Windows程序的运行机制.经常被问到MFC到底是一个什么技术,为了解释这个我之前还写过帖子,但是很多人还是不理解.其实这没什么,我在学生时代 ...
- 真正理解微软Windows程序运行机制——窗口机制(第一部分)
我是荔园微风,作为一名在IT界整整25年的老兵,今天说说Windows程序的运行机制.经常被问到MFC到底是一个什么技术,为了解释这个我之前还写过帖子,但是很多人还是不理解.其实这没什么,我在学生时代 ...
- 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理
最近发现有不少介绍JS单线程运行机制的文章,但是发现很多都仅仅是介绍某一部分的知识,而且各个地方的说法还不统一,容易造成困惑. 因此准备梳理这块知识点,结合已有的认知,基于网上的大量参考资料,从浏览器 ...
- 钩子运行机制HOOK
转载 javanetc 代码频道 :http://www.javanetc.com/vc/vc_1749.html 基本概念 钩子(Hook)是Windows消息处理机制的一个平台,应用程序可以在上面 ...
- js中当等于最小值是让代码不执行_从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理...
前言 见解有限,如有描述不当之处,请帮忙及时指出,如有错误,会及时修正. ----------超长文+多图预警,需要花费不少时间.---------- 如果看完本文后,还对进程线程傻傻分不清,不清楚浏 ...
- web前端培训JS 运行机制的梳理
展现形式:由于是属于系统梳理型,就没有由浅入深了,而是从头到尾的梳理知识体系, 重点是将关键节点的知识点串联起来,而不是仅仅剖析某一部分知识. 内容是:从浏览器进程,再到浏览器内核运行,再到JS引擎单 ...
- javascript运行机制
阮一峰的网络日志 » 首页 » 档案 搜索 上一篇:乔布斯的管理课 下一篇:编译器的工作过程 分类: JavaScript JavaScript 运行机制详解:再谈Event Loop 作者: 阮一峰 ...
- JS 运行机制最全面的一次梳理
前端Q 我是winty,专注分享前端知识和各类前端资源,乐于分享各种有趣的事,关注我,一起做个有趣的人- 公众号 点击上方 前端Q,关注公众号 回复加群,加入前端Q技术交流群 最近发现有不少介绍JS单 ...
最新文章
- 【POJ1509】Glass Beads 【后缀自动机】
- Access中复制表
- (原創) 如何正確的使用迴圈(使用for_each)? (C/C++) (STL) (template)
- 大规模的服务器如何管理--批量管理工具
- python中bytes转int的实例
- wxWidgets:wxRichTextHTMLHandler 类用法
- 赛门铁克调研发现越来越多的物联网设备被用于实施DDoS攻击
- LNMT、LAMT架构简单实例
- 华为手机助手 linux,HiSuite-华为手机助手上线!从此再也不担心手机数据导不进Mac电脑啦!...
- 量化交易让股市成为你的印钞机
- 系统内存占用率高导致电脑卡顿的解决方案
- 10	计算并联电阻的阻值
- windows命令行XCOPY命令
- Oreo对A2DP codec的支持
- 在线网校安装简易迅捷入门安装教程
- 环境监测中标准气体使用问题的探讨
- 1-IMU参数解析以及选择
- 东软睿道培训费用python
- 解决由于Turn off RST问题导致无法安装ubuntu
- 关于“测试缺陷报告”日常总结
热门文章
- 注册页面(HTML+css)
- 车辆销售系统用例_销售模块用例图
- 北京奥运金牌榜珍藏(中国-51金及照片)
- 计算机启动显示不正确的分区表,电脑开机黑屏出现无效分区表的原因和解决方法...
- 20行代码爬取王者荣耀全英雄皮肤!让你享受白嫖的快乐!
- 2019版尚硅谷Java入门视频项目三中的个人出现的报错Cannot resolve symbol ‘PC‘解决方法 ——idea工具
- 体验Linux USB 驱动
- Windows10安装Graalvm
- android apk 防止反编译技术第三篇-加密
- RFID应用在地磅称重