• win32可以自定义消息


    #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,&params);
    
    		::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)

    这两句已经很明显了,可以自定义消息那改多有趣啊!!

  • 相关阅读:
    U盘无法格式化的恢复
    ubuntu14.04下libvmi 编译安装使用
    随意模型的折纸效果 Folding effect
    使用 C# 开发智能手机软件:推箱子(二十二)
    bzoj4393【Usaco2015 Dec】Fruit Feast
    ANDROID内存优化(大汇总——中)
    游戏编程里面有哪些经典或者非常酷的算法?
    S3C2440电阻触摸屏驱动设计
    Android Studio高速定位当前打开的文件在哪个文件夹(package)下
    NOI2006最大获利
  • 原文地址:https://www.cnblogs.com/daoluanxiaozi/p/2214336.html
Copyright © 2020-2023  润新知