win32可以自定义消息
2011-10-16 21:08 捣乱小子 阅读(3733) 评论(0) 收藏 举报#include <windows.h>
#include <process.h>
#include <math.h>
#define CLSNAME "Bigjob1"
#define WNDNAME "yanshi"
#define REP 1000000
#define STATUS_READY 0
#define STATUS_WORKING 1
#define STATUS_DONE 2
#define WM_CALC_DONE (WM_USER+0)
#define WM_CALC_ABORTED (WM_USER+1)
typedef struct
{
HWND hwnd;
BOOL bContinue;
}
PARAMS,*PPARAMS;
LRESULT APIENTRY WindowProc(HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
{
static TCHAR clsname[] = TEXT(CLSNAME);
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WindowProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = clsname ;
if(!::RegisterClass(&wndclass))
{
MessageBox ( NULL,
TEXT ("This program requires Windows NT!"),
clsname,
MB_ICONERROR) ;
return 0 ;
}
HWND hwnd;
hwnd = ::CreateWindow(clsname,TEXT(WNDNAME),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
::ShowWindow(hwnd,SW_SHOW);
::UpdateWindow(hwnd);
MSG msg;
while(::GetMessage(&msg,NULL,0,0)){
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
return msg.wParam;
}
VOID Thread(PVOID pvoid)
{
double A = 1.0;
INT i;
LONG lTime;
volatile PPARAMS pparams;
pparams = (PPARAMS)pvoid;
lTime = ::GetCurrentTime();
for(i=0; i<REP&&pparams->bContinue; i++)
A = ::tan(atan(exp(log(sqrt(A*A)))))+1.0;
if(i == REP)
{
lTime = ::GetCurrentTime();
::SendMessage(pparams->hwnd,WM_CALC_DONE,0,lTime);
}
else
::SendMessage(pparams->hwnd,WM_CALC_ABORTED,0,0);
::_endthread();
}
LRESULT APIENTRY WindowProc(HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
static INT iStatus;
static LONG lTime;
static PARAMS params;
static TCHAR * szMessage[] =
{TEXT("ready(left mouse button begins)"),
TEXT("working(right mouse button ends)"),
TEXT("%d repetitions in %d msec")};
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
TCHAR szBuffer[64];
switch(uMsg)
{
case WM_LBUTTONDOWN:
if(iStatus == STATUS_WORKING)
{
::MessageBeep(0);
return 0;
}
iStatus = STATUS_WORKING;
params.hwnd = hwnd;
params.bContinue = TRUE;
::_beginthread(Thread,0,¶ms);
::InvalidateRect(hwnd,NULL,TRUE);
return 0;
case WM_RBUTTONDOWN:
params.bContinue = FALSE;
return 0;
case WM_CALC_DONE:
lTime =lParam;
iStatus = STATUS_DONE;
::InvalidateRect(hwnd,NULL,TRUE);
return 0;
case WM_CALC_ABORTED:
iStatus = STATUS_READY;
::InvalidateRect(hwnd,NULL,TRUE);
return 0;
case WM_DESTROY:
::PostQuitMessage(0);
return 0;
case WM_PAINT:
hdc = ::BeginPaint(hwnd,&ps);
::GetClientRect(hwnd,&rect);
::wsprintf(szBuffer,szMessage[iStatus],REP,lTime);
::DrawText(hdc,szBuffer,-1,&rect,DT_SINGLELINE|
DT_CENTER|DT_VCENTER);
::EndPaint(hwnd,&ps);
return 0;
}
return ::DefWindowProc(hwnd,uMsg,wParam,lParam);
}
#define WM_CALC_DONE (WM_USER+0)
#define WM_CALC_ABORTED (WM_USER+1)
这两句已经很明显了,可以自定义消息那改多有趣啊!!
更多请访问:http://daoluan.net
浙公网安备 33010602011771号