Windows编程基础 第五章 鼠标消息 定时器 菜单

本文是,截图:Windows编程基础 第五章         鼠标消息   定时器    菜单

本文的下载地址是:http://yunpan.cn/cd59jLFGGfZeT  访问密码 79c7




























// windows07.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "windows07.h"
#include "tchar.h"

HINSTANCE g_hInst=NULL;
HANDLE g_hConsole=NULL;

int g_nXPos=0;
int g_nYPos=0;
int nX=0;
int nY=0;
int g_nRectXlefttop=0;
int g_nRectYlefttop=0;
int g_nRectXrightdown=0;
int g_nRectYrightdown=0;

VOID PrintLog(TCHAR * pszLog);
VOID OnPaint(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);

LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	WORD nDetla=0;
	int nDetlaX=0;
	int nDetlaY=0;
	POINT pt={0};
	TCHAR szText[200]=TEXT("");
	TCHAR szTextDetla[200]=TEXT("");
	//这里有一个问题就是:如果我们写成TCHAR szText[]=TEXT("");不指定数组的大小,那么就会出现问题,导致运行的时候出现异常。但是如果我们指定了一个数值之后那么程序就不会出现问题,原因是什么不知道.
	switch(uMsg)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	case WM_LBUTTONDOWN:
		PrintLog(TEXT("WM_LBUTTONDOWN\n"));
		 g_nRectXlefttop=LOWORD(lParam);
		 g_nRectYlefttop=HIWORD(lParam);
		break;
	case WM_LBUTTONUP:
		PrintLog(TEXT("WM_LBUTTONUP\n"));
		 g_nRectXrightdown=LOWORD(lParam);
		 g_nRectYrightdown=HIWORD(lParam);
		 InvalidateRect(hWnd,NULL,TRUE);
		break;
	case WM_RBUTTONDOWN:
		PrintLog(TEXT("WM_RBUTTONDOWN\n"));
		break;
	case WM_RBUTTONUP:
		PrintLog(TEXT("WM_RBUTTONUP\n"));
		break;
	case WM_MBUTTONDOWN:
		PrintLog(TEXT("WM_MBUTTONDOWN\n"));
		break;
	case WM_MBUTTONUP:
		PrintLog(TEXT("WM_MBUTTONUP\n"));
		break;
	case WM_LBUTTONDBLCLK:
		PrintLog(TEXT("WM_LBUTTONDBLCLK\n"));    
		break;
	case WM_RBUTTONDBLCLK:
		PrintLog(TEXT("WM_RBUTTONDBLCLK\n"));
		break;
	case WM_MOUSEMOVE:
		nX=LOWORD(lParam);
		nY=HIWORD(lParam);
		pt.x=nX;
		pt.y=nY;
		ClientToScreen(hWnd,&pt);
		g_nXPos=pt.x;
		g_nYPos=pt.y;
		_stprintf(szText,TEXT("Mouse x Client Position is :%d ,Screen Position is :%d  \nMouse y Client Position is :%d ,Screen Position is :%d\n"),nX,g_nXPos,nY,g_nYPos);
		PrintLog(szText);
		if (wParam&MK_CONTROL)
		{
			PrintLog(TEXT("The  Ctrl  key  is  down!\n"));
		}
		if (wParam&MK_SHIFT)
		{
			PrintLog(TEXT("The  Shift  key  is  down!\n"));
		}
		InvalidateRect(hWnd,NULL,TRUE);
		break;
	case WM_PAINT:
		OnPaint(hWnd,uMsg,wParam,lParam);
		break;		
	case WM_MOUSEWHEEL:
		nDetla=HIWORD(wParam);
		nDetlaX=LOWORD(lParam);
		nDetlaY=HIWORD(lParam);
		_stprintf(szTextDetla,TEXT("WM_MOUSEWHELL:Detla is %d,X=%d,Y=%d\n"),nDetla,nDetlaX,nDetlaY);
		PrintLog(szTextDetla);
	}
	return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

