解决x60桌面右键菜单反应慢的办法
2007-10-27 09:57
309 查看
在SYSMETS1程序的基础上,为窗口添加最重要的元素之一 ——滚动条.
代码注释,如下:
函数原型:
1.
typedef WORD ATOM;
typedef unsigned short WORD;
2.
const RECT* lpRect, //为NULL,表示整个客户区为更新区域
BOOL bErase //如果为TRUE,擦除背景颜色;否则,不擦除.
3.
int nBar, //SB_VERT | SB_HORZ
BOOL bRedraw //一般情况下,滚动条的范围不需要重绘
BOOL bRedraw //滑块的位置,每次更新后必须重绘
代码注释,如下:
//SYSMETS2.cpp #include<windows.h> #include"sysmets.h" LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[]=TEXT("SysMets2"); HWND hWnd; MSG msg; WNDCLASS wndclass; //填充窗口类的10个字段 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=szAppName; //窗口类名 wndclass.lpszMenuName=NULL; wndclass.style=CS_HREDRAW|CS_VREDRAW; //注册窗口类 int retVal=RegisterClass(&wndclass); //失败,返回0;成功,返回非0 if(retVal == 0) { MessageBox(NULL,TEXT("This progrom requires Windows NT !"),szAppName,MB_ICONERROR); return 0; } //创建窗口 hWnd=CreateWindow(szAppName, TEXT("Get System Metrics No.2"), WS_OVERLAPPEDWINDOW | WS_VSCROLL, 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) { static int cxChar,cxCaps,cyChar,cyClient,iVscrollPos; HDC hdc; int i; PAINTSTRUCT ps; TCHAR szBuffer[10]; TEXTMETRIC tm; //消息处理 switch(message){ case WM_CREATE: //CreateWindows函数时,产生该消息(通过调用API产生的消息,均是非队列消息) hdc=GetDC(hWnd); GetTextMetrics(hdc,&tm); cxChar=tm.tmAveCharWidth; cxCaps=(tm.tmPitchAndFamily & 1? 3:2)* cxChar/2; cyChar=tm.tmHeight+tm.tmExternalLeading; ReleaseDC(hWnd,hdc); //设置滚动条的范围和滑块的位置 SetScrollRange(hWnd,SB_VERT,0,NUMLINES-1,FALSE); SetScrollPos(hWnd,SB_VERT,iVscrollPos,TRUE); return 0; case WM_SIZE: //(窗口大小发生变化,产生该消息;紧接着产生WM_PAINT消息) cyClient=HIWORD(lParam); //lParam:低字位,表示客户区的宽度;高字位,是高度. return 0; case WM_VSCROLL: switch(LOWORD(wParam)) //wParam:低字位,表示鼠标在滚动条上的动作 { case SB_LINEUP: iVscrollPos-=1; break; case SB_LINEDOWN: iVscrollPos+=1; break; case SB_PAGEUP: iVscrollPos-=cyClient/cyChar; break; case SB_PAGEDOWN: iVscrollPos+=cyClient/cyChar; break; case SB_THUMBPOSITION: iVscrollPos=HIWORD(wParam); //高字位,表示表示(翻阅之后)滑块的位置 break; default: break; } //如果滑块位置改变,重设为iVscrollPos iVscrollPos=max(0,min(iVscrollPos,NUMLINES-1)); if(GetScrollPos(hWnd,SB_VERT) != iVscrollPos) { SetScrollPos(hWnd,SB_VERT,iVscrollPos,TRUE); InvalidateRect(hWnd,NULL,TRUE); } return 0; case WM_PAINT: hdc=BeginPaint(hWnd,&ps); for(i=0;i<NUMLINES;i++) { TextOut(hdc,0,cyChar*(i-iVscrollPos),sysmetrics.szLabel,lstrlen(sysmetrics[i].szLabel)); TextOut(hdc,22*cxCaps,cyChar*(i-iVscrollPos),sysmetrics[i].szDesc,lstrlen(sysmetrics[i].szDesc)); SetTextAlign(hdc,TA_LEFT|TA_TOP); TextOut(hdc, 22*cxCaps+40*cxChar,cyChar*(i-iVscrollPos), szBuffer,wsprintf(szBuffer,TEXT("%5d"),GetSystemMetrics(sysmetrics[i].iIndex))); SetTextAlign(hdc,TA_LEFT|TA_TOP); } EndPaint(hWnd,&ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hWnd,message,wParam,lParam); }
函数原型:
1.
ATOM RegisterClass( const WNDCLASS* [i]lpWndClass );
typedef WORD ATOM;
typedef unsigned short WORD;
2.
BOOL InvalidateRect( HWND hWnd, const RECT* lpRect, BOOL bErase );
const RECT* lpRect, //为NULL,表示整个客户区为更新区域
BOOL bErase //如果为TRUE,擦除背景颜色;否则,不擦除.
3.
BOOL SetScrollRange( HWND hWnd, int nBar, int nMinPos, int nMaxPos, BOOL bRedraw );
int nBar, //SB_VERT | SB_HORZ
BOOL bRedraw //一般情况下,滚动条的范围不需要重绘
int SetScrollPos( HWND hWnd, int nBar, int nPos, BOOL bRedraw );
BOOL bRedraw //滑块的位置,每次更新后必须重绘
相关文章推荐
- Windows 桌面点击右键反应慢的解决办法
- XP右键新建菜单反应N慢 的解决办法~~
- win7右键我的电脑管理菜单失效的解决办法
- Ubuntu循环登录问题、桌面菜单和侧边栏不显示问题解决办法
- XP桌面右键新建没有word、Excel、Powerpiont的解决办法
- MyEclipse中右键项目Build Path菜单无子菜单的解决办法
- Windows7中右键菜单无新建文本文档选项的解决办法(注册表)
- 电脑装的是office2013,右键新建却是2007,或者右键新建菜单中没有excel2013问题解决办法。
- 右键快捷菜单无共享选项解决办法
- ubuntu14.04,解决Gnome桌面右键菜单失效问题!
- Ubuntu桌面图标消失且右键失效的解决办法
- 织梦DEDECMS网站后台系统菜单点击没有反应的解决办法(除了核心)
- Ubuntu不显示壁纸,桌面右键无反应解决
- dede后台(反应慢)菜单点击就卡,解决办法
- Win7桌面右键弹出菜单慢解决方法!超实用!
- 文件夹右键菜单没有共享和安全的解决办法
- vs201打开右键菜单时,内容过多会显示上下两个小箭头用于隐藏用起来极其讨厌(解决办法)。
- Win8桌面上的网上邻居右键属性没反应是什么情况如何解决
- ubuntu14.04,解决Gnome桌面右键菜单失效问题!
- Win7系统执行操作后桌面右键刷新反应慢的解决方法