您的位置:首页 > 其它

解决x60桌面右键菜单反应慢的办法

2007-10-27 09:57 309 查看
在SYSMETS1程序的基础上,为窗口添加最重要的元素之一 ——滚动条.

代码注释,如下:

//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 //滑块的位置,每次更新后必须重绘
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: