读书人

可以依据滚动条的调整从而改变stati

发布时间: 2013-01-12 16:25:03 作者: rapoo

可以根据滚动条的调整,从而改变static的颜色背景
预期结果:

窗口左边有3个滚动条,右边有个static控件。

可以根据滚动条的调整,从而改变这个static的颜色背景。


说明:

hwndScroll------------3个滚动条

hwndRect--------------窗口右边的static控件


没有达到预期的结果.

代码:



LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static COLORREF crPrim[3] = { RGB (255, 0, 0), RGB (0, 255, 0),
RGB (0, 0, 255) } ;
static HBRUSH hBrush[3] ;
static HWND hwndScroll[3], hwndLabel[3], hwndRect ;
static int color[3], cyChar ;
static RECT rcColor ;
static TCHAR * szColorLabel[] = { TEXT ("Red"), TEXT ("Green"),
TEXT ("Blue") } ;
HINSTANCE hInstance ;
int i, cxClient, cyClient ;
TCHAR szBuffer[10] ;

switch (message)
{
case WM_CREATE :
{
hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);

hwndRect=CreateWindow("static",NULL,WS_VISIBLE|WS_CHILD,0,0,0,0,hwnd,(HMENU)9,hInstance,NULL);


//hwndScrollhwndLabel

for(i=0;i<3;i++)
{
hwndScroll[i]=CreateWindow("scrollbar",NULL,WS_VISIBLE|WS_CHILD|WS_TABSTOP|SBS_VERT,0,0,0,0,hwnd,(HMENU)i,hInstance,NULL);
hwndLabel[i]=CreateWindow("static",szColorLabel[i],WS_VISIBLE|WS_CHILD|SS_CENTER,0,0,0,0,hwnd,(HMENU)(i+3),hInstance,NULL);
hBrush[i]=CreateSolidBrush(crPrim[i]);
}

cyChar=HIWORD(GetDialogBaseUnits());

SetScrollRange(hwndScroll[i],SB_CTL,0,255,FALSE);
SetScrollPos(hwndScroll[i],SB_CTL,0,FALSE);

return 0 ;

}
break;

case WM_VSCROLL:
{

i=GetWindowLong(hwnd,GWL_ID);
switch (LOWORD(wParam))
{

case SB_PAGEDOWN:
color[i]+=15;
break;
case SB_PAGEUP:
color[i]-=15;
break;

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

case SB_LINEUP:
color[i]=min(255,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;


}//end switch

//修改
SetScrollPos(hwndScroll[i],SB_CTL,color[i],TRUE);
DeleteObject((HBRUSH)SetClassLong(hwnd,GCL_HBRBACKGROUND,(LONG)CreateSolidBrush(RGB(color[0],color[1],color[2]))));
InvalidateRect(hwnd,&rcColor,TRUE);
return 0;
}
break;


case WM_SIZE :
{
cxClient=LOWORD(lParam);
cyClient=HIWORD(lParam);

SetRect(&rcColor,cxClient/2,0,cxClient,cyClient);

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

//hwndLabelhwndScroll
for(i=0;i<3;i++)
{
MoveWindow(hwndLabel[i],(2*i+1)*cxClient/14,cyChar/2,cxClient/14,cyClient/15,TRUE);
MoveWindow(hwndScroll[i],(2*i+1)*cxClient/14,cyChar+cyClient/15,cxClient/14,cyClient*12/15,TRUE);

}

return0;

}
break;


case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;

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


[解决办法]
3个滚动条代表 RGB,(0-》255)
static 的背景颜色是 这3个滚动条的: RGB(滚动条1,滚动条2,滚动条3)
[解决办法]
i=GetWindowLong(hwnd,GWL_ID);
你这是返回的窗口ID啊,而color[i]中i只能取0,1,2,你调试下看看i是取的多少,
但是我想即使取的[0,2],那也是固定不变的,因为你始终获取的是窗口的ID,而不是滚动条的ID
[解决办法]
SetScrollRange 没放到循环里,循环结束后i变成了3

for(i=0;i<3;i++)
{
hwndScroll[i]=CreateWindow("scrollbar",NULL,WS_VISIBLE
[解决办法]
WS_CHILD
[解决办法]
WS_TABSTOP
[解决办法]
SBS_VERT,0,0,0,0,hwnd,(HMENU)i,hInstance,NULL);
hwndLabel[i]=CreateWindow("static",szColorLabel[i],WS_VISIBLE
[解决办法]
WS_CHILD
[解决办法]
SS_CENTER,0,0,0,0,hwnd,(HMENU)(i+3),hInstance,NULL);
hBrush[i]=CreateSolidBrush(crPrim[i]);
SetScrollRange(hwndScroll[i],SB_CTL,0,255,FALSE);
SetScrollPos(hwndScroll[i],SB_CTL,0,FALSE);
}

读书人网 >VC/MFC

热点推荐