《Windows程序设计》之HEXCALC

#include <Windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
	static TCHAR szAppName[]=TEXT("HexCalc");
	MSG msg;
	HWND hwnd;
	WNDCLASS wndclass;

	wndclass.style=CS_HREDRAW|CS_VREDRAW;
	wndclass.lpfnWndProc=WndProc;
	wndclass.cbClsExtra=0;
	//注册自己的对话框时,所必须的
	wndclass.cbWndExtra=DLGWINDOWEXTRA;
	wndclass.hInstance=hInstance;
	wndclass.hIcon=LoadIcon(hInstance,szAppName);
	wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
	wndclass.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);
	wndclass.lpszMenuName=NULL;
	wndclass.lpszClassName=szAppName;

	if(!RegisterClass(&wndclass))
	{
		MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);
		return 0;
	}
	hwnd=CreateDialog(hInstance,szAppName,0,NULL);
	ShowWindow(hwnd,iCmdShow);
	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

void ShowNumber(HWND hwnd,UINT iNumber)
{
	TCHAR szBuffer[20];
	wsprintf(szBuffer,TEXT("%X"),iNumber);
	//VK_ESCAPE是什么意思
	SetDlgItemText(hwnd,VK_ESCAPE,szBuffer);
}

DWORD CalcIt(UINT iFirstNum,int iOperatation,UINT iNum)
{
	switch(iOperatation)
	{
	case '=':return iNum;
	case '+':return iFirstNum+iNum;
	case '-':return iFirstNum-iNum;
	case '*':return iFirstNum*iNum;
	case '&':return iFirstNum&iNum;
	case '|':return iFirstNum|iNum;
	case '^':return iFirstNum^iNum;
	case '<':return iFirstNum<<iNum;
	case '>':return iFirstNum>>iNum;
	case '/':return iNum?iFirstNum/iNum:MAXDWORD;
	case '%':return iNum?iFirstNum%iNum:MAXDWORD;
	default:return 0;
	}
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	static BOOL bNewNumber=TRUE;
	static int iOperation='=';
	static UINT iNumber,iFirstNum;
	HWND hButton;
	switch(message)
	{
	//下面的很多都没有加break,直接顺序执行下去,注意顺序不能改
	////////////////////////////////////////////////
	//当按下一个按键时,会触发三个消息WM_KEYDOWN,WM_CHAR,WM_KEYUP
	//当按下的不是方向左键时,系统就不处理WM_KEYDOWN消息,直接break,处理WM_CHAR消息
	////////////////////////////////////////////////
	case WM_KEYDOWN:
		//如果按下键盘左方向键,就相当于是VB_BACK,减去最后一位
		if(wParam!=VK_LEFT)
			break;
		wParam=VK_BACK;
	//所有字符都先通过CharUpper转换成大写
	case WM_CHAR:
		//判断是不是回车
		if((wParam=(WPARAM)CharUpper((TCHAR*)wParam))==VK_RETURN)
			wParam='=';
		//通过键盘按键来判断是哪一个,来实现相应的动画效果
		//如无相对应的,则发出警告
		if(hButton=GetDlgItem(hwnd,wParam))
		{
			SendMessage(hButton,BM_SETSTATE,1,0);
			Sleep(100);
			SendMessage(hButton,BM_SETSTATE,0,0);
		}
		else
		{
			MessageBeep(0);
			break;
		}
	//上面的键盘按键会把hwnd传递到下面
	//下面就是鼠标点击的实现了
	case WM_COMMAND:
		//设置焦点
		SetFocus(hwnd);
		//BACK的处理
		if(LOWORD(wParam)==VK_BACK)
			//十六进制的,就要除以16
			ShowNumber(hwnd,iNumber/=16);
		//Equals的处理
		else if(LOWORD(wParam)==VK_ESCAPE)
			ShowNumber(hwnd,iNumber=0);
		//判断是不是数字
		else if(isxdigit(LOWORD(wParam)))
		{
			//判断是第几个数字
			if(bNewNumber)
			{
				iFirstNum=iNumber;
				iNumber=0;
			}
			bNewNumber=FALSE;
			//只做4位的处理?
			if(iNumber<=MAXDWORD>>4)
				ShowNumber(hwnd,iNumber=16*iNumber+wParam-(isdigit(wParam)? '0':'A'-10));
			else
				MessageBeep(0);
		}
		else
		{
			//输入的是第二个数字,就调用CalcIt来计算
			//不是的话,下面就是设置标志位,读入操作符
			if(!bNewNumber)
				ShowNumber(hwnd,iNumber=CalcIt(iFirstNum,iOperation,iNumber));
			bNewNumber=TRUE;
			iOperation=LOWORD(wParam);
		}
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd,message,wParam,lParam);
}

第一次直接在WinMain中调用对话框,这种方式以后应该会经常用到的,处理方式会在以后经常用到。

完成了这个了,今天其它事情就是做个小程序,测试一下昨天到的三个摄像头能否同时工作,图像处理啊~~~~。

最近学了Windows程序了,直接用Windows API来实现,不再用那繁琐的MFC了,还是喜欢自己能把控的代码。


你可能感兴趣的:(windows,null,callback,include,图像处理,winapi)