回 帖 发 新 帖 刷新版面

主题:请问一个关于按钮控件的问题

楼主   

我用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));
}
}
我是初学者,还望各位赐教!!先谢过了!!

回复列表 (共1个回复)

沙发

谢谢大家,我自己解决了这个问题

我来回复

您尚未登录,请登录后再回复。点此登录或注册