本文是,截图: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>