`
yuanlanjun
  • 浏览: 1188097 次
文章分类
社区版块
存档分类
最新评论

为窗体加上滚动条

 
阅读更多

为windows32窗体加入滚动条,代码如下:

#include<windows.h>
LRESULT CALLBACK WindowProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);
int WINAPI WinMain(
  HINSTANCE hInstance,      // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,          // command line
  int nCmdShow              // show state
  )
{
	static TCHAR szAppName[]=TEXT("AppName");
	HWND hwnd;
	MSG msg;
	WNDCLASS wndclass;
	wndclass.cbClsExtra=0;
	wndclass.cbWndExtra=0;
	wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
	wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
	wndclass.hInstance=hInstance;
	wndclass.lpfnWndProc=WindowProc;
	wndclass.lpszClassName=szAppName;
	wndclass.lpszMenuName=NULL;
	wndclass.style=CS_HREDRAW|CS_VREDRAW;

	if(!RegisterClass(&wndclass)){
		MessageBox(NULL,TEXT("This program requires Windows NT"),szAppName,MB_ICONERROR);
	}

	hwnd=CreateWindow(
  szAppName,  // registered class name
  TEXT("This is title"), // window name
  WS_OVERLAPPEDWINDOW|WS_VSCROLL,        // window style
  CW_USEDEFAULT,                // horizontal position of window
  CW_USEDEFAULT,                // vertical position of window
  CW_USEDEFAULT,           // window width
  CW_USEDEFAULT,          // window height
  NULL,      // handle to parent or owner window
  NULL,          // menu handle or child identifier
  hInstance,  // handle to application instance
  NULL        // window-creation data
);
	ShowWindow(hwnd,nCmdShow);
	UpdateWindow(hwnd);

	while(GetMessage(&msg,NULL,0,0)){
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
LRESULT CALLBACK WindowProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
)
{
	static int cxClient,cyClient,cxChar,cyChar,iVscrollPos;
	HDC hdc;
	PAINTSTRUCT ps;
	int i=50,j=20;
	TCHAR szBuffer[20];
	TEXTMETRIC tm;
	int numberline=30;

	switch(uMsg){
		case WM_CREATE:
			//hdc=GetDC(hwnd);
			//TextOut(hdc,0,0,TEXT("hello,world"),strlen("hello,world"));
			//ReleaseDC(hwnd,hdc);
			hdc=BeginPaint(hwnd,&ps);
			GetTextMetrics(hdc,&tm);
			SetScrollRange(hwnd,SB_VERT,0,numberline-1,FALSE);
			SetScrollPos(hwnd,SB_VERT,iVscrollPos,TRUE);
			cyChar=(tm.tmHeight+tm.tmExternalLeading);
			EndPaint(hwnd,&ps);
			return 0;
		case WM_PAINT:
			hdc=BeginPaint(hwnd,&ps);
			GetTextMetrics(hdc,&tm);
			TextOut(hdc,iVscrollPos,iVscrollPos,szBuffer,wsprintf(szBuffer,TEXT("%d"),tm.tmAveCharWidth));//字符宽度
			TextOut(hdc,iVscrollPos+30,iVscrollPos+40,szBuffer,wsprintf(szBuffer,TEXT("%d"),tm.tmHeight+tm.tmExternalLeading));//字符长度
			EndPaint(hwnd,&ps);
			return 0;
		case WM_VSCROLL:
			switch(LOWORD(wParam)){
			case SB_LINEUP:
				iVscrollPos-=100;//为了效果更明显由iVscrollPos-=1;改成了iVscrollPos-=100;
				break;
			case SB_LINEDOWN:
				iVscrollPos+=100;
				break;
			case SB_PAGEUP:
				iVscrollPos-=cyClient/cyChar;//cyClient/cyChar表示一页最多几行或一列最多包括多少个字符
				break;
			case SB_PAGEDOWN:
				iVscrollPos+=cyClient/cyChar;
				break;
			case SB_THUMBPOSITION:
				iVscrollPos=HIWORD(wParam);
				break;
			default:
				break;

			}
			iVscrollPos=max(0,min(iVscrollPos,numberline-1));
			if(iVscrollPos!=GetScrollPos(hwnd,SB_VERT)){
				SetScrollPos(hwnd,SB_VERT,iVscrollPos,TRUE);
				InvalidateRect(hwnd,NULL,TRUE);
			}
			return 0;
		case WM_SIZE:
			cyClient=HIWORD(lParam);
			return 0;
		/*case WM_SIZE:
			hdc=BeginPaint(hwnd,&ps);
			cxClient=LOWORD(lParam);
			cyClient=HIWORD(lParam);
			GetTextMetrics(hdc,&tm);
			TextOut(hdc,0,100,szBuffer,wsprintf(szBuffer,TEXT("%d"),cxClient/tm.tmAveCharWidth));//一行最多显示多少个字符
			TextOut(hdc,0,150,szBuffer,wsprintf(szBuffer,TEXT("%d"),cyClient/(tm.tmHeight+tm.tmExternalLeading)));//一列最多显示多少字符
			EndPaint(hwnd,&ps);
			return 0;*/
		case WM_DESTROY:
			PostQuitMessage(0);
			return 0;

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


截图如下:

分享到:
评论

相关推荐

    让窗体加上滚动条的 VB 源码

    一个让窗体加上滚动条的 VB 源码 用到了子类化的技术 如果显示未找到库,可以到 http://download.csdn.net/source/778537 窗中加滚动条需要的库 请将文件拷贝到system32目录下,再打开运行输入 regsvr32 ...

    VB编程资源大全(控件 窗体1)

    vbocx10.zip 以及窗体内的控件是否随窗体大小的改变而改变,以及设置窗体是否处于最上方,以及设置窗体是否以爆炸式方式显示(19KB) 72,Easyscroll.zip 为任何控件增加滚动条(41KB) 73,Zcg_3DLabel.zip ...

    VB编程资源大全(控件 窗体2)

    vbocx10.zip 以及窗体内的控件是否随窗体大小的改变而改变,以及设置窗体是否处于最上方,以及设置窗体是否以爆炸式方式显示(19KB) 72,Easyscroll.zip 为任何控件增加滚动条(41KB) 73,Zcg_3DLabel.zip ...

    delphi 开发经验技巧宝典源码

    0015 以原始风格显示控件的滚动条 11 0016 使用快捷键打开对象观察器中的“...”按钮 11 1.5 其他相关应用技巧 11 0017 安装合适的Delphi版本 11 0018 熟练掌握Delphi中的菜单项 12 0019 构成Delphi项目...

    delphi 开发经验技巧宝典源码06

    0015 以原始风格显示控件的滚动条 11 0016 使用快捷键打开对象观察器中的“...”按钮 11 1.5 其他相关应用技巧 11 0017 安装合适的Delphi版本 11 0018 熟练掌握Delphi中的菜单项 12 0019 构成Delphi项目...

    matlab教程

    2.1本章导读 2.2Annoation图形标注 2.3图形局部放大 2.4给图像加上缩放滚动条 2.5GUI应用分析 2.5.1图像加载和存储 2.5.2GUI图形显示 2.5.3可变GUI窗体设置 2.6随机变量分布图 2.7符号变量应用求解

    BusinessSkinForm皮肤控件

    1、先放bsBusinessSkinForm、bsSkinData、bsStoredSkin各一个到窗体上 2、修改bsBusinessSkinForm的SkinData属性为...至于滚动条,需要自己手动加上,然后把它的HScrollBar和VScrollBar属性指向你所加的滚动条!

    Java制作手机端访问的表单输入提交程序.rar

    // 把滚动条加到表单上   form.append(userName); // 把用户名文本添域加到表单上   form.append(password); // 把密码文本域添加到表单上   form.addCommand(cancel); // 为表单加上取消命令   form.add...

    VC++常用功能实例

    ◆当对话框中有一个滚动条是,当滚动滚动条时的消息控制函数◆ 27 ◆将一个CWnd指针转换成一个控件ID(整数)注意用GetDlgItem()函数是从一个控件ID转换成一个CWnd的指针◆ 28 ◆如果在对话框中自定义一个消息的方法,...

    VC++常用的共用函数100多页

    ◆当对话框中有一个滚动条是,当滚动滚动条时的消息控制函数◆ 27 ◆将一个CWnd指针转换成一个控件ID(整数)注意用GetDlgItem()函数是从一个控件ID转换成一个CWnd的指针◆ 28 ◆如果在对话框中自定义一个消息的方法,...

    VC++ 专家指导.doc

    (66)怎样才能关闭树形控件中的滚动条? 149 (67)如何建立一个带滚动条的窗口? 149 (68)如何实现对话框的拖放? 150 (69)TrackMouseEvent()怎么了 151 (70)奇怪的组合框控件 152 (71)关于使用MS SANS SERIF字体 152 (72...

    C# for CSDN 乱七八糟的看不懂

    正切 返回 e 的指定次幂 对数 数字 x 的 y 次幂 返回较大者 第3页 C#(WINFORM)学习 Math.Min(x,y) 返回较小者 枚举型 一般为字符串,可以定义带数字的枚举型,示例为: enum Color { Red=1, Blue=2, Green=3 } ...

    VC6风格界面

    ...................\为CListBox加上智能水平滚动条.doc ...................\为列表控件添加水平滚动条.doc ...................\为对话框程序添加工具条和状态栏.doc ...................\从资源中加载皮肤, ...

    vc++ 应用源码包_6

    任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器的源码,解决CListCtr刷新时滚动条跳到开始处。 VC++实现网络连接查看器源码 非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++...

    vc++ 应用源码包_5

    任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器的源码,解决CListCtr刷新时滚动条跳到开始处。 VC++实现网络连接查看器源码 非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++...

    javascript函数的解释

    81.JS中的窗口滚动条:window.scroll(x,y) 82.JS中的窗口滚动到位置:window.scrollby 83.JS中设置时间间隔:setInterval("expr",msecDelay)或setInterval(funcRef,msecDelay)或setTimeout 84.JS中的模态显示在IE4+行,...

    vc++ 应用源码包_3

    任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器的源码,解决CListCtr刷新时滚动条跳到开始处。 VC++实现网络连接查看器源码 非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++...

    vc++ 应用源码包_1

    任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器的源码,解决CListCtr刷新时滚动条跳到开始处。 VC++实现网络连接查看器源码 非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++...

    107个常用javascript语句

    81.JS中的窗口滚动条:window.scroll(x,y) 82.JS中的窗口滚动到位置:window.scrollby 83.JS中设置时间间隔:setInterval("expr",msecDelay)或setInterval(funcRef,msecDelay)或setTimeout 84.JS中的模態显示在IE4 行,...

Global site tag (gtag.js) - Google Analytics