Windows程序设计——窗口键盘消息滚动事件[通俗易懂]

Windows程序设计——窗口键盘消息滚动事件[通俗易懂]设置头文件#include <Windows.h>#include “systems.h”以下是头文件内容#pragma once#include <Windows.h>#define NUMLINES ((int)(sizeof sysmetrics/sizeof sysmetrics[0]))struct { int Index; char sz…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

文章目录

头文件

#pragma once
#include <Windows.h>

#define NUMLINES ((int)(sizeof sysmetrics/sizeof sysmetrics[0]))

struct { 
   
	int Index;
	char szLabel[100];	//第一列内容
	char szDesc[50];	//第二列内容
}sysmetrics[] = { 
   
SM_CXSCREEN,"各位同学大家好","官方标准提示数据",
SM_CYSCREEN,"C/C++高级工程师","官方标准发布版本"
};

NUMLINES 宏定义是为了得到sysmetrics的数量

源文件

#include <Windows.h>
#include "systems.h"

LRESULT CALLBACK WndProcFun(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{ 
   
	static TCHAR szAppName[] = TEXT("CKDemoTest");
	HWND hwnd;
	MSG msg;
	WNDCLASS windclass;

	windclass.style = CS_HREDRAW | CS_VREDRAW;
	windclass.lpfnWndProc = WndProcFun;
	windclass.cbClsExtra = 0;
	windclass.cbWndExtra = 0;
	windclass.hInstance = hInstance;
	windclass.hIcon = NULL;
	windclass.hCursor = LoadCursor(NULL, IDC_ARROW);
	windclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	windclass.lpszMenuName = NULL;
	windclass.lpszClassName = szAppName;

	if (!RegisterClass(&windclass))
	{ 
   
		// 提示信息自己完成 
		return 0;
	}

	hwnd = CreateWindow(szAppName, TEXT("第五讲 键盘控制窗口垂直水平滚事件"), WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

	ShowWindow(hwnd, iCmdShow);
	UpdateWindow(hwnd);

	while (GetMessage(&msg, NULL, 0, 0)) { 
   
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;

}


LRESULT CALLBACK WndProcFun(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{ 
   
	static int cxChar, cxCaps, cyChar, cxClient, cyClient, iMaxWidth;
	HDC hdc;
	int i, x, y, iVertPos, iHorzPos=0, iPaintBeg, iPaintEnd;
	PAINTSTRUCT ps;
	SCROLLINFO si;
	TCHAR szBuffer[20];
	TEXTMETRIC tm;

	switch (message)
	{ 
   
	case WM_CREATE:  // 应用程序创建一个窗口
		hdc = GetDC(hwnd);
		GetTextMetrics(hdc, &tm);
		cxChar = tm.tmAveCharWidth;
		cyChar = tm.tmHeight + tm.tmExternalLeading;
		cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2)*cxChar / 2;
		ReleaseDC(hwnd, hdc);

		// 保存三列宽度
		iMaxWidth = 40 * cxChar + 22 * cxCaps;
		return 0;

	case WM_SIZE:	// 改变一个窗口的大小
		cxClient = LOWORD(lParam);
		cyClient = HIWORD(lParam);

		// 设置垂直滚动条范围 和 页面大小
		si.cbSize = sizeof(si);

		// SIF_RANGE 设置滚动范围值
		// SIF_PAGE 设置滚动页码
		si.fMask = SIF_RANGE | SIF_PAGE;
		si.nMin = 0;
		si.nMax = NUMLINES - 1;
		si.nPage = cyClient / cyChar;
		// SB_VERT 设置所给定的窗体上标准垂直滚动条参数
		SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
		return 0;

	case WM_PAINT:
		hdc = BeginPaint(hwnd, &ps);

		// 获取垂直滚动条位置
		si.cbSize = sizeof(si);
		si.fMask = SIF_POS;
		GetScrollInfo(hwnd, SB_VERT, &si);
		iVertPos = si.nPos;

		// 查找绘制限制
		iPaintBeg = max(0, iVertPos + ps.rcPaint.top / cyChar);
		iPaintEnd = min(NUMLINES - 1, iVertPos + ps.rcPaint.bottom / cyChar);

		for (i = iPaintBeg; i <= iPaintEnd; i++)
		{ 
   
			x = cxChar * (1 - iHorzPos);
			y = cyChar * (i - iVertPos);

			TextOut(hdc, x, y, sysmetrics[i].szLabel, lstrlen(sysmetrics[i].szLabel));
			TextOut(hdc, x+80*cxCaps, y, sysmetrics[i].szDesc, lstrlen(sysmetrics[i].szDesc));
			SetTextAlign(hdc, TA_RIGHT | TA_TOP);		// 指定设备环境设置文字对齐标志

			TextOut(hdc, x + 100 * cxCaps + 40 * cxChar, y, szBuffer, wsprintf(szBuffer, TEXT("%d"), GetSystemMetrics(sysmetrics[i].Index)));
			SetTextAlign(hdc, TA_LEFT | TA_TOP);
		}

		EndPaint(hwnd, &ps);
		return 0;

	case WM_KEYDOWN:
		switch (wParam)
		{ 
   
		case VK_HOME:   // Home
			SendMessage(hwnd, WM_VSCROLL, SB_TOP, 0);	// 消息发送到一个或多个窗口
			break;

		case VK_END:	// End
			SendMessage(hwnd, WM_VSCROLL, SB_BOTTOM, 0);
			break;

		case VK_PRIOR:	// Page Up
			SendMessage(hwnd, WM_VSCROLL, SB_PAGEUP, 0);
			break;

		case VK_NEXT:	// Page Down
			SendMessage(hwnd, WM_VSCROLL, SB_PAGEDOWN, 0);
			break;

		case VK_UP:	// 箭头向上
			SendMessage(hwnd, WM_VSCROLL, SB_LINEUP, 0);
			break;

		case VK_DOWN:	// 箭头向下
			SendMessage(hwnd, WM_VSCROLL, SB_LINEDOWN, 0);
			break;
		}
		return 0;

	case WM_VSCROLL:
		// 获取所有垂直滚动条信息
		si.cbSize = sizeof(si);
		si.fMask = SIF_ALL;	// 整个结构都有效
		GetScrollInfo(hwnd, SB_VERT, &si);		// SB_VERT 设置所绽的窗口上标准垂直滚动条参数

		iVertPos = si.nPos;

		switch (LOWORD(wParam))
		{ 
   
		case SB_TOP:
			si.nPos = si.nMin;
			break;

		case SB_BOTTOM:
			si.nPos = si.nMax;
			break;

		case SB_LINEUP:
			si.nPos -= 1;
			break;

		case SB_LINEDOWN:
			si.nPos +=1;
			break;

		case SB_PAGEUP:
			si.nPos -= si.nPage;
			break;

		case SB_PAGEDOWN:
			si.nPos += si.nPage;
			break;

		case SB_THUMBTRACK:
			si.nPos = si.nTrackPos;
			break;

		default:
			break;

		}
		si.fMask = SIF_POS;
		SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
		GetScrollInfo(hwnd, SB_VERT, &si);

		// 如果位置已经更改,滚动窗口并且进行更新
		if (si.nPos != iVertPos)
		{ 
   
			ScrollWindow(hwnd, 0, cyChar*(iVertPos - si.nPos), NULL, NULL);
			UpdateWindow(hwnd);
		}

		return 0;

	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}

	return DefWindowProc(hwnd, message, wParam, lParam);
}


运行结果只能垂直滚动,水平滚动参考即可,

不懂得可以留言,希望可以帮助到各位朋友。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/171006.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Eurake配置心得

    Eurake配置心得server:port:10086spring:application:name:ly-registryeureka:client:fetch-registry:falseregister-with-eureka:falseservice-url:defaultZone:http://127.0.0.1:${se…

    2022年4月30日
    45
  • 美股实时行情api接口(美股开户)

    所有美股历史交易行情数据,完整历史交易/任意时间段查询。1.产品功能支持所有历史美股交易查询;支持指定任意时间段查询;超高的查询效率,秒级返回;所有的交易数据为未复权的数据;全接口支持HTTPS(TLSv1.0/v1.1/v1.2/v1.3);全面兼容AppleATS;全国多节点CDN部署;接口极速响应,多台服务器构建API接口负载均衡。2.API文档接口地址:https://api.gugudata.com/stock/us返回格式:

    2022年4月11日
    136
  • 2021年10月TIOBE排行 榜首 Python yyds[通俗易懂]

    2021年10月TIOBE排行 榜首 Python yyds[通俗易懂]2021年10月TIOBE排行榜首Pythonyydspython这次不负众望,登上了榜首,大势所趋罢了,意料之中的事情。简介Python(英国发音:/ˈpaɪθən/美国发音:/ˈpaɪθɑːn/),是一种面向对象的解释型计算机程序设计语言,由荷兰人GuidovanRossum于1989年发明,第一个公开发行版发行于1991年。Python是纯粹的自由软件,源代码和解释器CPython遵循GPL协议。2017年7月20日,IEEE发布2017年编程语言排行榜:Python高居首位。未

    2022年5月2日
    35
  • django 用户注册_云端注册用户怎么注册

    django 用户注册_云端注册用户怎么注册前言我们使用django创建用户可以使用注册接口的方式,也可以使用django自带的后台管理系统,这里就介绍使用后台管理系统创建用户admin后台管理系统在使用之前我们可以使用第三方的插件,来美

    2022年8月7日
    3
  • C# FileStream简单介绍和使用

    C# FileStream简单介绍和使用本章讲述:FileStream类的基本功能,以及简单示例;1、引用命名空间:usingSystem.IO;2、注意:使用IO操作文件时,要注意流关闭和释放问题!强力推荐:将创建文件流对象的过程写在using当中,会自动帮助我们释放资源;使用try{}catch(Exceptionex){}进行一次捕获;3、FileStream操作字节,可以操作任何类型…

    2022年7月21日
    10
  • 【夏虫语冰】visio2013安装出错,您输入的产品密钥无法在此计算机上使用,错误25004[通俗易懂]

    【夏虫语冰】visio2013安装出错,您输入的产品密钥无法在此计算机上使用,错误25004[通俗易懂]问题的原因并不是您所下载的Office程序无法安装上去,而是所使用的密钥不能再授权安装和使用Office产品。如果在此电脑上之前已经安装并使用过了试用版本的Office的话,是不能重复不断地继续使用试用版本的Office和申请的授权密钥的。Office卸载工具有很多,下面介绍几个常见的工具:1、微软新版工具(未测试,微软官网无法下载)“SetupProd_OffScrub.exe”是微软新推出来Office卸载工具。下载链接&官方教程见下:从PC…

    2025年9月14日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号