大神看一下移植第八天天怎么做

Posts - 90,
Articles - 0,
Comments - 542
求真、务实。
20:27 by wid, ... 阅读,
  BOOL TextOut(
//设备环境句柄
int nXStart,
//字符串开始输出的x坐标
int nYStart,
// 字符串开始输出的y坐标
LPCTSTR lpString,
//需要输出的字符串
int cbString
// 字符串的长度
  BOOL GetTextMetrics(
    HDC hdc,
// 设备环境句柄
    LPTEXTMETRIC lptm
    // 指向一个TEXTMETRIC结构的指针, 该结构用于存放字体信息。
,&令信息自动被Windows截掉,&图示说明:
     函数中说明下即可,&CreateWindow函数的原型回顾:
  HWND CreateWindow(
    LPCTSTR lpClassName,
//窗口类名称
    LPCTSTR lpWindowName,
//窗口标题
    DWORD dwStyle,
//窗口样式
    int x,
//窗口初始x坐标
    int y,
//窗口初始y坐标
    int nWidth,
//窗口初始x方向尺寸
    int nHeight,
//窗口初始y方向尺寸
    HWND hWndParent,
//父窗口句柄
    HMENU hMenu,
//窗口菜单句柄
    HANDLE hlnstance,
//程序实例句柄
    LPVOID lpParam
//创建参数
     
   DWORD dwStyle,
//窗口样式
WS_HSCROLL
//水平滚动条的标识符
WS_VSCROLL
//垂直滚动条的标识符
    WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL
    相对于系统我们需要做的事情已经较为轻松了主要有项任务
      1&.&初始化滚动条的位置和滚动条的范围
      2&.&处理系统发来的消息
      3&.&根据发来的消息重置滑块的位置
      4&.&根据滚动条消息重绘客户区显示的内容。
#define SB_LINEUP
//上翻一个单位
#define SB_LINELEFT
//左翻一个单位
#define SB_LINEDOWN
//下翻一个单位
#define SB_LINERIGHT
//右翻一个单位
#define SB_PAGEUP
//上翻一页
#define SB_PAGELEFT
//左翻一页
#define SB_PAGEDOWN
//下翻一页
#define SB_PAGERIGHT
//右翻一页
#define SB_THUMBPOSITION
//当鼠标放下滑块时
#define SB_THUMBTRACK
//移动滑块时
#define SB_TOP
//滑块到了顶端
#define SB_LEFT
//滑块到了左端
#define SB_BOTTOM
//滑块到了底端
#define SB_RIGHT
//滑块到了右端
#define SB_ENDSCROLL
//释放鼠标
&SetScrollRange
  BOOL SetScrollRange(
    HWND hWnd,
   //窗口句柄
    int nBar,
//被设置的滚动条类型
    int nMinPos,
//滚动条的最小位置
    int nMaxPos,
//滚动条的最大位置
    BOOL bRedraw
 //重绘标志
      
  int SetScrollPos(
    HWND hWnd,     //窗体句柄
    int nBar,        //被设置的滚动条类型
    int nPos,
//滚动条的新位置
    BOOL bRedraw
  //重绘标志
View Code - text.h
#include&string.h&
#define NUMLINES ( (int)(sizeof(statement) / sizeof(statement[0]) ) )
//计算总行数
TCHAR *statement[] = {
TEXT("没有一种不通过蔑视、忍受和奋斗就可以征服的命运。"),
TEXT("伟人之所以伟大,是因为他与别人共处逆境时,别人失去了信心,他却下决心实现自己的目标。"),
TEXT("世上没有绝望的处境,只有对处境绝望的人。"),
TEXT("当你感到悲哀痛苦时,最好是去学些什么东西。学习会使你永远立于不败之地。"),
TEXT("给自己定目标,一年,两年,五年,也许你出生不如别人好,通过努力,往往可以改变70%的命运。破罐子破摔只能和懦弱做朋友。"),
TEXT("知道自己要干什么,夜深人静,问问自己,将来的打算,并朝着那个方向去实现。而不是无所事事和做一些无谓的事。"),
TEXT("梦想无论怎么模糊,它总潜伏在我们心底,使我们的心境永远得不到宁静,直到梦想成为事实。"),
TEXT("梦是一种欲望,想是一种行动。梦想是梦与想的结晶。"),
TEXT("生气,就是拿别人的过错来惩罚自己。原谅别人,就是善待自己。"),
TEXT("一个实现梦想的人,就是一个成功的人。"),
TEXT("大事坚持原则,小事学会变通。"),
TEXT("一个人有钱没钱不一定,但如果这个人没有了梦想,这个人穷定了。"),
TEXT("不要急于表态不急于表态或发表意见,可以使人对你揣摸猜测。谨慎的沉默是精明人的帮手。一旦表态,你的决定就容易受到批评和非议。如果这些决定是以失败告终,你就会更加倒霉。"),
TEXT("平凡朴实的梦想,我们用那唯一的坚持信念去支撑那梦想。"),
TEXT("不要总谈论自己你若总是谈论自己,那么不是吹嘘自己,就是贬低自己;前者是虚荣的表现,后者是卑微的表现。"),
TEXT("千万不要抱怨,抱怨会使你丢丑。抱怨会使人对你傲慢无礼,并促使别人如你所抱怨的那么做。要赢得别人的帮助,最好的办法是表扬他人。"),
TEXT("凡事终了时务必小心谨慎,顺利抽身退出要比顺利地进入时更难。"),
TEXT("很难说什么是办不到的事情,因为昨天的梦想,可以是今天的希望,并且还可以成为明天的现实。"),
TEXT("当你再也没有什么可以失去的时候,就是你开始得到的时候。"),
TEXT("生命犹如一片绿叶,随着时间的流逝,慢慢变的枯黄,但他的叶脉还是那么清晰可见。"),
TEXT("我们可以躲开大家,却躲不开一只苍蝇。生活中使我们不快乐的常是一些芝麻小事。"),
TEXT("人生的意义不在于拿一手好牌,而在于打好一手坏牌。"),
TEXT("一个人想平庸,阻拦者很少;一个人想出众,阻拦者很多。不少平庸者与周围人关系融洽,不少出众者与周围人关系紧张。"),
TEXT("&危机&两个字,一个意味着危险,另外一个意味着机会,不要放弃任何一次努力。"),
TEXT("世上没有绝望的处境,只有对处境绝望的人。"),
TEXT("再长的路,一步步也能走完,再短的路,不迈开双脚也无法到达。"),
TEXT("有志者自有千计万计,无志者只感千难万难。"),
TEXT("成功与不成功之间有时距离很短只要后者再向前几步。"),
TEXT("世界会向那些有目标和远见的人让路。"),
TEXT("世界青睐有雄心壮志的人。成功所依靠的惟一条件就是思考。当你的思维以最高速度运转时,乐观欢快的情绪就会充斥全身。一个人最完美的作品都是在充满愉快、乐观、深情的状态下完成的。学会让自己安静,把思维沉浸下来,慢慢降低对事物的欲望。把自我经常归零,每天都是新的起点,没有年龄的限制,只要你对事物的欲望适当的降低,会赢得更多的求胜机会。"),
TEXT("学会让自己安静,把思维沉浸下来,慢慢降低对事物的欲望。把自我经常归零,每天都是新的起点,没有年龄的限制,只要你对事物的欲望适当的降低,会赢得更多的求胜机会。"),
TEXT("杨澜:年轻时候应该能够作一些冒险。年轻时候最大的财富,不是你的青春,不是你的美貌,也不是你充沛的精力,而是你有犯错误的机会。"),
TEXT("没有十全十美的东西,没有十全十美的人,关键是清楚到底想要什么。得到想要的,肯定会失去另外一部分。如果什么都想要,只会什么都得不到。"),
TEXT("做自己的决定。然后准备好承担后果。从一开始就提醒自己,世上没有后悔药吃。"),
TEXT("在你内心深处,还有无穷的潜力,有一天当你回首看时,你就会知道这绝对是真的。"),
TEXT("不为模糊不清的未来担忧,只为清清楚楚的现在努力。"),
TEXT("没有一种不通过蔑视、忍受和奋斗就可以征服的命运。"),
TEXT("伟人之所以伟大,是因为他与别人共处逆境时,别人失去了信心,他却下决心实现自己的目标。"),
TEXT("世上没有绝望的处境,只有对处境绝望的人。"),
TEXT("当你感到悲哀痛苦时,最好是去学些什么东西。学习会使你永远立于不败之地。"),
TEXT("给自己定目标,一年,两年,五年,也许你出生不如别人好,通过努力,往往可以改变70%的命运。破罐子破摔只能和懦弱做朋友。"),
TEXT("知道自己要干什么,夜深人静,问问自己,将来的打算,并朝着那个方向去实现。而不是无所事事和做一些无谓的事。"),
TEXT("梦想无论怎么模糊,它总潜伏在我们心底,使我们的心境永远得不到宁静,直到梦想成为事实。"),
TEXT("梦是一种欲望,想是一种行动。梦想是梦与想的结晶。"),
TEXT("生气,就是拿别人的过错来惩罚自己。原谅别人,就是善待自己。生气,就是拿别人的过错来惩罚自己。原谅别人,就是善待自己。生气,就是拿别人的过错来惩罚自己。"),
TEXT("一个实现梦想的人,就是一个成功的人。"),
TEXT("大事坚持原则,小事学会变通。"),
TEXT("一个人有钱没钱不一定,但如果这个人没有了梦想,这个人穷定了。"),
TEXT("不要急于表态不急于表态或发表意见,可以使人对你揣摸猜测。谨慎的沉默是精明人的帮手。一旦表态,你的决定就容易受到批评和非议。"),
TEXT("平凡朴实的梦想,我们用那唯一的坚持信念去支撑那梦想。"),
TEXT("不要总谈论自己你若总是谈论自己,那么不是吹嘘自己,就是贬低自己;前者是虚荣的表现,后者是卑微的表现。"),
TEXT("千万不要抱怨,抱怨会使你丢丑。抱怨会使人对你傲慢无礼,并促使别人如你所抱怨的那么做。要赢得别人的帮助,最好的办法是表扬他人。"),
TEXT("凡事终了时务必小心谨慎,顺利抽身退出要比顺利地进入时更难。"),
TEXT("很难说什么是办不到的事情,因为昨天的梦想,可以是今天的希望,并且还可以成为明天的现实。"),
TEXT("当你再也没有什么可以失去的时候,就是你开始得到的时候。"),
TEXT("生命犹如一片绿叶,随着时间的流逝,慢慢变的枯黄,但他的叶脉还是那么清晰可见。"),
TEXT("我们可以躲开大家,却躲不开一只苍蝇。生活中使我们不快乐的常是一些芝麻小事。"),
TEXT("人生的意义不在于拿一手好牌,而在于打好一手坏牌。"),
TEXT("一个人想平庸,阻拦者很少;一个人想出众,阻拦者很多。不少平庸者与周围人关系融洽,不少出众者与周围人关系紧张。"),
TEXT("&危机&两个字,一个意味着危险,另外一个意味着机会,不要放弃任何一次努力。"),
TEXT("世上没有绝望的处境,只有对处境绝望的人。"),
TEXT("再长的路,一步步也能走完,再短的路,不迈开双脚也无法到达。"),
TEXT("有志者自有千计万计,无志者只感千难万难。"),
TEXT("成功与不成功之间有时距离很短只要后者再向前几步。"),
TEXT("世界会向那些有目标和远见的人让路。"),
TEXT("世界青睐有雄心壮志的人。成功所依靠的惟一条件就是思考。当你的思维以最高速度运转时,乐观欢快的情绪就会充斥全身。一个人最完美的作品都是在充满愉快、乐观、深情的状态下完成的。"),
TEXT("学会让自己安静,把思维沉浸下来,慢慢降低对事物的欲望。把自我经常归零,每天都是新的起点,没有年龄的限制,只要你对事物的欲望适当的降低,会赢得更多的求胜机会。"),
TEXT("杨澜:年轻时候应该能够作一些冒险。年轻时候最大的财富,不是你的青春,不是你的美貌,也不是你充沛的精力,而是你有犯错误的机会。"),
TEXT("没有十全十美的东西,没有十全十美的人,关键是清楚到底想要什么。得到想要的,肯定会失去另外一部分。如果什么都想要,只会什么都得不到。"),
TEXT("做自己的决定。然后准备好承担后果。从一开始就提醒自己,世上没有后悔药吃。"),
TEXT("在你内心深处,还有无穷的潜力,有一天当你回首看时,你就会知道这绝对是真的。"),
TEXT("不为模糊不清的未来担忧,只为清清楚楚的现在努力。"),
TEXT("没有一种不通过蔑视、忍受和奋斗就可以征服的命运。"),
TEXT("伟人之所以伟大,是因为他与别人共处逆境时,别人失去了信心,他却下决心实现自己的目标。"),
TEXT("世上没有绝望的处境,只有对处境绝望的人。"),
TEXT("当你感到悲哀痛苦时,最好是去学些什么东西。学习会使你永远立于不败之地。"),
TEXT("给自己定目标,一年,两年,五年,也许你出生不如别人好,通过努力,往往可以改变70%的命运。破罐子破摔只能和懦弱做朋友。"),
TEXT("知道自己要干什么,夜深人静,问问自己,将来的打算,并朝着那个方向去实现。而不是无所事事和做一些无谓的事。"),
TEXT("梦想无论怎么模糊,它总潜伏在我们心底,使我们的心境永远得不到宁静,直到梦想成为事实。"),
TEXT("梦是一种欲望,想是一种行动。梦想是梦与想的结晶。"),
TEXT("生气,就是拿别人的过错来惩罚自己。原谅别人,就是善待自己。"),
TEXT("一个实现梦想的人,就是一个成功的人。"),
TEXT("大事坚持原则,小事学会变通。"),
TEXT("一个人有钱没钱不一定,但如果这个人没有了梦想,这个人穷定了。"),
TEXT("不要急于表态不急于表态或发表意见,可以使人对你揣摸猜测。谨慎的沉默是精明人的帮手。一旦表态,你的决定就容易受到批评和非议。如果这些决定是以失败告终,你就会更加倒霉。"),
TEXT("平凡朴实的梦想,我们用那唯一的坚持信念去支撑那梦想。"),
TEXT("不要总谈论自己你若总是谈论自己,那么不是吹嘘自己,就是贬低自己;前者是虚荣的表现,后者是卑微的表现。"),
TEXT("千万不要抱怨,抱怨会使你丢丑。抱怨会使人对你傲慢无礼,并促使别人如你所抱怨的那么做。要赢得别人的帮助,最好的办法是表扬他人。"),
TEXT("凡事终了时务必小心谨慎,顺利抽身退出要比顺利地进入时更难。"),
TEXT("很难说什么是办不到的事情,因为昨天的梦想,可以是今天的希望,并且还可以成为明天的现实。"),
TEXT("当你再也没有什么可以失去的时候,就是你开始得到的时候。"),
TEXT("生命犹如一片绿叶,随着时间的流逝,慢慢变的枯黄,但他的叶脉还是那么清晰可见。"),
TEXT("我们可以躲开大家,却躲不开一只苍蝇。生活中使我们不快乐的常是一些芝麻小事。"),
TEXT("人生的意义不在于拿一手好牌,而在于打好一手坏牌。"),
TEXT("一个人想平庸,阻拦者很少;一个人想出众,阻拦者很多。不少平庸者与周围人关系融洽,不少出众者与周围人关系紧张。"),
TEXT("&危机&两个字,一个意味着危险,另外一个意味着机会,不要放弃任何一次努力。"),
TEXT("世上没有绝望的处境,只有对处境绝望的人。"),
TEXT("再长的路,一步步也能走完,再短的路,不迈开双脚也无法到达。"),
TEXT("有志者自有千计万计,无志者只感千难万难。"),
TEXT("成功与不成功之间有时距离很短只要后者再向前几步。"),
TEXT("世界会向那些有目标和远见的人让路。"),
TEXT("世界青睐有雄心壮志的人。成功所依靠的惟一条件就是思考。当你的思维以最高速度运转时,乐观欢快的情绪就会充斥全身。一个人最完美的作品都是在充满愉快、乐观、深情的状态下完成的。"),
TEXT("学会让自己安静,把思维沉浸下来,慢慢降低对事物的欲望。把自我经常归零,每天都是新的起点,没有年龄的限制,只要你对事物的欲望适当的降低,会赢得更多的求胜机会。"),
TEXT("杨澜:年轻时候应该能够作一些冒险。年轻时候最大的财富,不是你的青春,不是你的美貌,也不是你充沛的精力,而是你有犯错误的机会。"),
TEXT("没有十全十美的东西,没有十全十美的人,关键是清楚到底想要什么。得到想要的,肯定会失去另外一部分。如果什么都想要,只会什么都得不到。"),
TEXT("做自己的决定。然后准备好承担后果。从一开始就提醒自己,世上没有后悔药吃。"),
TEXT("在你内心深处,还有无穷的潜力,有一天当你回首看时,你就会知道这绝对是真的。"),
TEXT("不为模糊不清的未来担忧,只为清清楚楚的现在努力。")
//计算statement所有句子中最长语句的长度
int GetMaxLength()
*计算statement所有句子中最长语句的长度
*返回值: int GetMaxLength(void) -& int
int maxLength = 0 ;
for( i = 0; i & NUMLINES; i++ )
if( wcslen(statement[i]) & maxLength )
maxLength = wcslen(statement[i]) ;
return maxL
#define NUMLINES ( (int)(sizeof(statement) / sizeof(statement[0]) ) )
//计算总行数
int GetMaxLength()
*计算statement所有句子中最长语句的长度
*返回值: int GetMaxLength(void) -& int
int maxLength = 0 ;
for( i = 0; i & NUMLINES; i++ )
if( wcslen(statement[i]) & maxLength )
maxLength = wcslen(statement[i]) ;
return maxL
1 #include&windows.h&
2 #include"text.h"
4 LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ) ;
//声明窗口过程函数
6 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow )
static TCHAR szAppName[] = TEXT("LearnScroll") ;
//窗口类成员属性
wndclass.lpfnWndProc = WndP
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.hInstance = hI
wndclass.lpszClassName = szAppN
wndclass.lpszMenuName = NULL ;
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH) ;
wndclass.hCursor = LoadCursor(NULL, IDI_APPLICATION) ;
wndclass.hIcon = LoadIcon(NULL, IDC_ARROW) ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
//注册窗口类
if( !RegisterClass(&wndclass) )
MessageBox( NULL, TEXT("无法注册窗口类!"), TEXT("错误"), MB_OK | MB_ICONERROR ) ;
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.wP
55 LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
static int cxChar, cxCaps, cyChar, cyClient, cxClient, iVscrollPos, iHscrollP
//cxChar:平均字符宽度; cxCaps: 大写字母平均宽度; cyChar: 字符高; cyClient、cxClient: 客户区y、x方向尺寸;
//iVscrollPos: 竖直方向滚动条滑块位置; iHscrollPos: 水平方向滚动条滑块位置
//记录客户区RECT结构
//i循环控制, x记录水平方向坐标, y竖直方向坐标
PAINTSTRUCT
TEXTMETRIC
switch(message)
case WM_CREATE:
//处理WM_CREATE消息
hdc = GetDC(hwnd) ;
GetTextMetrics( hdc, &tm ) ;
//获取系统字体信息
cxChar = tm.tmAveCharW
//获取平均宽度
cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;
//大写字母平均宽度
cyChar = tm.tmHeight + tm.tmExternalL
//字符高度
ReleaseDC( hwnd, hdc );
SetScrollRange( hwnd, SB_VERT, 0, NUMLINES - 1, FALSE ) ;
//设置竖直滚动条范围的最小值和最大值
SetScrollRange( hwnd, SB_HORZ, 0, GetMaxLength() - 1, FALSE ) ;
//设置水平滚动条范围的最小值和最大值
SetScrollPos( hwnd, SB_VERT, iVscrollPos, TRUE ) ;
//设置竖直滚动条中的滚动按钮的位置
SetScrollPos( hwnd, SB_HORZ, iHscrollPos, TRUE ) ;
//设置水平定滚动条中的滚动按钮的位置
return 0 ;
case WM_SIZE:
//处理WM_SIZE
GetClientRect( hwnd, &rect ) ;
cyClient = rect.
//得到客户区y方向尺寸
cxClient = rect.
//得到客户区x方向尺寸
return 0 ;
case WM_VSCROLL:
//处理垂直滚动条消息
switch( LOWORD(wParam) )
case SB_LINEUP:
//上翻一行
iVscrollPos -= 1 ;
case SB_LINEDOWN:
//下翻一行
iVscrollPos += 1 ;
case SB_PAGEUP:
//向上翻一整页
iVscrollPos -= cyClient / cyC
case SB_PAGEDOWN:
//向下翻一整页
iVscrollPos += cyClient / cyC
case SB_THUMBPOSITION:
//拖动滑块滑块被放下时
iVscrollPos = HIWORD(wParam) ;
iVscrollPos = max( 0, min(iVscrollPos, NUMLINES -1) ) ;
if( iVscrollPos != GetScrollPos(hwnd, SB_VERT) )
//当滑块位置改变时重置滑块位置
SetScrollPos( hwnd, SB_VERT, iVscrollPos, TRUE ) ;
InvalidateRect( hwnd, NULL, TRUE ) ;
//使客户区无效等待重绘
return 0 ;
case WM_HSCROLL:
//处理水平滚动条消息
switch( LOWORD(wParam) )
case SB_LINELEFT:
//左翻一行
iHscrollPos -= 1 ;
case SB_LINERIGHT:
//右翻一行
iHscrollPos += 1 ;
case SB_PAGELEFT:
//左翻一页
iHscrollPos -= cxClient / cxC
case SB_PAGERIGHT:
//右翻一页
iHscrollPos += cxClient / cxC
case SB_THUMBPOSITION:
//拖动滑块滑块被放下时
iHscrollPos = HIWORD(wParam) ;
iHscrollPos = max( 0, min( iHscrollPos, GetMaxLength() -1 ) ) ;
if( iHscrollPos != GetScrollPos( hwnd, SB_HORZ ) )
SetScrollPos( hwnd, SB_HORZ, iHscrollPos, TRUE ) ;
InvalidateRect( hwnd, NULL, TRUE ) ;
return 0 ;
case WM_PAINT:
//处理WM_PAINT消息
hdc = BeginPaint( hwnd, &ps ) ;
for( i= 0; i & NUMLINES; i++ )
y = cyChar * ( i -iVscrollPos ) ;
x = cxCaps * ( 0 - iHscrollPos ) ;
TextOut( hdc, x, y, statement[i], lstrlen(statement[i]) ) ;
//输出文字
EndPaint( hwnd, &ps ) ;
return 0 ;
case WM_DESTROY:
//处理WM_DESTROY消息
PostQuitMessage( 0 ) ;
return 0 ;
return DefWindowProc( hwnd, message, wParam, lParam ) ;
  hwnd = CreateWindow(
szAppName, TEXT("滚动条示例"),
WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL
SetScrollRange( hwnd, SB_VERT, 0, NUMLINES - 1, FALSE ) ;
  //设置垂直滚动条范围的最小值和最大值
SetScrollRange( hwnd, SB_HORZ, 0, GetMaxLength() - 1, FALSE ) ;
//设置水平滚动条范围的最小值和最大值
SetScrollPos( hwnd, SB_VERT, iVscrollPos, TRUE ) ;
      //设置垂直滚动条中的滚动按钮的位置
SetScrollPos( hwnd, SB_HORZ, iHscrollPos, TRUE ) ;
      //设置水平定滚动条中的滚动按钮的位置
     
  case WM_SIZE:
//处理WM_SIZE
  GetClientRect( hwnd, &rect ) ;
  cyClient = rect.
  //得到客户区y方向尺寸
  cxClient = rect.
//得到客户区x方向尺寸
  return 0 ;
  case WM_VSCROLL:
//处理水平滚动条消息
  switch( LOWORD(wParam) )
        case 滚动条消息:
          [处理滚动条消息]
iVscrollPos = max( 0, min(iVscrollPos, NUMLINES -1) ) ;
//确保滚动条的位置在设置的范围内。
if( iVscrollPos != GetScrollPos(hwnd, SB_VERT) )
    //当滑块位置改变时重置滑块位置
SetScrollPos( hwnd, SB_VERT, iVscrollPos, TRUE ) ;
InvalidateRect( hwnd, NULL, TRUE ) ;
    //使客户区无效等待重绘
return 0 ;
    case WM_PAINT:
//处理WM_PAINT消息
  hdc = BeginPaint( hwnd, &ps ) ;
  for( i= 0; i & NUMLINES; i++ )
  y = cyChar * ( i -iVscrollPos ) ;
  x = cxCaps * ( 0 - iHscrollPos ) ;
  TextOut( hdc, x, y, statement[i], lstrlen(statement[i]) ) ;
//输出文字
  EndPaint( hwnd, &ps ) ;
  return 0 ;
y = cyChar * ( i -iVscrollPos ) ;
x = cxCaps * ( 0 - iHscrollPos ) ;
:&滑块的大小是固定的,&而我见到的应用软件滑块能够根据内容的多少自动调整滑块大小;
当我拖动滑块时只有当滑块释放时页面才会滚动,&我想要的是当滑块被拖动时页面也同样跟着滚动;
&当滑块滚动到底部时最后一行显示到了客户区顶部,&下面留有一大片的空白,&而我并不需要保留下面的空白,&也就是说最后一行在滑块拖动到底部后它只显示在底部就行。
     : 自行设置滑块的大小;
问题二:&根据SB_THUMBTRACK消息处理页面的滚动,&SB_THUMBTRACK消息是当滑块被拖动时就会源源不断的发来;
&问题三:&重新设置滚动的范围。
  int SetScrollInfo(
    HWND hW
  //窗口句柄
    int fnBar,
//指定被设定参数的滚动条的类型
    LPSCROLLINFO lpsi,
//指向一个SCROLLINFO结构
    BOOL fRedraw
//重绘标志
什么是SCROLLINFO结构?
  typedef struct tagSCROLLINFO
    UINT cbS
//设置为sizeof (SCROLLINFO), 表示该结构的大小
    UINT fM
    //要设置或获取的值
    int nM
  //滚动条范围的最小值
    int nM
  //滚动条范围的最大值
    UINT nP
   //页面大小
    int nP
  //当前位置
    int nTrackP
//当前追踪位置
  }SCROLLINFO;
    &该参数必须在函数调用之前设置,&&cbSize表示该结构的大小,&用sizeof&(SCROLLINFO)表示即可。
用于指定指定结构中的哪些成员是有效的,&通过位或运算进行组合可组合的标识符如下
  SIF_ALL
//整个结构都有效  SIF_DISABLENOSCROLL
//禁用滚动条
  SIF_PAGE     
//用于指定或获取页面的大小, 在SetScrollInfo中用于设定页面的大小, 在GetScrollInfo用于获取页面的大小  SIF_POS      
//设置/取得滚动条滑块当前的位置  SIF_RANGE     
//滚动条的范围
  SIF_TRACKPOS
//仅在GetScrollInfo函数中使用, 并且仅用在处理SB_THUMBTRACK或者SB_THUMBPOSITION的WM_VSCROLL消息或WM_HSCROLL消息时使用。取得当前滑块的跟踪位置。
  && 穿插讲述完毕! 继续讲解第二个新函数。
  BOOL GetScrollInfo(
    HWND hWnd,
   //窗口句柄
    int fnBar,
//指定被设定参数的滚动条的类型
    LPSCROLLINFO lpsi
//指向一个SCROLLINFO结构
  BOOL ScrollWindow(
    HWND hWnd,
      //窗口句柄
    int XAmount,
//指定水平滚动的距离
 int YAmount,
//指定垂直滚动的距离
 CONST RECT *IpRect,
//指向RECT结构的指针, 该结构指定了将要滚动的客户区范围。若此参数为NULL,则整个客户区域将被滚动。
    CONST RECT *lpClipRect
//指向RECT结构的指针, 该结构指定了要滚动的裁剪区域。只有这个矩形中才会被滚动。
View Code - Function - WinMain
1 #include&windows.h&
2 #include"text.h"
4 LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ) ;
//声明窗口过程函数
6 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow )
static TCHAR szAppName[] = TEXT("LearnScroll") ;
//窗口类成员属性
wndclass.lpfnWndProc = WndP
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.hInstance = hI
wndclass.lpszClassName = szAppN
wndclass.lpszMenuName = NULL ;
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH) ;
wndclass.hCursor = LoadCursor(NULL, IDI_APPLICATION) ;
wndclass.hIcon = LoadIcon(NULL, IDC_ARROW) ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
//注册窗口类
if( !RegisterClass(&wndclass) )
MessageBox( NULL, TEXT("无法注册窗口类!"), TEXT("错误"), MB_OK | MB_ICONERROR ) ;
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.wP
  窗口过程部分的代码:
1 LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
static int cxChar, cxCaps, cyChar, cyClient, cxClient, iVscrollPos, iHscrollP
//cxChar:平均字符宽度; cxCaps: 大写字母平均宽度; cyChar: 字符高; cyClient、cxClient: 客户区y、x方向尺寸;
//iVscrollPos: 竖直方向滚动条滑块位置; iHscrollPos: 水平方向滚动条滑块位置
//记录客户区RECT结构
//i循环控制, x记录水平方向坐标, y竖直方向坐标
PAINTSTRUCT
TEXTMETRIC
SCROLLINFO
//SCROLLINFO结构对象
//所有语句中的最大长度
iMaxLength = GetMaxLength() ;
//取得最大长度
switch(message)
case WM_CREATE:
//处理WM_CREATE消息
hdc = GetDC(hwnd) ;
GetTextMetrics( hdc, &tm ) ;
//获取系统字体信息
cxChar = tm.tmAveCharW
//获取平均宽度
cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;
//大写字母平均宽度
cyChar = tm.tmHeight + tm.tmExternalL
//字符高度
ReleaseDC( hwnd, hdc );
return 0 ;
case WM_SIZE:
//处理WM_SIZE
GetClientRect( hwnd, &rect ) ;
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
//设置垂直滚动条相关参数
si.cbSize = sizeof (si) ;
= SIF_RANGE | SIF_PAGE ;
= NUMLINES - 1 ;
= cyClient / cyC
SetScrollInfo(hwnd, SB_VERT, &si, TRUE) ;
//设置水平滚动条相关参数
si.cbSize = sizeof (si) ;
= SIF_RANGE | SIF_PAGE ;
= 2 + iMaxL
= cxClient / cxC
SetScrollInfo(hwnd, SB_HORZ, &si, TRUE) ;
return 0 ;
case WM_VSCROLL:
//处理垂直滚动条消息
si.cbSize = sizeof (si) ;
= SIF_ALL ;
GetScrollInfo(hwnd, SB_VERT, &si) ;
iVscrollPos = si.nP
//记录当前滑块位置
switch( LOWORD(wParam) )
//处理滚动条消息
case SB_TOP:
//到达顶部
si.nPos = si.nM
case SB_BOTTOM:
//到达底部
si.nPos = si.nM
case SB_LINEUP:
//上翻一行
si.nPos -= 1 ;
case SB_LINEDOWN:
//下翻一行
si.nPos += 1 ;
case SB_PAGEUP:
//向上翻一整页
si.nPos -= si.nP
case SB_PAGEDOWN:
//向下翻一整页
si.nPos += si.nP
case SB_THUMBTRACK:
//移动滑块时
si.nPos = si.nTrackP
si.fMask = SIF_POS ;
SetScrollInfo(hwnd, SB_VERT, &si, TRUE) ;
//重置滑块位置
GetScrollInfo(hwnd, SB_VERT, &si) ;
if( si.nPos != iVscrollPos )
ScrollWindow(hwnd, 0, cyChar * (iVscrollPos - si.nPos), NULL, NULL) ;
//滚动内容
UpdateWindow(hwnd) ;
return 0 ;
case WM_HSCROLL:
//处理水平滚动条消息
si.cbSize = sizeof (si) ;
= SIF_ALL ;
GetScrollInfo (hwnd, SB_HORZ, &si) ;
iHscrollPos = si.nP
//记录当前滑块位置
switch( LOWORD(wParam) )
case SB_TOP:
//到达顶部
si.nPos = si.nM
case SB_BOTTOM:
//到达底部
si.nPos = si.nM
case SB_LINELEFT:
//左翻一行
si.nPos -= 1 ;
case SB_LINERIGHT:
//右翻一行
si.nPos += 1 ;
case SB_PAGELEFT:
//左翻一页
si.nPos -= si.nP
case SB_PAGERIGHT:
//右翻一页
si.nPos += si.nP
case SB_THUMBTRACK:
//移动滑块时
si.nPos = si.nTrackP
si.fMask = SIF_POS ;
SetScrollInfo(hwnd, SB_HORZ, &si, TRUE) ;
//重置滑块位置
GetScrollInfo(hwnd, SB_HORZ, &si) ;
if( si.nPos != iHscrollPos )
ScrollWindow(hwnd, cxCaps * (iHscrollPos - si.nPos), 0, NULL, NULL) ;
//滚动内容
UpdateWindow(hwnd) ;
return 0 ;
case WM_PAINT:
//处理WM_PAINT消息
hdc = BeginPaint( hwnd, &ps ) ;
si.cbSize = sizeof (si) ;
= SIF_POS ;
GetScrollInfo(hwnd, SB_VERT, &si) ;
iVscrollPos = si.nP
//获取当前垂直滑块位置
GetScrollInfo(hwnd, SB_HORZ, &si) ;
iHscrollPos = si.nP
//获取当前水平滑块位置
for( i= 0; i & NUMLINES; i++ )
y = cyChar * ( i - iVscrollPos ) ;
x = cxCaps * ( 0 - iHscrollPos ) ;
TextOut( hdc, x, y, statement[i], lstrlen(statement[i]) ) ;
//输出文字
EndPaint( hwnd, &ps ) ;
return 0 ;
case WM_DESTROY:
//处理WM_DESTROY消息
PostQuitMessage( 0 ) ;
return 0 ;
return DefWindowProc( hwnd, message, wParam, lParam ) ;
cyChar = tm.tmHeight + tm.tmExternalL
//字符高度}

我要回帖

更多关于 排卵第八天 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信