- 主题
- 72
- 帖子
- 361
- 精华
- 0
- 积分
- 714
- C币
- 652 枚
- 在线时间
- 62 小时
- 注册时间
- 2010-7-9
- 最后登录
- 2012-5-12
- 性别
- 保密
 
- 主题
- 72
- 帖子
- 361
- C币
- 652 枚
- 在线时间
- 62 小时
|
- /*
- 本实例程序演示Static控件和scroll控件的创建和使用
- */
- #include <windows.h>
- #include <winuser.h>
- LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
- LRESULT CALLBACK ScrollProc(HWND,UINT,WPARAM,LPARAM);
- int idFocus;
- WNDPROC OldScroll[3];
- int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iShowCmd)
- {
- TCHAR AppCaption[]=TEXT("Static and scroll control example!");
- TCHAR ClassName[]=TEXT("StaticScroll");
- 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=WndProc;
- wndclass.lpszClassName=ClassName;
- wndclass.lpszMenuName=NULL;
- wndclass.style=CS_HREDRAW | CS_VREDRAW;
- RegisterClass(&wndclass);
- hwnd=CreateWindow(ClassName,AppCaption,WS_OVERLAPPEDWINDOW|WS_HSCROLL,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
- ShowWindow(hwnd,iShowCmd);
- 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)
- {
- TCHAR lbCaption[]=TEXT("First Label"); //定义Label控件的显示的文字内容指针
- HINSTANCE hInstance;
- static COLORREF crPrim[3]={RGB(255,0,0),RGB(0,255,0),RGB(0,0,255)};
- static HBRUSH hBrush[3],
- hBrushStatic;
- static HWND hScroll[3],
- hLabel[3],
- hValue[3],
- hRect;
- static int color[3],
- cyChar;
- static RECT rcColor;
- static RECT rcDraw;
- PAINTSTRUCT ps;
- HDC hdc;
- static TCHAR *szColorLabel[]={TEXT("Red"),TEXT("Green"),TEXT("Blue")};
- int i;
- static int cxClient,
- cyClient;
- TCHAR szBuffer[10];
- switch(message)
- {
- case WM_CREATE:
- hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
- /*
- 函数功能:
- 该函数获得有关指定窗口的信息,函数也获得在额外窗口内存中指定偏移位地址的32位度整型值
- 函数原型:
- WINUSERAPI LONG WINAPI GetWindowLongA(HWND hWnd,
- int nIndex);
- WINUSERAPI LONG WINAPI GetWindowLongW(HWND hWnd,
- int nIndex);
- #ifdef UNICODE
- #define GetWindowLong GetWindowLongW
- #else
- #define GetWindowLong GetWindowLongA
- #endif // !UNICODE
- 函数参数:
- hWnd:窗口句柄及间接给出的窗口所属的窗口类。
- nlndex:指定要获得值的大于等于0的值的偏移量。有效值的范围从0到额外窗口内存空间的字节数一4
- 例如,若指定了12位或多于12位的额外类存储空间,则应设为第三个32位整数的索引位8。要获得任意其他值,
- 指定下列值之一:
- GWL_EXSTYLE;获得扩展窗口风格。
- GWL_STYLE:获得窗口风格。
- GWL_WNDPROC:获得窗口过程的地址,或代表窗口过程的地址的句柄。必须使用GWL_WNDPROC函数调用窗口过程。
- GWL_HINSTANCE:获得应用事例的句柄。
- GWL_HWNDPAAENT:如果父窗口存在,获得父窗口句柄。
- GWL_ID:获得窗口标识。
- GWL_USERDATA:获得与窗口有关的32位值。每一个窗口均有一个由创建该窗口的应用程序使用的32位值。
- 在hWnd参数标识了一个对话框时也可用下列值:
- DWL_DLGPROC:获得对话框过程的地址,或一个代表对话框过程的地址的句柄。必须使用函数CallWindowProc来调用对话框过程。
- DWL_MSGRESULT:获得在对话框过程中一个消息处理的返回值。
- DWL_USER:获得应用程序私有的额外信息,例如一个句柄或指针。
- 返回值:
- 如果函数成功,返回值是所需的32位值;如果函数失败,返回值是0。若想获得更多错误信息请调用 GetLastError函数。
- */
- cxClient=GetSystemMetrics(SM_CXSCREEN);
- cyClient=GetSystemMetrics(SM_CYSCREEN);
- /*
- GetSystemMetrics函数参数nIndex的定义
- SM_ARRANGE 返回是否预备最小化.
- SM_CLEANBOOT 返回系统启动方式:
- 0 正常启动
- 1 安全模式启动
- 2 网络安全模式启动
- SM_CMOUSEBUTTONS 返回值为系统支持的鼠标键数,返回0,则系统中没有安装鼠标。
- SM_CXBORDER,
- SM_CYBORDER 返回以相素值为单位的Windows窗口边框的宽度和高度,如果Windows的为3D形态,则等同于SM_CXEDGE参数
- SM_CXCURSOR,
- SM_CYCURSOR 返回以相素值为单位的标准光标的宽度和高度
- SM_CXDLGFRAME,
- SM_CYDLGFRAME 等同与SM_CXFIXEDFRAME and SM_CYFIXEDFRAME
- SM_CXDOUBLECLK,
- SM_CYDOUBLECLK 以相素值为单位的双击有效的矩形区域
- SM_CXEDGE,SM_CYEDGE 以相素值为单位的3D边框的宽度和高度
- SM_CXFIXEDFRAME,
- SM_CYFIXEDFRAME 围绕具有标题但无法改变尺寸的窗口(通常是一些对话框)的边框的厚度
- SM_CXFRAME,SM_CYFRAME 等同于SM_CXSIZEFRAME and SM_CYSIZEFRAME
- SM_CXFULLSCREEN,
- SM_CYFULLSCREEN 全屏幕窗口的窗口区域的宽度和高度
- SM_CXHSCROLL,
- SM_CYHSCROLL 水平滚动条的高度和水平滚动条上箭头的宽度
- SM_CXHTHUMB 以相素为单位的水平滚动条上的滑动块宽度
- SM_CXICON,SM_CYICON 系统缺省的图标的高度和宽度(一般为32*32)
- SM_CXICONSPACING,
- SM_CYICONSPACING 以大图标方式查看Item时图标之间的间距,这个距离总是大于等于
- SM_CXICON and SM_CYICON.
- SM_CXMAXIMIZED,
- SM_CYMAXIMIZED 处于顶层的最大化窗口的缺省尺寸
- SM_CXMAXTRACK,
- SM_CYMAXTRACK 具有可改变尺寸边框和标题栏的窗口的缺省最大尺寸,如果窗口大于这个尺寸,窗口是不可移动的。
- SM_CXMENUCHECK,
- SM_CYMENUCHECK 以相素为单位计算的菜单选中标记位图的尺寸
- SM_CXMENUSIZE,
- SM_CYMENUSIZE 以相素计算的菜单栏按钮的尺寸
- SM_CXMIN,SM_CYMIN 窗口所能达到的最小尺寸
- SM_CXMINIMIZED,
- SM_CYMINIMIZED 正常的最小化窗口的尺寸
- SM_CXMINTRACK,
- SM_CYMINTRACK 最小跟踪距离,当使用者拖动窗口移动距离小于这个值,窗口不会移动。
- SM_CXSCREEN,
- SM_CYSCREEN 以相素为单位计算的屏幕尺寸。
- SM_CXSIZE,SM_CYSIZE 以相素计算的标题栏按钮的尺寸
- SM_CXSIZEFRAME,
- SM_CYSIZEFRAME 围绕可改变大小的窗口的边框的厚度
- SM_CXSMICON,
- SM_CYSMICON 以相素计算的小图标的尺寸,小图标一般出现在窗口标题栏上。
- M_CXVSCROLL,
- SM_CYVSCROLL 以相素计算的垂直滚动条的宽度和垂直滚动条上箭头的高度
- SM_CYCAPTION 以相素计算的普通窗口标题的高度
- SM_CYMENU 以相素计算的单个菜单条的高度
- SM_CYSMCAPTION 以相素计算的窗口小标题栏的高度
- SM_CYVTHUMB 以相素计算的垂直滚动条中滚动块的高度
- SM_DBCSENABLED 如果为TRUE或不为0的值表明系统安装了双字节版本的USER.EXE,为FALSE或0则不是。
- SM_DEBUG 如果为TRUE或不为0的值表明系统安装了debug版本的USER.EXE,为FALSE或0则不是。
- SM_MENUDROPALIGNMENT 如果为TRUE或不为0的值下拉菜单是右对齐的否则是左对齐的。
- SM_MOUSEPRESENT 如果为TRUE或不为0的值则安装了鼠标,否则没有安装。
- SM_MOUSEWHEELPRESENT 如果为TRUE或不为0的值则安装了滚轮鼠标,否则没有安装。(Windows NT only)
- SM_SWAPBUTTON 如果为TRUE或不为0的值则鼠标左右键交换,否则没有。
- */
- hRect=CreateWindow( TEXT("static"),
- TEXT("0"),
- WS_CHILD | WS_VISIBLE | SS_BLACKFRAME,
- 0,
- 0,
- cxClient/2,
- cyClient,
- hwnd,
- (HMENU)9,
- hInstance,
- NULL);
- rcDraw.left=0;
- rcDraw.top=0;
- rcDraw.right=cxClient/2;
- rcDraw.bottom=cyClient;
- for(i=0;i<3;i++)
- {
- hScroll[i]=CreateWindow(TEXT("SCROLLBAR"),
- NULL,WS_CHILD|WS_VISIBLE|WS_TABSTOP|SBS_VERT,
- 0,0,0,0,
- hwnd,
- (HMENU)i,
- hInstance,
- NULL);
-
- SetScrollRange(hScroll[i],SB_CTL,0,255,FALSE);
- SetScrollPos(hScroll[i],SB_CTL,0,FALSE);
-
- hLabel[i]=CreateWindow(TEXT("static"),
- szColorLabel[i],
- WS_CHILD|WS_VISIBLE|SS_CENTER,
- 0,0,0,0,
- hwnd,
- (HMENU)(i+3),
- hInstance,
- NULL);
- hValue[i]=CreateWindow(TEXT("static"),
- TEXT("0"),WS_CHILD|WS_VISIBLE|SS_CENTER,
- 0,0,0,0,
- hwnd,
- (HMENU)(i+6),
- hInstance,
- NULL);
- OldScroll[i]=(WNDPROC)SetWindowLong(hScroll[i],GWL_WNDPROC,(LONG)ScrollProc);
- /*
- */
- hBrush[i]=CreateSolidBrush(crPrim[i]);
- }
- hBrushStatic=CreateSolidBrush(GetSysColor(COLOR_BTNHIGHLIGHT));
- cyChar=HIWORD(GetDialogBaseUnits());
- return 0;
- case WM_SIZE:
- cxClient=LOWORD(lParam);
- cyClient=HIWORD(lParam);
-
- SetRect(&rcColor,cyClient/2,0,cxClient,cyClient);
- /*
- BOOL SetRect(
- __out LPRECT lprc,
- __in int xLeft,
- __in int yTop,
- __in int xRight,
- __in int yBottom
- );
- 参数
- lprc [out] 指向RECT 结构的指针,该指针包含了所要设置的矩形。
- xLeft [in] 指定矩形左上角的X坐标。
- yTop [in] 指定矩形左上角的Y坐标。
- xRight [in] 指定矩形右下角的X坐标。
- yBottom [in] 指定矩形右下角的Y坐标。
- 返回值
- 如果函数超过,返回非零值;否则返回零值。
- */
- MoveWindow(hRect,0,0,cxClient/2,cyClient,TRUE);
- /*
- 函数原型:BOOL MoveWindow( HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint );
- WINUSERAPI BOOL WINAPI MoveWindow(HWND hWnd,
- int X,
- int Y,
- int nWidth,
- int nHeight,
- BOOL bRepaint
- );
- 函数功能:
- 该函数改变指定窗口的位置和尺寸。
- 对于顶层窗口,位置和尺寸是相对于屏幕的左上角的:
- 对于子窗口,位置和尺寸是相对于父窗口客户区的左上角坐标的。
-
- hWnd:窗口句柄。
- x:指定窗口的新位置的左边界。
- Y:指定窗口的新位置的顶部边界
- nWidth:指定窗口的新的宽度。
- nHaight:指定窗口的新的高度。
- bRepaint:确定窗口是否被刷新。
- 如果该参数为TRUE,窗口接收一个WM_PAINT消息;
- 如果参数为FALSE,不发生任何刷新动作。
- 它适用于客户区,非客户区(包括标题栏和滚动条),及由于移动子窗口而露出的父窗口的区域。
- 如果参数为FALSE,应用程序就必须明确地使窗口无效或重画该窗口和需要刷新的父窗口。
- 返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。若想获得更多错误信息,请调用GetLastError函数。
- */
- for(i=0;i<3;i++)
- {
- MoveWindow(hScroll[i],(2*i+1)*cxClient/14,2*cyChar,cxClient/14,cyClient-4*cyChar,TRUE);
- MoveWindow(hLabel[i],(4*i+1)*cyClient/28,cyChar/2,cxClient/7,cyChar,TRUE);
- MoveWindow(hValue[i],(4*i+1)*cxClient/28,cyClient-3*cyChar/2,cxClient/7,cyChar,TRUE);
- SetFocus(hwnd);
- }
- //case WM_PAINT:
- // hdc=BeginPaint(hwnd,&ps);
- // FillRect(hdc,&rcDraw,(HBRUSH)GetStockObject(GRAY_BRUSH));
- // EndPaint(hwnd,&ps);
- return 0;
- case WM_SETFOCUS:
- SetFocus(hScroll[idFocus]);
- return 0;
- case WM_HSCROLL:
- 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(hScroll[i],SB_CTL,color[i],TRUE);
- wsprintf(szBuffer,TEXT("%i"),color[i]);
- SetWindowText(hValue[i],szBuffer);
- DeleteObject((HBRUSH)SetClassLong(hwnd,GCL_HBRBACKGROUND,(LONG)CreateSolidBrush(RGB(color[0],color[1],color[2]))));
- InvalidateRect(hwnd,&rcColor,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,crPrim[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(VK_TAB==wParam)
- SetFocus(GetDlgItem(GetParent(hwnd),(id+(GetKeyState(VK_SHIFT)<0?2:0))%3));
- break;
- case WM_SETFOCUS:
- idFocus=id;
- break;
- }
- return DefWindowProc(hwnd,message,wParam,lParam);
- }
复制代码 |
|