Windows程序设计——窗口键盘消息滚动事件

编程入门 行业动态 更新时间:2024-10-26 18:28:33

Windows<a href=https://www.elefans.com/category/jswz/34/1771020.html style=程序设计——窗口键盘消息滚动事件"/>

Windows程序设计——窗口键盘消息滚动事件

文章目录

  • 头文件
  • 源文件

头文件

#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:   // HomeSendMessage(hwnd, WM_VSCROLL, SB_TOP, 0);	// 消息发送到一个或多个窗口break;case VK_END:	// EndSendMessage(hwnd, WM_VSCROLL, SB_BOTTOM, 0);break;case VK_PRIOR:	// Page UpSendMessage(hwnd, WM_VSCROLL, SB_PAGEUP, 0);break;case VK_NEXT:	// Page DownSendMessage(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);
}

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

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

更多推荐

Windows程序设计——窗口键盘消息滚动事件

本文发布于:2024-02-17 17:17:19,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1694815.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:程序设计   键盘   窗口   消息   事件

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!