VOID PrintLog(TCHAR * pszLog)
{
	WriteConsole(g_hConsole,pszLog,_tcslen(pszLog),NULL,NULL);
}
VOID OnPaint(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	PAINTSTRUCT ps={0};
	HDC hDC=BeginPaint(hWnd,&ps);
	TCHAR szText[]=TEXT("HELLO MOUSE!");
	TextOut(hDC,nX,nY,szText,_tcslen(szText));
	Rectangle(hDC,g_nRectXlefttop,g_nRectYlefttop,g_nRectXrightdown,g_nRectYrightdown);
	EndPaint(hWnd,&ps);

}

BOOL   RegisterWnd(TCHAR * pszClassName	)
{
	WNDCLASSEX  wce={0};
	wce.cbClsExtra=0;
	wce.cbSize=sizeof(wce);
	wce.cbWndExtra=0;
	wce.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);
	wce.hCursor=NULL;
	wce.hIcon=NULL;
	wce.hIconSm=NULL;
	wce.hInstance=g_hInst;
	wce.lpfnWndProc=WndProc;
	wce.lpszClassName=pszClassName;
	wce.lpszMenuName=NULL;
	wce.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;

	ATOM   result=RegisterClassEx(&wce);
	if (result==0)
	{
		MessageBox(NULL,TEXT("窗口类注册失败!"),TEXT("窗口类注册失败!"),MB_OK);
		return FALSE;
	}
	return TRUE;
}


VOID  DisplayWindow(HWND hWnd)
{
	ShowWindow(hWnd,SW_SHOW);
	UpdateWindow(hWnd);
}

VOID Message()
{
	MSG  msg={0};
	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
}

HWND  CreateMyWindow(TCHAR *  pszClassName)
{
	HWND hWndNew=CreateWindowEx(0,pszClassName,TEXT("在窗口内点击鼠标,移动鼠标。"),WS_OVERLAPPEDWINDOW,50,50,400,400,NULL,NULL,g_hInst,NULL);
	return hWndNew;
}

VOID NewConsole()
{
	AllocConsole();
	g_hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
}

INT WINAPI  WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nShowCmd )
{
	NewConsole();
	RegisterWnd(TEXT("MyWnd"));
	HWND hWnd=CreateMyWindow(TEXT("MyWnd"));
	DisplayWindow(hWnd);
	Message();
	return TRUE;
}


// 演示定时器程序
//

#include "stdafx.h"
#include "windows07.h"
#include "tchar.h"

HINSTANCE g_hInst=NULL;
HANDLE g_hConsole=NULL;

UINT g_TimerID=0;    

VOID PrintLog(TCHAR * pszLog);

VOID OnPaint(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);

VOID CALLBACK TimerProc(HWND hWnd,UINT uMsg,UINT idEvent,DWORD dwTimer)
{
	TCHAR szText[]=TEXT("TimerProc:Hello  Timer ");
	TCHAR szText1[100]=TEXT("");
	TCHAR szText2[200]=TEXT("");
	_stprintf(szText1,TEXT("The Timer ID is %d\n"),idEvent);
	_stprintf(szText2,TEXT("%s : %s"),szText,szText1);
	WriteConsole(g_hConsole,szText2,_tcsclen(szText2),NULL,NULL);
}

VOID OnCreate(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	//创建若干定时器
	SetTimer(hWnd,1000,3*1000,NULL);//指定窗口之后可以不指定定时器处理函数,那么使用的就是窗口的默认的处理函数
	SetTimer(hWnd,1001,5*1000,NULL);
	g_TimerID=SetTimer(hWnd,0,1000,NULL);//这里没有指定定时器的ID,即第二个参数是0,那么系统将返回一个ID

	SetTimer(hWnd,1002,7*1000,TimerProc);
	//SetTimer(NULL,1003,6*1000,NULL); 这种设置定时器的方式将导致程序错误
	SetTimer(NULL,1003,7*1000,TimerProc);
}

VOID OnTimer(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	switch(wParam)
	{
	case 1000:
		{
			TCHAR szText1000[100]=TEXT("1000: Hello Timer!\n");
			WriteConsole(g_hConsole,szText1000,_tcsclen(szText1000),NULL,NULL);
		}
		break;
	case 1001:
		{
			TCHAR szText1001[100]=TEXT("1001: Hello Timer!\n");
			WriteConsole(g_hConsole,szText1001,_tcsclen(szText1001),NULL,NULL);
		}
		break;
	default:
		{
			TCHAR szText[100]=TEXT("");
			_stprintf(szText,TEXT("%d is  the TimerID\n"),g_TimerID);
			WriteConsole(g_hConsole,szText,_tcsclen(szText),NULL,NULL);
		}
	}

}

LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{

	switch(uMsg)
	{
	case WM_DESTROY:
		KillTimer(hWnd,1000);//结束ID为1000的定时器。
		PostQuitMessage(0);
		break;
	case WM_CREATE:
		OnCreate(hWnd,uMsg,wParam,lParam);
		break;
	case WM_TIMER:
		OnTimer(hWnd,uMsg,wParam,lParam);
		break;
	}
	return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

VOID PrintLog(TCHAR * pszLog)
{
	WriteConsole(g_hConsole,pszLog,_tcslen(pszLog),NULL,NULL);
}


BOOL   RegisterWnd(TCHAR * pszClassName	)
{
	WNDCLASSEX  wce={0};
	wce.cbClsExtra=0;
	wce.cbSize=sizeof(wce);
	wce.cbWndExtra=0;
	wce.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);
	wce.hCursor=NULL;
	wce.hIcon=NULL;
	wce.hIconSm=NULL;
	wce.hInstance=g_hInst;
	wce.lpfnWndProc=WndProc;
	wce.lpszClassName=pszClassName;
	wce.lpszMenuName=NULL;
	wce.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;

	ATOM   result=RegisterClassEx(&wce);
	if (result==0)
	{
		MessageBox(NULL,TEXT("窗口类注册失败!"),TEXT("窗口类注册失败!"),MB_OK);
		return FALSE;
	}
	return TRUE;
}


VOID  DisplayWindow(HWND hWnd)
{
	ShowWindow(hWnd,SW_SHOW);
	UpdateWindow(hWnd);
}

VOID Message()
{
	MSG  msg={0};
	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
}

HWND  CreateMyWindow(TCHAR *  pszClassName)
{
	HWND hWndNew=CreateWindowEx(0,pszClassName,TEXT("定时器使用程序!"),WS_OVERLAPPEDWINDOW,50,50,400,400,NULL,NULL,g_hInst,NULL);
	return hWndNew;
}

VOID NewConsole()
{
	AllocConsole();
	g_hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
}

INT WINAPI  WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nShowCmd )
{
	NewConsole();
	RegisterWnd(TEXT("MyWnd"));
	HWND hWnd=CreateMyWindow(TEXT("MyWnd"));
	DisplayWindow(hWnd);
	Message();
	return TRUE;
}

// 本程序用来演示菜单
//

#include "stdafx.h"
#include "windows08.h"
#include "stdio.h"
#include "windows.h"

HINSTANCE g_hInst=NULL;
HANDLE g_hConsole=NULL;
BOOL  g_bCheckedCut=FALSE;

