关闭

win32 (SDK) 垂直滚动条

217人阅读 评论(0) 收藏 举报
分类:

scroll.c

/* -------------------------------------------------------------------
MyWindows.c -- 基本窗口模型
《Windows 程序设计(SDK)》视频教程
--------------------------------------------------------------------*/

#include <windows.h>
#include<strsafe.h>

#define NUMLINE 100

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

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

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

	if (!RegisterClass(&wndclass))
	{
		MessageBox(NULL, TEXT("这个程序需要在 Windows NT 才能执行!"), szAppName, MB_ICONERROR);
		return 0;
	}

	hwnd = CreateWindow(szAppName,
		TEXT("涵涵工作室"),
		WS_OVERLAPPEDWINDOW|WS_VSCROLL | WS_HSCROLL,  //加上 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 WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rect;
	int i = 0;
	size_t size;
	static TEXTMETRIC TextMetric;
	TCHAR strBuffer[128];
	//(重点)设置static 的好处就是 此变量 在一次消息相应中初始化了 下次 还可以使用(其他消息也可以使用)
	                                         //滚动条位置    文字位置
	static size_t iTarget, cxClient, cyClinet, iVScrollPos = 0,iVTextPos=0, charWidth, charHeight;
	switch (message)
	{
	case WM_CREATE:
		hdc = GetDC(hwnd);
		GetTextMetrics(hdc, &TextMetric);
		charWidth = TextMetric.tmAveCharWidth;
		charHeight = TextMetric.tmHeight + TextMetric.tmExternalLeading;
		ReleaseDC(hwnd, hdc);
		//NUMLINE -1是因为从0开始  最后一个参数指定滚动条是否重绘
		//有多少行就 这是多少值
		SetScrollRange(hwnd, SB_VERT, 0, NUMLINE - 1, FALSE);
		//设置 TRUE 滚动条立即重绘 这样才能看到新位置
		SetScrollPos(hwnd, SB_VERT, 0, TRUE);
		break;
	case WM_PAINT:
		hdc = GetDC(hwnd);
		for (i; i < NUMLINE; i++)
		{
			StringCchPrintf(strBuffer, 128, TEXT("%d,%s"), i,TEXT("你好"));
			StringCchLength(strBuffer, 128, &size);
			// tmAveCharWidth 平均宽度 tmHeight+tnExternalLeading就是高度
			TextOut(hdc, charWidth, (iVTextPos*charHeight) + i*charHeight, strBuffer, size);
		}
		ReleaseDC(hwnd, hdc);
		break;
	case WM_SIZE:
		cxClient = LOWORD(lParam);
		cyClinet = HIWORD(lParam);
		hdc = GetDC(hwnd);
		//LOWORD 低十六位 HIWORD高十六位,WORD就是 字型数据 (16位)
		//StringCchPrintf(strBuffer, 128, TEXT("当前客户区分辨率:%d*%d"), LOWORD(lParam), HIWORD(lParam));
		//这里要注意先后顺序 先使用StringCchPrintf 写入后,StringCchLength才有效
		//StringCchLength(strBuffer, 128, &iTarget);
		//TextOut(hdc, 0, 0, strBuffer, iTarget);
		ReleaseDC(hwnd, hdc);
		break;
	
	case WM_VSCROLL:
		hdc = GetDC(hwnd);
		//设置向上和向右对齐
		SetTextAlign(hdc, TA_TOP | TA_RIGHT);
		switch (LOWORD(wParam))
		{
		case SB_LINEDOWN:
			if (iVScrollPos != (NUMLINE-1)) iVTextPos -= 1;
			TextOut(hdc, cxClient-10, 0, TEXT("向下滚动一行"),6);
			
			break;
		case SB_LINEUP:
			if (iVScrollPos != 0) iVTextPos += 1;
			TextOut(hdc, cxClient - 10, 0, TEXT("向上滚动一行"), 6);
			
			break;
		case SB_PAGEUP:
			TextOut(hdc, cxClient - 10, 0, TEXT("向上滚动一页"), 6);
			break;
		case SB_PAGEDOWN:
			TextOut(hdc, cxClient - 10, 0, TEXT("向下滚动一页"), 6);
			break;
		case SB_THUMBTRACK:
			iVTextPos = -HIWORD(wParam);
			
			TextOut(hdc, cxClient - 10, 0, TEXT("别抓住我不放"), 6);
			break;
		default:
			break;
		}
		iVScrollPos = -iVTextPos;
		ReleaseDC(hwnd, hdc);
		SetScrollPos(hwnd, SB_VERT, iVScrollPos, TRUE);
		InvalidateRect(NULL, NULL, FALSE);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	}

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


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

显示窗口的水平和垂直滚动条

显示窗口的水平和垂直滚动条     由于在外读书,上网都是在网吧,所以回答问题,通常都是三言二语,没有说清楚,不过这一篇可是在寝室的电脑上完成的,当然还有上次回答天水的那篇.我学VB的时候,根本没有...
  • kirawoo
  • kirawoo
  • 2014-09-09 13:54
  • 3696

我为什么选择Win32SDK以及Win32SDK的特点

玩Win32SDK已有一段时间内,从初中的时候就开始了,虽然时间紧,就假期里或插空背着父母玩会,但是两三年下来,收获也是不浅。所以就想着把我学的东西都整理下来,算是纪念吧,如果还能帮助一下别人,也是我...
  • zuishikonghuan
  • zuishikonghuan
  • 2015-06-02 13:43
  • 2624

Win32 SDK基础(3)—— 从零开始创建windows窗口(一)

一、从Windows的程序分类说起。     从高中第一次接触电脑开始(惭愧,高中才会用电脑,大学一年级才知道有QQ这么个东西,家里穷,没办法),在我的概念中电脑应该就是windows这样的。所以,直...
  • lzhui1987
  • lzhui1987
  • 2016-12-03 21:24
  • 4007

初学者必看:VC++、Win32 SDK、MFC的区别

这是一个初进行开发人员都可能遇到过的概念不清的问题,自己当年也同样有过误解,做技术我感觉一定要专,但是,不代表毫不关心相关的知识,至少概念层次上要知道,所以,这里还是再把这些内容纪录下来,好记性不如烂...
  • lichen18848950451
  • lichen18848950451
  • 2017-03-29 11:37
  • 1945

Win32SDK对话框模板

前言vc6向导生成Win32SDK时,没有对话框模板。 整理了一个, 写测试程序用.Win32SDK对话框模板// hw.cpp : Defines the entry point for the ...
  • LostSpeed
  • LostSpeed
  • 2016-11-12 00:55
  • 411

WIN32 SDK 创建一个窗体的过程

一.窗口的创建过程 1.设计窗口类 2.注册窗口类 3.创建窗口 4.显示窗口   #include   //回调函数声明 LRESULT CALLBACK MyProc( HWND hwnd, ...
  • kaishang0713
  • kaishang0713
  • 2013-11-24 20:38
  • 1036

[Win32]Win32 SDK编程系列文章——键盘输入消息

理论 因为大多数的PC只有一个键盘,所以所有运行中的WINDOWS程序必须共用它。WINDOWS 将负责把击键消息送到具有输入焦点的那个应用程序中去。尽管屏幕上可能同时有几个应用程序窗口,但一个...
  • ouyangshima
  • ouyangshima
  • 2013-06-05 17:21
  • 1605

Win32 SDK基础(5)—— 漫谈窗口类

一、引言         在上一文中,我们从零开始创建了一个窗口。其中很重要的一个步骤,就是注册窗口类,如下面的代码: //注册窗口类 BOOL Register(LPSTR lpClassName,...
  • lzhui1987
  • lzhui1987
  • 2016-12-04 18:00
  • 751

win32SDK中使用bmp和png位图

Win32SDK.h #pragma once #include #include #include #include #include #pragma comment(lib,"gdipl...
  • qq125096885
  • qq125096885
  • 2015-04-21 10:50
  • 1009

Win32 SDK基础(13)—— 键盘和鼠标消息

一、键盘消息 1、键盘消息 WM_KEYDOWN —— 键盘按键按下时产生。 WM_KEYUP —— 键盘按键弹起时产生。 WM_SYSKEYDOWN —— 系统按键按下时产生,如ALT、F1...
  • lzhui1987
  • lzhui1987
  • 2017-05-31 09:35
  • 798
    个人资料
    • 访问:306350次
    • 积分:6173
    • 等级:
    • 排名:第4834名
    • 原创:321篇
    • 转载:33篇
    • 译文:0篇
    • 评论:31条
    博客专栏
    最新评论