主题:请问一个关于按钮控件的问题
楼主
我用VC++的API函数编程,做了一个运动的方框,我又想加上按钮,使程序响应我的按钮消息来控制方框运行的状态,我的思想是:由鼠标点击按钮,产生WM_COMMAND消息,在其中经过判断后刷新显示InvalidateRect(hWnd,NULL,1),由此产生WM_PAINT消息,以进入绘图部分!在绘图部分中由于要显示运动效果,要不停的i++,同时不停的刷新显示,这样一刷新后就把我原来做的按钮刷没了,我想请问一下怎么做才能让刷新的时候不把我原来的按钮刷掉呢??
我的程序代码如下:
#include<windows.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define IDB1 104
long WINAPI WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam);
HWND hBtn1;
HINSTANCE hInst;
long i=0,j=0;
long lcenterx=0,lcentery=0;
int a=0;
POINT lpline[600];
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{MSG Message;
HWND hWnd;
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="editinstance";
WndClass.lpszMenuName=NULL;
WndClass.style=0;
if(!RegisterClass(&WndClass))
{MessageBeep(0);
return FALSE;
}
hWnd=CreateWindow("editinstance",
"控件",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
hInst=hInstance;
for(int j=0;j<600;j++)
{lpline[j].x=(long)(1);
lpline[j].y=(long)(1+j);
}
while(GetMessage(&Message,0,0,0))
{TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}
long WINAPI WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{HDC hdc;
HPEN hpen;
HBRUSH hbrush;
PAINTSTRUCT ptstr;
static BOOL nUpKeyDown=FALSE;
switch(iMessage)
{case WM_CREATE:
hBtn1=CreateWindow("BUTTON",
"1",
WS_CHILD|WS_VISIBLE,
100,120,
25,25,
hWnd,
(HMENU)IDB1,
hInst,
NULL);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{case IDB1:
nUpKeyDown=TRUE;
a=540;
InvalidateRect(hWnd,NULL,1);
break;
}
break;
case WM_PAINT:
hdc=BeginPaint(hWnd,&ptstr);
SetWindowOrgEx(hdc,-200,-50,NULL);
hpen=(HPEN)(GetStockObject(BLACK_PEN));
hbrush=(HBRUSH)(GetStockObject(BLACK_BRUSH));
SelectObject(hdc,hbrush);
SelectObject(hdc,hpen);
if(nUpKeyDown==TRUE)
{lcenterx=lpline[i].x;
lcentery=lpline[i].y+30;
Polyline(hdc,lpline,600);
RoundRect(hdc,lcenterx-20,lcentery-20,lcenterx+20,lcentery+20,15,15);
i++;
DeleteObject(hpen);
DeleteObject(hbrush);
EndPaint(hWnd,&ptstr);
Sleep(25);
if(i<a) InvalidateRect(hWnd,NULL,1);
//nUpKeyDown=FALSE;
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
}
我是初学者,还望各位赐教!!先谢过了!!
我用VC++的API函数编程,做了一个运动的方框,我又想加上按钮,使程序响应我的按钮消息来控制方框运行的状态,我的思想是:由鼠标点击按钮,产生WM_COMMAND消息,在其中经过判断后刷新显示InvalidateRect(hWnd,NULL,1),由此产生WM_PAINT消息,以进入绘图部分!在绘图部分中由于要显示运动效果,要不停的i++,同时不停的刷新显示,这样一刷新后就把我原来做的按钮刷没了,我想请问一下怎么做才能让刷新的时候不把我原来的按钮刷掉呢??
我的程序代码如下:
#include<windows.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define IDB1 104
long WINAPI WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam);
HWND hBtn1;
HINSTANCE hInst;
long i=0,j=0;
long lcenterx=0,lcentery=0;
int a=0;
POINT lpline[600];
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{MSG Message;
HWND hWnd;
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="editinstance";
WndClass.lpszMenuName=NULL;
WndClass.style=0;
if(!RegisterClass(&WndClass))
{MessageBeep(0);
return FALSE;
}
hWnd=CreateWindow("editinstance",
"控件",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
hInst=hInstance;
for(int j=0;j<600;j++)
{lpline[j].x=(long)(1);
lpline[j].y=(long)(1+j);
}
while(GetMessage(&Message,0,0,0))
{TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}
long WINAPI WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{HDC hdc;
HPEN hpen;
HBRUSH hbrush;
PAINTSTRUCT ptstr;
static BOOL nUpKeyDown=FALSE;
switch(iMessage)
{case WM_CREATE:
hBtn1=CreateWindow("BUTTON",
"1",
WS_CHILD|WS_VISIBLE,
100,120,
25,25,
hWnd,
(HMENU)IDB1,
hInst,
NULL);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{case IDB1:
nUpKeyDown=TRUE;
a=540;
InvalidateRect(hWnd,NULL,1);
break;
}
break;
case WM_PAINT:
hdc=BeginPaint(hWnd,&ptstr);
SetWindowOrgEx(hdc,-200,-50,NULL);
hpen=(HPEN)(GetStockObject(BLACK_PEN));
hbrush=(HBRUSH)(GetStockObject(BLACK_BRUSH));
SelectObject(hdc,hbrush);
SelectObject(hdc,hpen);
if(nUpKeyDown==TRUE)
{lcenterx=lpline[i].x;
lcentery=lpline[i].y+30;
Polyline(hdc,lpline,600);
RoundRect(hdc,lcenterx-20,lcentery-20,lcenterx+20,lcentery+20,15,15);
i++;
DeleteObject(hpen);
DeleteObject(hbrush);
EndPaint(hWnd,&ptstr);
Sleep(25);
if(i<a) InvalidateRect(hWnd,NULL,1);
//nUpKeyDown=FALSE;
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
}
我是初学者,还望各位赐教!!先谢过了!!