VOID OnCreate(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{

	HMENU hMainMenu=CreateMenu();//创建主菜单
	HMENU hFileMenu=CreatePopupMenu();//创建弹出式子菜单------文件菜单
	AppendMenu(hFileMenu,MF_STRING|MF_CHECKED,1001,TEXT("新建(&N)"));//添加一个(新建)菜单项
	AppendMenu(hFileMenu,MF_SEPARATOR,0,NULL);//添加一个分隔栏,既然是分隔栏,那么肯定 ID=0
	AppendMenu(hFileMenu,MF_STRING,1002,TEXT("退出(&X)"));//添加一个(退出)菜单项
	AppendMenu(hMainMenu,MF_STRING|MF_POPUP,(UINT)hFileMenu,TEXT("文件(&F)"));//把弹出式子菜单项添加到主菜单上,命名子菜单为(文件)菜单项

	HMENU  hEditMenu=CreatePopupMenu();//创建弹出式子菜单------编辑菜单
	AppendMenu(hEditMenu,MF_STRING,1003,TEXT("剪切(&T)"));
	AppendMenu(hEditMenu,MF_STRING,1004,TEXT("拷贝(&C)"));
	AppendMenu(hEditMenu,MF_STRING,1005,TEXT("粘贴(&P)"));
	AppendMenu(hMainMenu,MF_STRING|MF_POPUP,(UINT)hEditMenu,TEXT("编辑(&E)"));

	HMENU  hHelpMenu=CreatePopupMenu();//创建弹出式子菜单------编辑菜单
	AppendMenu(hHelpMenu,MF_STRING,1006,TEXT("帮助(&H)"));
	AppendMenu(hHelpMenu,MF_STRING,1007,TEXT("关于(&A)"));
	AppendMenu(hMainMenu,MF_STRING|MF_POPUP,(UINT)hHelpMenu,TEXT("帮助(&E)"));

	SetMenu(hWnd,hMainMenu);
}

VOID OnCommand(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	TCHAR szText[100]=TEXT("");
	_stprintf(szText,TEXT("The  ID of MENU  item is :%d"),LOWORD(wParam));
	WriteConsole(g_hConsole,szText,_tcslen(szText),NULL,NULL);
	switch(LOWORD(wParam))
	{
	case 1002:
		PostMessage(hWnd,WM_QUIT,0,0);
		break;
	case 1007:
		MessageBox(NULL,TEXT("这是“关于”菜单项弹出的信息框!"),TEXT("关于"),MB_OK);
		break;
	case 1003:
		g_bCheckedCut=!g_bCheckedCut;
		break;
	}

}

VOID OnInitMenuPopUp(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	HMENU hMenu=(HMENU)(wParam);
	if (TRUE==g_bCheckedCut)
	{
		CheckMenuItem(hMenu,1003,MF_CHECKED);
	}
	else
	{
		CheckMenuItem(hMenu,1003,MF_UNCHECKED|MF_BYCOMMAND);
		/*MF_BYCOMMAND:
		Indicates that the uIDCheckItem parameter gives the identifier of the menu item. 
		The MF_BYCOMMAND flag is the default, if neither the MF_BYCOMMAND nor MF_BYPOSITION flag is specified.
		*/
	}

}

LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{

	switch(uMsg)
	{
	case WM_DESTROY:
		KillTimer(hWnd,1000);//结束ID为1000的定时器。
		PostQuitMessage(0);
		break;
	case WM_CREATE:
		OnCreate(hWnd,uMsg,wParam,lParam);
		break;
	case WM_COMMAND:
		OnCommand(hWnd,uMsg,wParam,lParam);
		break;
	case WM_INITMENUPOPUP:
		//这个消息是在点击菜单项,而且是菜单项弹出之前,由系统发送给窗口的。通过这个消息,可以更新菜单项。
		OnInitMenuPopUp(hWnd,uMsg,wParam,lParam);
		break;		
	}
	return DefWindowProc(hWnd,uMsg,wParam,lParam);
}



BOOL   RegisterWnd(TCHAR * pszClassName	)
{
	WNDCLASSEX  wce={0};
	wce.cbClsExtra=0;
	wce.cbSize=sizeof(wce);
	wce.cbWndExtra=0;
	wce.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);
	wce.hCursor=NULL;
	wce.hIcon=NULL;
	wce.hIconSm=NULL;
	wce.hInstance=g_hInst;
	wce.lpfnWndProc=WndProc;
	wce.lpszClassName=pszClassName;
	wce.lpszMenuName=NULL;
	wce.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;

	ATOM   result=RegisterClassEx(&wce);
	if (result==0)
	{
		MessageBox(NULL,TEXT("窗口类注册失败!"),TEXT("窗口类注册失败!"),MB_OK);
		return FALSE;
	}
	return TRUE;
}

VOID  DisplayWindow(HWND hWnd)
{
	ShowWindow(hWnd,SW_SHOW);
	UpdateWindow(hWnd);
}

VOID Message()
{
	MSG  msg={0};
	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
}

HWND  CreateMyWindow(TCHAR *  pszClassName)
{
	HWND hWndNew=CreateWindowEx(0,pszClassName,TEXT("创建菜单!"),WS_OVERLAPPEDWINDOW,50,50,400,400,NULL,NULL,g_hInst,NULL);
	return hWndNew;
}

VOID NewConsole()
{
	AllocConsole();
	g_hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
}

INT WINAPI  WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nShowCmd )
{
	NewConsole();
	RegisterWnd(TEXT("MyWnd"));
	HWND hWnd=CreateMyWindow(TEXT("MyWnd"));
	DisplayWindow(hWnd);
	Message();
	return TRUE;
}





</pre><pre>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值