您的位置:首页 > 其它

一个关于滚动条的简单程序,有一定的实际意义

2009-11-30 17:23 417 查看
#include <windows.h>
int idfocus;
WNDPROC OldScroll[3];
LRESULT CALLBACK  WndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK  ScrollProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow )
{
static TCHAR szAppName[]=TEXT("Control");
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=CreateSolidBrush(0);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=szAppName;

if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("This programe requires windows NT"),szAppName,MB_ICONERROR);
return 0;
}

hwnd = CreateWindow(szAppName,
TEXT("Control Scroll"),
WS_OVERLAPPEDWINDOW,
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;
static RECT rect;
HINSTANCE hInstance;
static int i,cxClient,cyClient,cyChar,color[3];
static TCHAR * szColorLabel[]={TEXT("Red"),TEXT("Green"),TEXT("Blue")};
static COLORREF rgb[3]={RGB(255,0,0),RGB(0,255,0),RGB(0,0,255)};
static HBRUSH hBrush[3],hBrushStatic;
static HWND hwndScroll[3],hwndLabel[3],hwndValue[3],hwndRect;
TCHAR szBuffer[10];

switch(message)
{
case WM_CREATE:
hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
//获取程序窗口句柄hInstance
//GetWindowLong(HWND,int)用于获取与hwnd相关的窗口的信息

hwndRect=CreateWindow(TEXT("static"),NULL,WS_VISIBLE|WS_CHILD|SS_WHITERECT,0,0,0,0,hwnd,(HMENU)9,hInstance,NULL);
//创建SS_WHITERECT类型的静态风格窗口,作为背景

for (i=0;i<3;i++)
{
hwndScroll[i]=CreateWindow(TEXT("scrollbar"),NULL,WS_CHILD|WS_VISIBLE|WS_TABSTOP|SBS_VERT,0,0,0,0,hwnd,(HMENU)i,hInstance,NULL);
//创建3个scrollbar类型的窗口

SetScrollRange(hwndScroll[i],SB_CTL,0,255,FALSE);
//scrollbar的范围为0到255

SetScrollPos(hwndScroll[i],SB_CTL,0,FALSE);
//将其初始位置设定在0处

hwndLabel[i]=CreateWindow(TEXT("static"),szColorLabel[i],WS_CHILD|WS_VISIBLE|SS_CENTER,0,0,0,0,hwnd,(HMENU)(i+3),hInstance,NULL); //SS_CENTER意思为文本居中
//创建3个标签类型的子窗口,作为记录颜色的标签

hwndValue[i]=CreateWindow(TEXT("static"),TEXT("0"),WS_CHILD|WS_VISIBLE|SS_CENTER,0,0,0,0,hwnd,(HMENU)(i+6),hInstance,NULL);
//创建3个标签类型的子窗口,作为记录RGB实际数值的标签

OldScroll[i]=(WNDPROC)SetWindowLong(hwndScroll[i],GWL_WNDPROC,(LONG)ScrollProc);
//为三个ScrollBar窗口添加WndProc函数,并且获取之前的ScrollBar窗口过程WNDPROC函数

hBrush[i]=CreateSolidBrush(rgb[i]);
//创建三种基本色的画刷

}

hBrushStatic=CreateSolidBrush(GetSysColor(COLOR_BTNHIGHLIGHT));

cyChar=HIWORD(GetDialogBaseUnits());

return 0;

case  WM_SIZE:
cxClient=LOWORD(lParam);
cyClient=HIWORD(lParam);
SetRect(&rect,cxClient/2,0,cxClient,cyClient);

MoveWindow(hwndRect,0,0,cxClient/2,cyClient,TRUE);

for (i=0;i<3;i++)
{
MoveWindow(hwndScroll[i],(2*i+1)*cxClient/14,2*cyChar,cxClient/14,cyClient-4*cyChar,TRUE);
MoveWindow(hwndLabel[i],(4*i+1)*cxClient/28,cyChar/2,cxClient/7,cyChar,TRUE);
MoveWindow(hwndValue[i],(4*i+1)*cxClient/28,cyClient-3*cyChar/2,cxClient/7,cyChar,TRUE);
}
//为ScrollBar初始化位置

SetFocus(hwnd);
//将焦点居于主窗口
return 0;

case  WM_SETFOCUS:
SetFocus(hwndScroll[idfocus]);
return 0;

case  WM_VSCROLL:                            //ScrollBar的控制
i=GetWindowLong((HWND)lParam,GWL_ID);
switch(LOWORD(wParam))
{
case  SB_PAGEDOWN:
color[i]+=15;

case  SB_LINEDOWN:
color[i]=min(255,color[i]+1);
break;

case SB_PAGEUP:
color[i]-=15;

case  SB_LINEUP:
color[i]=max(0,color[i]-1);
break;

case  SB_TOP:
color[i]=0;
break;

case  SB_BOTTOM:
color[i]=255;
break;

case SB_THUMBPOSITION:
case  SB_THUMBTRACK:
color[i]=HIWORD(wParam);
break;

default:
break;

}
SetScrollPos(hwndScroll[i],SB_CTL,color[i],TRUE);
wsprintf(szBuffer,TEXT("%i"),color[i]);
SetWindowText(hwndValue[i],szBuffer);

DeleteObject((HBRUSH)SetClassLong(hwnd,GCL_HBRBACKGROUND,(LONG)CreateSolidBrush(RGB(color[0],color[1],color[2]))));

InvalidateRect(hwnd,&rect,TRUE);

return 0;

case WM_CTLCOLORSCROLLBAR:
i=GetWindowLong((HWND)(lParam),GWL_ID);
return (LRESULT)hBrush[i];

case WM_CTLCOLORSTATIC:
i=GetWindowLong((HWND)lParam,GWL_ID);

if (i>=3&&i<=8)
{
SetTextColor(HDC(wParam),rgb[i%3]);
SetBkColor(HDC(wParam),GetSysColor(COLOR_BTNHIGHLIGHT));
//窗口子类化,为现有的窗口过程设置“钩子”

return (LRESULT)hBrushStatic;

}
break;

case WM_SYSCOLORCHANGE:
DeleteObject(hBrushStatic);
hBrushStatic=CreateSolidBrush(GetSysColor(COLOR_BTNHIGHLIGHT));
return 0;

case WM_DESTROY:
DeleteObject((HBRUSH)
SetClassLong(hwnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(WHITE_BRUSH)));
for (i=0;i<3;i++)
DeleteObject(hBrush[i]);

DeleteObject(hBrushStatic);

PostQuitMessage(0);
return 0;

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

LRESULT CALLBACK ScrollProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
int id=GetWindowLong(hwnd,GWL_ID);
switch(message)
{
case  WM_KEYDOWN:
if (wParam==VK_TAB)
SetFocus(GetDlgItem(GetParent(hwnd),(id+(GetKeyState(VK_SHIFT)<0 ? 2:1))%3));
break;

case  WM_SETFOCUS:
idfocus=id;
break;
}

return CallWindowProc(OldScroll[id],hwnd,message,wParam,lParam);
//对于其他的消息采用旧的窗口回调函数
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